繁体   English   中英

-Java中的无穷大值

[英]-Infinity values in Java

我正在尝试汇总561条日志。
它们看起来像这样:

-7.314254939475686
-7.656004233197743
-4.816276208120333
-8.426112454893817
-4.771824445549499
-9.34240318676797  

因此,它们不是很大的数字。 但是,当我继续对它们求和时,我得到以下信息:

-2668.179647264475
-2674.7747795369874
-2679.18920466334
-2683.9724816026214
-2690.3342661536453
-Infinity
-Infinity  

做到这一点的代码是:

double probspam=0;

for(int j=0;j<words.size();j++)
{
    probspam+= Math.log(spam.getClassProbability(words.get(j)));

}  

您是否有关于如何解决-Infinity问题以及为什么会发生的想法? 谢谢

对于某些值, spam.getClassProbability()返回0.0请参阅docs

如果参数为正零或负零,则结果为负无穷大。

MathJavadoc解释了为什么得到-Infinity的原因:

如果参数为正零或负零,则结果为负无穷大。

您应该检查您的值是否为零,或者在应用对log函数之前将其过滤掉。

spam.getClassProbability(words.get(j))的值很可能在某些时候为零。

Math.log(0.0)返回负无穷大(如API文档所述)。

您的垃圾邮件候选者之一从getClassProbability获得零:

System.out.println(Math.log(0));

输出:

-Infinity

这是一个特殊的保留双-Infinity值,对其进行的任何操作也会给出-Infinity ,因此一旦它达到零,您的求和变量将保持为-Infinity

要“修复”它,请执行以下操作:

double wordProbSpam = spam.getClassProbability(words.get(j));
probspam += wordProbSpam > 0 ? Math.log(wordProbSpam) : 0;

坦白说,我认为您的方法是有缺陷的。 我只是简单地将getClassProbability()的结果求和,而不是对它的log求和,因为对于0-1之间的数字,对数是负数,这将使总和变得很奇怪。

如果一个单词的类别概率为零,则将-Infinity加到和上。

我认为您已经对此提出了普遍质疑-您的对数为0.0。 即使您的getClassProbability()是完美的,但在数学上讲结果为非零时,数字下溢仍可能意味着其返回零。

一种选择是用Double.ulp(0.0)的值替换所有零。 这是Java可以表示的最小非零值(4.9e-324),对数约为-744.44。 这认识到零概率的破局概念。 毕竟,垃圾邮件发送者非常聪明,因此概率永远不会真正为零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM