gpt4 book ai didi

c - C中的精密浮点运算问题

转载 作者:太空狗 更新时间:2023-10-29 16:33:37 25 4
gpt4 key购买 nike

对于我的一个类(class)项目,我开始使用 C 实现“朴素贝叶斯分类器”。我的项目是使用大量训练数据实现文档分类器应用程序(尤其是垃圾邮件)。

现在由于 C 的数据类型的限制,我在实现算法时遇到了问题。

(这里给出了我使用的算法,http://en.wikipedia.org/wiki/Bayesian_spam_filtering)

问题陈述:该算法涉及获取文档中的每个词并计算它是垃圾词的概率。如果 p1, p2 p3 .... pn 是单词 1, 2, 3 ... n 的概率。 doc 是垃圾邮件的概率是使用

计算的

alt text

这里,概率值可以很容易地在 0.01 左右。因此,即使我使用数据类型“double”,我的计算也会被折腾。为了证实这一点,我编写了下面给出的示例代码。

#define PROBABILITY_OF_UNLIKELY_SPAM_WORD     (0.01)
#define PROBABILITY_OF_MOSTLY_SPAM_WORD (0.99)

int main()
{
int index;
long double numerator = 1.0;
long double denom1 = 1.0, denom2 = 1.0;
long double doc_spam_prob;

/* Simulating FEW unlikely spam words */
for(index = 0; index < 162; index++)
{
numerator = numerator*(long double)PROBABILITY_OF_UNLIKELY_SPAM_WORD;
denom2 = denom2*(long double)PROBABILITY_OF_UNLIKELY_SPAM_WORD;
denom1 = denom1*(long double)(1 - PROBABILITY_OF_UNLIKELY_SPAM_WORD);
}
/* Simulating lot of mostly definite spam words */
for (index = 0; index < 1000; index++)
{
numerator = numerator*(long double)PROBABILITY_OF_MOSTLY_SPAM_WORD;
denom2 = denom2*(long double)PROBABILITY_OF_MOSTLY_SPAM_WORD;
denom1 = denom1*(long double)(1- PROBABILITY_OF_MOSTLY_SPAM_WORD);
}
doc_spam_prob= (numerator/(denom1+denom2));
return 0;
}

我尝试了 Float、double 甚至 long double 数据类型,但仍然存在同样的问题。

因此,假设在我正在分析的 100K 字的文档中,如果只有 162 个词具有 1% 的垃圾邮件概率,而其余 99838 个明显是垃圾邮件词,那么我的应用程序仍然会因为精度错误而将其说成“非垃圾邮件文档”(如分子很容易变为零)!!!。

这是我第一次遇到这样的问题。那么究竟应该如何解决这个问题呢?

最佳答案

这在机器学习中经常发生。 AFAIK,对于精度损失您无能为力。因此,为了绕过这一点,我们使用 log 函数并将除法和乘法分别转换为减法和加法。

所以我决定算一下,

原方程为:

Problem

我稍微修改了一下:

enter image description here

两边取日志:

enter image description here

让,

enter image description here

替换,

enter image description here

因此计算组合概率的替代公式:

enter image description here

如果您需要我对此进行扩展,请发表评论。

关于c - C中的精密浮点运算问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691021/

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