我正在尝试在打字稿中找到Shannon entropy:
到目前为止,我的代码:
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
我在做什么错了?
答案 0 :(得分:2)
嗯,您的问题是您需要使用数字的base 2 logarithm而不是natural logarithm。由于ES2015具有内置功能Math.log2()
,您可以使用JavaScript:
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
正如您所看到的,这本质上是同一件事(任何差异都是由于数值精度问题造成的。)
希望有所帮助;祝你好运!