1

我正在尝试了解基于贝叶斯的垃圾邮件检测,但很难理解如何对其进行编码。为了理解它,我正在阅读 SpamAssassin 的代码,如下所示。 http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Bayes/CombineChi.pm?view=markup

但是,我无法理解 chi2q 的功能。

# Chi-squared function (API changed; see comment above)
107 sub chi2q {
108   my ($x2, $halfv) = @_;    
109 
110   my $m = $x2 / 2.0;
111   my ($sum, $term);
112   $sum = $term = exp(0 - $m);
113   
114   # replace 'for my $i (1 .. (($v/2)-1))' idiom, which creates a temp
115   # array, with a plain C-style for loop
116   my $i;
117   for ($i = 1; $i < $halfv; $i++) {
118     $term *= $m / $i;
119     $sum += $term;
120   }
121   return $sum < 1.0 ? $sum : 1.0;
122 }

我试图谷歌或阅读书籍,但找不到完整的解释,包括从理论到代码。

你能解释一下它为什么起作用吗?

4

1 回答 1

1

卡方检验可以判断两组数字是否“相似”

我可以通过谷歌搜索快速找到的最佳解释在这里http://formulas.tutorvista.com/math/chi-square-formula.html

这涉及找到观察值和预期值之间的差异。或不同条件下的值。然后将差值平方。平方它有两个效果,平方数变为正数,并且任何差异都会被强调。

然后将所有通过这种差异和平方运算找到的数字相加,这就是一个数字。将观察中的数字与“自由度”一起在表格上进行比较,以找到“p值”或结果偶然发生的概率

它允许在两组值上进行相似性匹配,但它们并不完全相同

我相信您可以想象这种比较对于检测垃圾邮件有多么有用

您的代码示例似乎没有这样做,所以我只能猜测在 spamassassin 代码库的其余部分中发生了其他计算

于 2013-11-26T11:31:57.433 回答