17.1_.jpg

 在我公众号的早期推文中,有一篇简单讨论过贝叶斯思想——《说说重要的贝叶斯公式吧》。这里,我主要想讲讲朴素贝叶斯思想。



现在我们仍以垃圾邮件的检测为例。假设记“一封邮件为垃圾邮件”为事件S,记“一封邮件中包含词语【中奖】”为事件B,那么根据前面提到的贝叶斯公式,我们可以写出一封邮件中包含词语【中奖】时为垃圾邮件的概率(这里用^代表非事件,用|代表条件概率):

P(S|B)=P(S,B)/P(B)=P(B|S)*P(S)/[P(B|S)*P(S)+P(B|^S)*P(^S)]


其中分母P(S,B)代表一封垃圾邮件并且其中包含词语【中奖】的概率,分母代表一封邮件中包含【中奖】词语的概率。因此,这个公式可以理解为求所有包含【中奖】词语的邮件中,垃圾邮件所占的比例。


那么如何利用上述公式求解具体问题呢?例如现在有一个包含垃圾邮件和非垃圾邮件的较大数据集(数据集越大,越具有统计一般性),经数据统计表明,垃圾邮件中包含词语【中奖】邮件的比例为0.6,而非垃圾邮件中包含词语【中奖】邮件的比例为0.05,同时,我们假设一封邮件为垃圾邮件或为非垃圾邮件的事件概率均为0.5。那么,我们就可以来计算P(S|B)的大小了:

P(S|B)=P(B|S)/[P(B|S)+P(B|^S)]=0.6/(0.6+0.05)=0.92


上面的例子是根据单一词语来判断是否为垃圾邮件,但是实际情况中,判断垃圾邮件的因素也许不止一个,这时候,多个因素的联合概率分析起来就会相当棘手,于是,为了简化问题,做了一个相当极端的假设,这个极端假设就是朴素贝叶斯思想的运用。


假设现在有一个词汇表,词汇表中包含很多词语,我们可以将这些词语记为w_1,w_2,w_3,...,w_n,把事件“一封垃圾邮件中包含词语w_n”记为事件E_n。


那么根据大的数据集,我们可以很容易统计出每个词语在垃圾邮件和非垃圾邮件中出现的概率,即假设P(E_i|S)和P(E_i|^S)已经求出来了。


这个时候,如何计算P(S|E=e)呢?我们知道P(S|E=e)=P(E=e|S)/[P(E=e|S)+P(E=e|^S)],但是这里的P(E=e|S)和P(E=e|^S)我们无法直接求,原因是e的取值有很多,所有它们二者均为联合概率分布,而我们已知的只是每个词语单独各自出现的概率。


既然无法直接求解,那么朴素贝叶斯思想就诞生了,我们运用朴素贝叶斯思想将复杂的联合概率公式转化为简单易求的单边概率公式的乘积。即:

P(E_1=e_1,...,E_n=e_n|S)=P(E_1=e_1|S)*...*P(E_n=e_n|S)



这样转化过后,只要我们预先知道了P(E_i|S)以及P(E_i|^S),我们就可以求出一封包含任意个单词的邮件为垃圾邮件的概率了。


不过仅仅按照朴素贝叶斯公式来操作在实际中也许会有较大漏洞,若收集的数据中所有垃圾邮件并不包含词汇表中的单词,也就是说P(E_i|S)=0对于任意i都成立。这样引发的后果是P(S|E=e)也恒为0,也就是说,即使新邮件中包含了很多词汇表中的单词,朴素贝叶斯公式始终判断其为非垃圾邮件。为了解决这个问题,通常我们可以在数据集中加入一定数量的虚拟计数k,即考虑每个单词在垃圾邮件中出现的次数加上一个虚拟计数k,用公式表示出来就是:

P(E_i|S)=(k+包含单词i的垃圾邮件数目)/(词汇总数目*k+邮件总数)



值得注意的一点是,在实际操作中,由于概率之间相乘比较麻烦,且容易引起浮点数向下溢出。所以为了避免这种情况,我们可以使用适当的缩放技巧,恰好自然对数运算具有缩放和化乘为加的优势,因此实际中常常是计算联合概率的对数,通过log(ab)=loga+logb来转换计算,最后再通过exp(logx)=x来把真实概率计算回来。
 
 
 
 
来源: 张泽旺 深度学习每日摘要
智造家