我正在尝试使用J编程语言,并且我试图从概率列表中创建一个用于计算熵的动词(事件的结果,公式在python中就像这样) pesudocode:-sum([p*log(p,2) for p in ps])
)。
我尝试使用合成(@:
)的版本有效,但基于 hook & fork 似乎正在做其他事情,我关心为什么要做它做的事情。我试图与 hook 和 fork 一起工作,这个案例确实证明了我的直觉是错误的。
以下是代码:
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
我的问题不在于如何在JS"中计算概率的熵,但是"为什么上面的entropyWrong
做它的作用以及为什么它& #39;与"它的内容不一样"这显然是正确的。
答案 0 :(得分: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是一个叉子,如果是单独应用的话。
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