因为涉及到概率论,我实在是一脸懵逼,就以垃圾邮件分类来说明朴素贝叶斯怎么做。
输入:
一系列邮件及其标签——{(x1,y1),(x2,y2),⋯ ,(xN,yN)}\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}{(x1,y1),(x2,y2),⋯,(xN,yN)},其中邮件xi=(wi1,wi2,⋯ ,win)Tx_i=(w_{i1},w_{i2},\cdots,w_{in})^Txi=(wi1,wi2,⋯,win)T,那么邮件的特征wijw_{ij}wij就是文章中的特征单词(假设是英文邮件),yi∈{C1,C2}y_i\in\{C_1,C_2\}yi∈{C1,C2}表示邮件类别,C1C_1C1 表示垃圾邮件,C2C_2C2 表示不是垃圾邮件
输出:
xix_ixi 的类别,其中 i=1,2,⋯ ,Ni=1,2,\cdots,Ni=1,2,⋯,N
假设前提:
- 输入数据每个特征维度是离散的
- 输入数据每个特征维度相互独立
学习:
如何得到xix_ixi 的类别?其实就是判断P(Y=C1∣X=xi)P(Y=C_1|X=x_i)P(Y=C1∣X=xi)与P(Y=C2∣X=xi)P(Y=C_2|X=x_i)P(Y=C2∣X=xi)的大小,其中i=1,2,⋯ ,Ni=1,2,\cdots,Ni=1,2,⋯,N。 根据贝叶斯公式,可以得到:P(Y=C1∣X=xi)=P(X=xi,Y=C1)P(X=xi)=P(X=xi∣Y=C1)P(Y=C1)P(X=xi)P(Y=C2∣X=xi)=P(X=xi,Y=C2)P(X=xi)=P(X=xi∣Y=C2)P(Y=C2)P(X=xi)\begin{aligned}
P(Y=C_1|X=x_i)=\frac{P(X=x_i,Y=C_1)}{P(X=x_i)}=\frac{P(X=x_i|Y=C_1)P(Y=C_1)}{P(X=x_i)} \\ \\
P(Y=C_2|X=x_i)=\frac{P(X=x_i,Y=C_2)}{P(X=x_i)}=\frac{P(X=x_i|Y=C_2)P(Y=C_2)}{P(X=x_i)}
\end{aligned}P(Y=C1∣X=xi)=P(X=xi)P(X=xi,Y=C1)=P(X=xi)P(X=xi∣Y=C1)P(Y=C1)P(Y=C2∣X=xi)=P(X=xi)P(X=xi,Y=C2)=P(X=xi)P(X=xi∣Y=C2)P(Y=C2)
所以我们的目标转化为比较P(X=xi∣Y=C1)P(Y=C1)P(X=x_i|Y=C_1)P(Y=C_1)P(X=xi∣Y=C1)P(Y=C1)与P(X=xi∣Y=C2)P(Y=C2)P(X=x_i|Y=C_2)P(Y=C_2)P(X=xi∣Y=C2)P(Y=C2)的大小,其中
P(X=xi∣Y=Ck)=P(X1=wi1,X2=wi2,⋯ ,Xn=win∣Y=Ck)=∏j=1nP(Xj=wij∣Y=Ck)(相互独立)\begin{aligned}
P(X=x_i|Y=C_k)=&P(X_1=w_{i1},X_2=w_{i2},\cdots,X_n=w_{in}|Y=C_k)\\ \\
=&\prod_{j=1}^nP(X_j=w_{ij}|Y=C_k)\qquad(相互独立)
\end{aligned}P(X=xi∣Y=Ck)==P(X1=wi1,X2=wi2,⋯,Xn=win∣Y=Ck)j=1∏nP(Xj=wij∣Y=Ck)(相互独立)
垃圾邮件中,P(Xj=wij∣Y=Ck)P(X_j=w_{ij}|Y=C_k)P(Xj=wij∣Y=Ck)可以用简单的出现次数来计算,即
P(Xj=wij∣Y=Ck)=邮件xi中单词wij出现的次数样本中所有属于Ck的邮件中单词wij出现的总次数=count(wij,xi)count(wij,Ck)\begin{aligned}
P(X_j=w_{ij}|Y=C_k)=&\frac{邮件x_i中单词w_{ij}出现的次数}{样本中所有属于C_k的邮件中单词w_{ij}出现的总次数}\\\\=&\frac{count(w_{ij},x_i)}{count(w_{ij},C_k)}
\end{aligned}P(Xj=wij∣Y=Ck)==样本中所有属于Ck的邮件中单词wij出现的总次数邮件xi中单词wij出现的次数count(wij,Ck)count(wij,xi)但是这种计算会带来一个问题,要是训练样本中没有出现这个单词,而测试样本中有,则会导致分类错误,故可以对此稍加改进:P(Xj=wij∣Y=Ck)=count(wij,xi)+1count(wij,Ck)+count(Ck)\begin{aligned}
P(X_j=w_{ij}|Y=C_k)=\frac{count(w_{ij},x_i)+1}{count(w_{ij},C_k)+count(C_k)}
\end{aligned}P(Xj=wij∣Y=Ck)=count(wij,Ck)+count(Ck)count(wij,xi)+1其中 count(Ck)count(C_k)count(Ck) 表示属于 CkC_kCk 类的邮件中的总单词数。然后,我们可以算出先验概率:P(Ck)=样本中属于Ck的邮件数量样本总量P(C_k)=\frac{样本中属于C_k的邮件数量}{样本总量}P(Ck)=样本总量样本中属于Ck的邮件数量至此,我们可以得到:ifP(X=xi∣Y=C1)P(Y=C1)>P(X=xi∣Y=C2)P(Y=C2),xi∈C1ifP(X=xi∣Y=C1)P(Y=C1)<P(X=xi∣Y=C2)P(Y=C2),xi∈C2\begin{aligned}
if \quad P(X=x_i|Y=C_1)P(Y=C_1)>P(X=x_i|Y=C_2)P(Y=C_2),\quad x_i\in C_1\\\\
if \quad P(X=x_i|Y=C_1)P(Y=C_1)<P(X=x_i|Y=C_2)P(Y=C_2),\quad x_i\in C_2
\end{aligned}ifP(X=xi∣Y=C1)P(Y=C1)>P(X=xi∣Y=C2)P(Y=C2),xi∈C1ifP(X=xi∣Y=C1)P(Y=C1)<P(X=xi∣Y=C2)P(Y=C2),xi∈C2