贝叶斯公式
全概公式
思路和实现
最终的目标:对于一封邮件,分词得到,我们需要求出给定的条件下,这封邮件是垃圾邮件的概率,即求出。这里s表示是垃圾邮件(spam)。
根据贝叶斯公式:
根据全概公式,上式,这里n表示是正常邮件(noraml)。
令先验概率,因此上式。
根据朴素贝叶斯的独立假设,上式,记为式1。
至此,我们很容易统计出和,比如全部的垃圾邮件共计1000封,其中出现800次,则。但是如果这样统计,由于词数量很多,代入式1后,就会有很多小于1的小数连乘,结果趋于零,无法计算。因此式1需要继续推导。
根据贝叶斯公式:,把这个带入到式1中,可以得到。
由于在出现的条件下,要么是垃圾邮件,要么不是垃圾邮件,即,则上式。
至此,我们只需要在训练集中统计出,然后对于被判定邮件的,取出最大的前若干个带入到上式即可进行判定是不是垃圾邮件了,这样解决了小数连乘趋于0的问题。
接下来看下如何统计。
上文已经介绍了如何统计出和,有了这两个,就可以计算了。
根据贝叶斯公式:
根据全概公式,上式。
至此,可以写代码统计出和,然后进行判定了。如果被判定的邮件中,有些词没有在训练集的垃圾邮件中出现。则令,同理,要是在训练集的正常邮件中没有出现,则令,如果两种邮件中都没出现过,则令。这些设定都是经验值。
代码实现和数据集
由于数据是中文的,因此用到了jieba分词模块,可以用pip install jieba安装。
https://github.com/zcsxll/bayesian_spam