我正在尝试使用以下Java函数计算英语的熵
public static void calculateEntropy()
{
for(int i = 0; i < letterFrequencies[i]; i++)
{
entropy += letterFrequencies[i] * (Math.log(letterFrequencies[i])/Math.log(2));
}
entropy *= -1;
}
我使用的公式需要log base 2,但Java只有自然日志和日志库10.我正在尝试使用基本公式的更改来获取letterFrequencies [i]的日志库2。我不知道我是否正确实现它,因为我期待接近4.18的答案,而是大致得到.028
答案 0 :(得分:1)
问题出在for
停止条件:
i < letterFrequencies[i]
应为i < letterFrequencies.length
。
此外,我会使用Guava's DoubleMath.log2() method,这是根据@LutzL建议优化的。
答案 1 :(得分:-2)
数学上说实现是正确的,但它在代码中没有用。你可以编写自己的实现,显着加快运行速度:
public static int log2(int n){
if(n <= 0) throw new IllegalArgumentException();
return 31 - Integer.numberOfLeadingZeros(n);
}