J语言的熵公式

Neu*_*onQ 2 hook fork entropy j

我正在使用 J 编程语言,我尝试创建一个动词,用于从概率列表中计算熵(事件的结果,公式在 python/pesudocode: 中是这样的-sum([p*log(p,2) for p in ps]))。

我尝试使用组合 ( @:)的版本有效,但基于hook & fork 的版本似乎在做其他事情,我关心它为什么这样做。我正在尝试使用hookfork 进行工作,这个案例确实证明我的直觉是错误的。

这是代码:

   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上面的内容做了它所做的,为什么它与显然做正确的事情的“它的内容”不同。

bob*_*bob 5

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)

  • 没问题。+/ 的二元形式称为 Table,最好在 J 词典的词汇部分进行解释。http://www.jsoftware.com/help/dictionary/d420.htm 本质上,它采用左参数的每个项目(项目可能是也可能不是原子)并将它们应用于右参数的项目。J for C 程序员在讨论动词等级 http://www.jsoftware.com/help/jforc/loopless_code_i_verbs_have_r.htm 中有一个很好的部分关于这些事情 (2认同)