我正在实现一个朴素的贝叶斯垃圾邮件检测器,其中的特征是文字,我不确定我是否理解正确的算法还。
这就是我如何实现算法的方法:
在培训集中,我计算来自文本的特定单词在垃圾文本中出现的频率以及它在非垃圾文本中出现的频率。我还存储了在培训期间检查的垃圾邮件和非垃圾邮件的总数。
现在,训练结束后,假设我有一个新的文本T,我想分类。
我首先假设垃圾邮件(S)和非垃圾邮件(N)的先验概率为:
P(S) = 0.5
P(N) = 0.5现在我检查包含在W中的每个单词T
假设一个单词W在垃圾文本中出现了20次,在非垃圾文本中出现了2次。检查的垃圾邮件总数是50,非垃圾邮件检查的总数也是50,所以我有后验概率:
P(W|S) = 20 / 50
P(W|N) = 2 / 50然后计算出的概率是
P(S|W) = P(W|S) * P(S) = 0.2
P(N|W) = P(W|N) * P(N) = 0.02由此,算法将文本分类为垃圾邮件。
我很难理解的是以下情况:
假设我们有一个单词W,它在垃圾文本中出现0次,在非垃圾文本中出现1次。在这种情况下,垃圾邮件的后验概率应该是
P(W|S) = O / 50 = 0因此,整个概率也是0。
因此,这意味着,当一个单词出现在一个文本中,而这个文本从未在垃圾文本中发现,但是在一个非垃圾文本中,算法将文本分类为非垃圾文本,而不考虑任何其他单词和先前的概率。
这就是让我困惑的地方,让我觉得我还没有正确理解算法。
发布于 2016-01-29 15:51:15
你必须实现加性平滑,以考虑到非字典词。
这种加性平滑将使字典P(W\\S)中不属于字典的单词的概率大于0。
这是可能性的修正公式:
P(word|class) = sum ( I(word,D) + lambda) / |D_class| + lambda|V| ) on each document D belonging to all documents in the class.其中,I(word,document)是指示函数,如果文档包含单词,则返回1,否则返回0。
lambda是一个选定的常数
|D_class|是类中的文档数。
|V|是词典或词汇表中的单词数。
https://stackoverflow.com/questions/35088348
复制相似问题