Xây dựng một bộ phân loại thư rác (spam) theo mô hình Naive Bayes (Bernoulli). Cho xác suất tiên nghiệm một email là spam là π=P(spam) (do đó P(ham)=1−π). Có V từ trong từ điển; với từ thứ i ta biết:
Một email mới được biểu diễn bằng vector nhị phân x1,…,xV (xi=1 nếu từ i xuất hiện trong email, ngược lại xi=0). Theo giả định "ngây thơ" (naive) về độc lập có điều kiện giữa các từ, ta có
P(spam∣x)∝π∏i=1V(pispam)xi(1−pispam)1−xi,P(ham∣x)∝(1−π)∏i=1V(piham)xi(1−piham)1−xi.
Hãy tính xác suất hậu nghiệm chuẩn hóa P(spam∣x) (sau khi chia cho tổng hai vế) và đưa ra nhãn dự đoán: spam nếu P(spam∣x)≥0.5, ngược lại ham.
Gợi ý cài đặt: để tránh tràn số khi V lớn, nên cộng dồn theo log rồi dùng kỹ thuật log-sum-exp khi chuẩn hóa, thay vì nhân trực tiếp nhiều số nhỏ.
Ví dụ: π=0.4, V=0 (không có từ nào, chỉ dựa vào tiên nghiệm) ⇒ P(spam∣x)=0.4<0.5, in ra ham 0.400000.
Dòng đầu tiên chứa số thực π và số nguyên V (0<π<1, 0≤V≤2000), cách nhau bởi khoảng trắng.
V dòng tiếp theo, dòng thứ i chứa hai số thực pispam piham (0<pispam<1, 0<piham<1).
Dòng cuối cùng (chỉ có nếu V>0) chứa V số nguyên x1,…,xV∈{0,1} — vector hiện diện từ của email cần phân loại.
In ra trên một dòng, cách nhau bởi một khoảng trắng: nhãn dự đoán (spam hoặc ham) và xác suất hậu nghiệm P(spam∣x) làm tròn tới đúng 6 chữ số thập phân. Ví dụ: spam 0.998321.
Ví dụ:
Đầu vào:
0.4 0
Đầu ra:
ham 0.400000
Đầu vào:
0.5 0
Đầu ra:
spam 0.500000
Đang tải editor...