C#中朴素贝叶斯概率的计算

时间:2013-07-19 07:46:11

标签: c# math machine-learning probability

我正在为C#开发Naive Bayes解决方案,其中有两种可能的结果。我找到了一个小样本代码,但想知道是否有人能够解释最后一行。

分析器发现一个单词属于两个类别中的一个

的概率

cat1count是在类别1中找到的单词数量(如果在类别1中找到2次单词,那么它将是2 /类别1中的单词总数)

cat1total =第1类中的总字数

据我了解,bw是该词在第1类中的概率,而gw是该词在第2类中的概率

pwfw是我开始有点迷失的地方。完整的源代码可以找到here

        float bw = cat1count / cat1total;
        float gw = cat2count / cat2total;
        float pw = ((bw) / ((bw) + (gw)));
        float
            s = 1f,
            x = .5f,
            n = cat1count + cat2count;
        float fw = ((s * x) + (n * pw)) / (s + n);

什么是fw?我了解bwgwpw是什么。

1 个答案:

答案 0 :(得分:1)

对于正在分析的文本(例如推文)中的每个特定单词w,一遍又一遍地调用此代码。所有变量都是使用频率估计的条件概率。

bw是单词w的概率,因为该单词是1类文本

gw是单词w的概率,因为该单词是第2类文本

pw重新调整概率bw,以便很少看到的单词与常见单词的比例相似(数学上,除法表示pw是条件概率)

fw只是简单地移动比例,以便pw不能为零(或一个)。例如,如果pw=0n=10fw = ((1 * 0.5) + (10 * 0)) / (1 + 10) = 0.045。 (一般来说,理解这段代码的一个好方法是使用一些不同的数字,看看会发生什么。)

在朴素贝叶斯中,你可能知道,条件概率是相乘的(在这种情况下通过你指向我的github Analyzer.cs file中的LogProbability函数),所以你遇到麻烦在乘法中的任何地方都有零条件概率,因为最终结果为零。因此,通常的做法是替换小数而不是零,这是fw的目的。