我正在尝试在Typescript中计算香农熵:
我目前的代码如下:
val =[0.5035203893575573, 0.4964796106424427]shannonEntropy(val){ let temp, temp2; temp = -(val[0] * Math.log(val[0])) temp2 = -(val[1] * Math.log(val[1])) return temp+temp2; }
它返回0.693122394072697;应该返回0.999964
我哪里做错了?
回答:
啊,你的问题在于你需要使用数字的以2为底的对数,而不是自然对数。自从ES2015以来,JavaScript内置了一个函数Math.log2()
,你可以使用它:
const val =[0.5035203893575573, 0.4964796106424427]const shannonEntropy = (val: number[]) => val.map(v => -v * Math.log2(v)).reduce((x, y) => x + y, 0);console.log(shannonEntropy(val)); // 0.9999642406577658
或者,如果你需要保持ES5兼容性,你可以使用自然对数并将结果乘以Math.LOG2E
:
const val =[0.5035203893575573, 0.4964796106424427]const shannonEntropy = (val: number[]) => val.map(v => -v * Math.log(v)).reduce((x, y) => x + y, 0)*Math.LOG2E;console.log(shannonEntropy(val)); // 0.9999642406577659
如你所见,这基本上是相同的结果(任何差异仅仅是由于数值精度问题)。
希望这对你有帮助;祝你好运!