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 yu 变成二元的,y 作为它的左参数,vy 作为它的右参数。这与 J 从右到左的执行顺序一致。
顺便说一下,fork 被定义为(f g h) yf、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)