首页 文章

J语言中的熵公式

提问于
浏览
2

我试图从概率列表中创建一个用于计算熵的动词(事件的结果,公式在python / pesudocode中会是这样的: -sum([p*log(p,2) for p in ps]) ) .

我尝试使用合成( @: )的版本可以工作,但基于钩子和叉子的版本似乎正在做其他事情,我关心 why it's doing 它做了什么 . 我正在尝试使用钩子和叉子,这个案例确实证明了我的直觉是错误的 .

这是代码:

probs =: 0.75 0.25    NB. probabilties
   entropy =: +/ @: (- * 2&^.)
   entropyWrong =: +/ (- * 2&^.)
   entropy probs         NB. this is correct
0.811278
   entropyWrong probs    NB. this is wrong!
 1.06128 1.25
0.561278 0.75
   NB. shouldn't the following be the same as above (wrong)?
   +/ (- * 2&^.) probs
0.811278

我的问题的重点不是"how to compute entropy of probabilities in JS",而是“为什么上面的 entropyWrong 做它的作用以及为什么它与"it's content"不一样,它显然是正确的 .

1 回答

  • 4

    entropyWrong定义是您正在使用的钩子 .

    entropyWrong =: +/ (- * 2&^.)
    

    如果一个monadic钩子被表示为 (u v) y 那么在你的情况下 +/ 是你和 (- * 2&^.) 是v; v是一个分叉 . 当然是probs,名词参数 .

    J将monadic钩子的动作定义为等同于 y u v y ,因此u变为二元,y为左参数,v y为右参数 . 这与J的左右执行顺序一致 .

    顺便说一句,forks被定义为 (f g h) y ,其中f,g和h是动词,结果是 (f y) g h y . 每个动词都可以被描述为叉子的叉齿,而中间齿g是二元的,而f和h是monadic,如果是一个叉子,如果单独应用 .

    entropy =: +/ @: (- * 2&^.) 正在做些不同的事情 . 熵的形式为 u @: v 并且正在获取fork v的结果并将它们单独应用于动词u

    如果你想摆脱在熵中使用 @: ,你可以使用动词 [: 来做到这一点 . 当用作fork的左叉时 [: 不返回任何结果,这会创建一个monadic中心叉而不是二元叉 .

    entropy2=: [: +/ (- * 2&^.) NB. with three verbs this is now a fork
       probs =: 0.75 0.25
       entropy2 probs
    0.811278
    

相关问题