J语言熵公式
Entropy formula in J language
我在玩 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
我的问题的重点不是 "how to compute entropy of probabilities in JS",而是 "why does the entropyWrong
above does what it does and why it's not the same as "它的内容”,它显然做了正确的事情。
entropyWrong 定义是您正在单子使用的钩子。
entropyWrong =: +/ (- * 2&^.)
如果 monadic hook 表示为 (u v) y
那么在你的情况下 +/
是 u 而 (- * 2&^.)
是 v; v 是叉子。 y 当然是 probs,名词参数。
J 将 monadic hook 的操作定义为等同于 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
并且正在获取分叉 v 的结果并将它们单次应用于动词 u
如果您想摆脱在熵中使用 @:
,可以使用动词 [:
来实现。当用作叉子的左齿时 [:
returns 没有结果,这会创建一个单中心齿而不是二元中心齿。
entropy2=: [: +/ (- * 2&^.) NB. with three verbs this is now a fork
probs =: 0.75 0.25
entropy2 probs
0.811278
我在玩 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
我的问题的重点不是 "how to compute entropy of probabilities in JS",而是 "why does the entropyWrong
above does what it does and why it's not the same as "它的内容”,它显然做了正确的事情。
entropyWrong 定义是您正在单子使用的钩子。
entropyWrong =: +/ (- * 2&^.)
如果 monadic hook 表示为 (u v) y
那么在你的情况下 +/
是 u 而 (- * 2&^.)
是 v; v 是叉子。 y 当然是 probs,名词参数。
J 将 monadic hook 的操作定义为等同于 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
并且正在获取分叉 v 的结果并将它们单次应用于动词 u
如果您想摆脱在熵中使用 @:
,可以使用动词 [:
来实现。当用作叉子的左齿时 [:
returns 没有结果,这会创建一个单中心齿而不是二元中心齿。
entropy2=: [: +/ (- * 2&^.) NB. with three verbs this is now a fork
probs =: 0.75 0.25
entropy2 probs
0.811278