J语言中的熵公式

时间:2017-01-31 06:40:26

标签: fork hook 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

我的问题不在于如何在JS"中计算概率的熵,但是"为什么上面的entropyWrong做它的作用以及为什么它& #39;与"它的内容不一样"这显然是正确的。

1 个答案:

答案 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