朴素的贝叶斯和零频率问题

Sci*_*ion 6 algorithm machine-learning spam-prevention bayesian

我想我已经正确实施了大部分内容.一部分让我困惑:

零频率问题:当每个类值没有出现属性值时,为每个属性值类组合(拉普拉斯估计器)的计数加1.

这是我的一些客户端代码:

//Clasify
string text = "Claim your free Macbook now!";
double posteriorProbSpam = classifier.Classify(text, "spam");
Console.WriteLine("-------------------------");
double posteriorProbHam = classifier.Classify(text, "ham");
Run Code Online (Sandbox Code Playgroud)

现在说某些地方的训练数据中有"免费"这个词

//Training
classifier.Train("ham", "Attention: Collect your Macbook from store.");
*Lot more here*
classifier.Train("spam", "Free macbook offer expiring.");
Run Code Online (Sandbox Code Playgroud)

但是这个词出现在我的"垃圾邮件"类别的培训数据中,而不是"火腿".所以当我去计算posteriorProbHam时,当我遇到"免费"这个词时我该怎么办.

在此输入图像描述

Dou*_*gal 6

还是加一个.原因:朴素贝叶斯模型P("free" | spam)P("free" | ham)完全独立,所以你想要估计每个完全独立的概率.您正在使用的拉普拉斯估算器P("free" | spam)(count("free" | spam) + 1) / count(spam); P("ham" | spam)是一样的.

如果你想一想不添加它会是什么意思,那就没有意义了:在火腿上看一次"免费"会让垃圾邮件看起来"免费"的可能性降低.

  • 你的问题正在发生,因为你的分母是不正确的:如果你在所有的计数中加一,分母就是count(垃圾)+ v,你的词汇中有v个单词.不计算(垃圾邮件)+1,如下所示:如果这样做,所有单词的总和大于1.不会影响决定,但会破坏您尝试计算的任何概率 (3认同)