首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现朴素贝叶斯文本分类但我一直得到零

实现朴素贝叶斯文本分类但我一直得到零
EN

Stack Overflow用户
提问于 2015-05-23 17:28:44
回答 1查看 367关注 0票数 1

我使用朴素贝叶斯进行文本分类--这是我如何为指定类别中的每个术语创建初始权重:

  • 术语1: categoryA中存在第1项的次数/文档数
  • 术语2:第2项存在的次数/ categoryA中的文档数
  • 术语3: categoryA中存在第3项的次数/文档数
  • 术语1: categoryB中存在第1项的次数/文档数
  • 术语2:第2项存在的次数/ categoryB中的文档数
  • 术语3: categoryB中存在第3项的次数/文档数

对于新的测试文档,我根据测试文档中是否存在该术语来调整权重:

  • term1:存在于测试文档中,因此我对categoryA_term1使用与上面相同的权重
  • term2:在测试文档中不存在,所以我对categoryA_term2使用1-权重。
  • term3:在测试文档中不存在,所以我对categoryA_term3使用1-权重。
  • term1:存在于测试文档中,因此我对categoryB_term1使用与上面相同的权重
  • term2:在测试文档中不存在,所以我对categoryB_term2使用1-权重。
  • term3:存在于测试文档中,因此我对categoryB_term2使用与上面相同的权重

然后我把每个类别的权重相乘。当我创建一个句子的虚拟火车/测试文档时,这是有效的,但是当我为火车/测试文档实现真正的文档时,当我将所有的文档组合在一起时,我就会得到零。这是因为这些概率太小了,以至于在乘以这么多的小数字之后,python就会收敛到0??我被困住了,我总是遇到同样的零问题:(我真的很感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-23 17:57:39

正如encounter评论的那样,如果遇到一个不在类别中的文档中的单词,您需要考虑会发生什么。通过使用拉普拉斯平滑,可以避免乘以0。如果您在一个类别中看到n个文档中的一个单词,就会将条件概率(k+1)/(n+2)或(k+a)/(n+2a)指定给该类别。

计算乘积的对数是标准的,而不是取许多小数的乘积。

代码语言:javascript
运行
复制
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。如果有必要的话,你可以在事后进行指数运算,但是通常你只是把你的决策阈值转化为对数上的一个条件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30415636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档