[英]-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 :
如果参数为正零或负零,则结果为负无穷大。
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.