我正在实现一个朴素的bayes垃圾邮件探测器,其特点是文字,我不确定我是否正确理解算法。
这就是我试图实现算法的方式:
在训练集中,我计算一个文本中的特定单词出现在垃圾邮件文本中的频率,以及它出现在非垃圾邮件文本中的频率。我还存储了培训期间检查的垃圾邮件和非垃圾邮件的总量。
现在,在训练完成后,假设我有一个新的文本T要分类。
我首先假设垃圾邮件和非垃圾邮件的先前概率为:

P(S) = 0.5
P(N) = 0.5

现在我检查W中包含的每个单词T
假设一个单词W在垃圾邮件文本中出现20次,在非垃圾邮件文本中出现2次。检查的SPAM总数是50,检查的非SPAM总数也是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。
因此,这意味着当一个单词出现在一个从来没有在垃圾邮件文本中发现,但在一个非垃圾邮件文本中发现的文本时,算法会将文本分类为非垃圾邮件,而不考虑任何其他单词和先前的概率。
这就是让我困惑的地方,让我觉得我还没有正确理解算法。

最佳答案

必须实现相加平滑才能将非词典单词考虑在内。
这种加性平滑将使不属于词典的单词的概率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|是字典或词汇表中的单词数

关于algorithm - 使用朴素贝叶斯检测垃圾邮件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35088348/

10-12 18:49