Typescript中数组的Shannon熵

时间:2018-06-29 15:28:27

标签: typescript machine-learning

我正在尝试在打字稿中找到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

我在做什么错了?

1 个答案:

答案 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

正如您所看到的,这本质上是同一件事(任何差异都是由于数值精度问题造成的。)

希望有所帮助;祝你好运!