Neu*_*onQ 2 hook fork entropy j
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
我的问题的重点不是“如何计算 JS 中的概率熵”,而是“为什么entropyWrong
上面的内容做了它所做的,为什么它与显然做正确的事情的“它的内容”不同。
entropyWrong 定义是您单次使用的钩子。
entropyWrong =: +/ (- * 2&^.)
Run Code Online (Sandbox Code Playgroud)
如果一个 monadic 钩子被表示为(u v) y
那么在你的情况下+/
是 u 并且(- * 2&^.)
是 v;v 是一个叉子。y 当然是 probs,名词参数。
J 将 monadic hook 的动作定义为等价于y u v y
u 变成二元的,y 作为它的左参数,vy 作为它的右参数。这与 J 从右到左的执行顺序一致。
顺便说一下,fork 被定义为(f g h) y
f、g 和 h 是动词,结果是(f y) g h y
。每个动词都可以描述为叉的一个齿,中间的 g 是二元的,而 f 和 h 是一元的,如果以一元方式应用叉子。
entropy =: +/ @: (- * 2&^.)
正在做不同的事情。熵是u @: v
形式化的,它采用分叉 v 的结果并将它们一元地应用于动词 u
如果你想摆脱@:
熵的使用,你可以通过使用动词来做到这一点[:
。当用作叉子的左齿时,[:
不会返回任何结果,这会创建一个单一的中心齿而不是二元的。
entropy2=: [: +/ (- * 2&^.) NB. with three verbs this is now a fork
probs =: 0.75 0.25
entropy2 probs
0.811278
Run Code Online (Sandbox Code Playgroud)