gpt4 book ai didi

python - 实现朴素贝叶斯文本分类,但我总是得到零

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:22 27 4
gpt4 key购买 nike

我正在使用朴素贝叶斯进行文本分类,这就是我为指定类别中的每个术语创建初始权重的方式:

  • term1:term 1 出现的次数/categoryA 中文档的数量
  • term2:term 2 出现的次数/categoryA 中文档的数量
  • term3:term 3存在的次数/categoryA中的文档数

  • term1:term 1存在的次数/categoryB中的文档数

  • term2:term 2出现的次数/类别B中文档的数量
  • term3:term 3 出现的次数/categoryB 中文档的数量

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

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

  • term1:存在于测试文档中,所以我对 categoryB_term1 使用与上面相同的权重

  • term2:在测试文档中不存在,所以我对 categoryB_term2 使用 1-weight
  • term3:存在于测试文档中,所以我对 categoryB_term2 使用与上面相同的权重

然后我将每个类别的权重相乘。当我创建一个句子的虚拟训练/测试文档时,这是有效的,但是当我为训练/测试文档实现真实文档时,当我将它们组合在一起时,我总是得到零。这是因为概率太小了,乘以这么多小数后,python 就收敛到零了吗??我被困住了,一直遇到同样的零问题 :( 非常感谢您的帮助!

最佳答案

正如 Ed Cottrell 评论的那样,您需要考虑如果遇到某个类别的文档中没有的词会发生什么。您可以使用 Laplace smoothing 避免乘以 0 .如果你在一个类别的 n 个文档中看到 k 个词,你可以将条件概率 (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。如有必要,您可以在之后取幂,但通常您只是将决策阈值转换为对数条件。

关于python - 实现朴素贝叶斯文本分类,但我总是得到零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com