朴素贝叶斯文本分类不正确的结果

Naive Bayes text classification incorrect results

我编写了一个朴素贝叶斯分类器,但它似乎工作得不是特别好。算字数等不是问题,概率一直是。

我一直在使用的方法从 this book 的第 180 页开始 但我会使用 wiki article 中的术语使其更通用。

培训

通过训练,我正在为类别中出现的每个单词创建一个概率:

for category in categories:
    for word in category_vocabulary[category]:
        word_probability[category][word] = (category_vocabulary[category][word] + 1) / (total_words_in_category[category] + len(vocabulary))

所以我得到一个词在一个类别中出现的总次数,加一,然后除以一个类别中的总词数,再加上词汇量(不同的词)。这是 P(xi|Ck)

我也计算了一个类别的概率p(Ck),category_probability,简单来说就是一个类别的词数除以所有类别的词数

for category in categories:
    category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())

分类

为了分类,我循环遍历待分类文档的所有标记,并计算文本中所有单词的word_probability的乘积。

for category in categories:
    if word in word_probability[category]:
        if final_probability[category] == 0:
            final_probability[category] = word_probability[category][word]
        else:
            final_probability[category] *= word_probability[category][word]

最后,为了计算分数,我将其乘以类别概率

score = category_probability[category] * final_probability[category]

这个分数似乎完全错误,我不知道该怎么办。当我查阅其他人的方法时,他们似乎涉及一些日志和指数,但我不确定它们如何适合这本书和维基文章。

任何帮助将不胜感激,因为我想我做错了什么对于更了解它的人来说是显而易见的。

This score seems to be completely wrong and I'm not sure what to do.

首先,类别概率不是通过类别中的单词占单词总数的比例来估计的

for category in categories:
    category_probability[category] = total_words_in_category[category] / sum(total_words_in_category.values())

但一个类别中 句子的数量 与句子总数(或段落、文档、对象 - 您正在分类的东西)的对比。于是

for category in categories:
    category_probability[category] = total_objects_in_category[category] / sum(total_objects_in_category.values())

When I've looked up other peoples methods they seem to involve a few logs and exponents but I'm not sure how they fit in with the book and wiki article.

这是因为直接概率计算(您所做的)数值不稳定。你最终会乘以很多小数字,因此精度会呈指数级下降。因此,我们使用了这个简单的数学等式:

PROD_i P(x) = exp [ log [ PROD_i P_i(x) ] ] = exp [ SUM_i log P_i(X) ]

因此,您存储概率的对数,而不是存储概率,而不是将它们相乘,而是将它们相加。如果你想恢复真实概率,你所要做的就是取 exp 值,但对于分类你不必这样做,因为 P(x) > P(y) <-> log P(x) > log P(y)