我试图从概率列表中创建一个用于计算熵的动词(事件的结果,公式在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 回答
entropyWrong定义是您正在使用的钩子 .
如果一个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中心叉而不是二元叉 .