我使用朴素贝叶斯进行文本分类--这是我如何为指定类别中的每个术语创建初始权重:
对于新的测试文档,我根据测试文档中是否存在该术语来调整权重:
然后我把每个类别的权重相乘。当我创建一个句子的虚拟火车/测试文档时,这是有效的,但是当我为火车/测试文档实现真正的文档时,当我将所有的文档组合在一起时,我就会得到零。这是因为这些概率太小了,以至于在乘以这么多的小数字之后,python就会收敛到0??我被困住了,我总是遇到同样的零问题:(我真的很感谢你的帮助!
发布于 2015-05-23 17:57:39
正如encounter评论的那样,如果遇到一个不在类别中的文档中的单词,您需要考虑会发生什么。通过使用拉普拉斯平滑,可以避免乘以0。如果您在一个类别中看到n个文档中的一个单词,就会将条件概率(k+1)/(n+2)或(k+a)/(n+2a)指定给该类别。
计算乘积的对数是标准的,而不是取许多小数的乘积。
log x*y = log x + log y
log(P(a0|c) * P(a1|c) * ... * P(ak|c))
= log P(a0|c) + log P(a1|c) + ... + log P(ak|c)
那么你就有一个不那么小的数字之和。避免使用log 0。如果有必要的话,你可以在事后进行指数运算,但是通常你只是把你的决策阈值转化为对数上的一个条件。
https://stackoverflow.com/questions/30415636
复制相似问题