我编写了朴素贝叶斯分类器,但它似乎并没有起到特别好的作用。计算单词等不是问题,但概率已经存在。
我使用的方法从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]
这个分数似乎完全错误,我不知道该怎么做。当我查找其他人的方法时,他们似乎涉及一些日志和指数,但我不确定他们如何适应这本书和维基文章。
任何帮助都会非常感激,因为我想象我做错了什么对于那些更了解它的人来说有点明显。
答案 0 :(得分:1)
这个分数似乎完全错了,我不知道该怎么做。
首先,类别概率不是通过类别中的单词与单词总数的比例来估计的
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)