我已经编写了一个朴素贝叶斯分类器,但似乎效果不太好。词汇计数等方面没有问题,但概率计算出现了问题。
我使用的方法是从这本书的第180页开始的,但我会使用维基百科文章中的术语,使其更具通用性。
训练
在训练过程中,我为每个类别中的每个词创建一个概率:
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))
因此,我计算一个词在一个类别中出现的总次数,加上1,然后除以该类别中的总词数,再加上词汇表的大小(不同的词)。这是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]
这个得分似乎完全错误,我不知道该怎么办。当我查看其他人的方法时,他们似乎涉及一些对数和指数,但我不知道它们如何与书籍和维基百科文章相符。
任何帮助都将不胜感激,因为我认为我做错的地方对于更好理解它的人来说是相当明显的。
回答:
这个得分似乎完全错误,我不知道该怎么办。
首先,类别概率不是通过类别中词的比例与总词数来估计的
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())
当我查看其他人的方法时,他们似乎涉及一些对数和指数,但我不知道它们如何与书籍和维基百科文章相符。
这是因为直接概率计算(你所做的)是数值不稳定的。你将不得不乘以许多很小的数字,因此精度会呈指数下降。因此,人们使用这个简单的数学等式:
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)