如何使用J创建计算相关/相关矩阵的函数?

Siy*_* Gu 5 j

我已经编写了我自己的以下代码,它逐步计算相关/相关矩阵:

a=: 1 2 3
b=: 2 3 4
getmean=: +/%#
getmdevn=: -getmean
getvariance1=: (getmean@:*:)@getmdevn

getvariance1 a
getvariance1 b
corr_a_b=: getmean (a*b) - getmean a * getmean b
Run Code Online (Sandbox Code Playgroud)

使用单个函数计算J中相关/互连矩阵的最佳方法是什么?或者有没有办法将我的所有代码合并到一个函数中?

PS我刚刚在J中发现了一些像'numeric'这样的库.但是,似乎没有这些库在线的文档.有谁知道在哪里可以找到这些库的细节?

Dan*_*ron 9

出于实际目的,@ ElVex是正确的,你应该使用J附带的库,因为它们封装了JSoftware认为它的"最佳实践".

然而,出于教学,智力和美学的原因,我是Oleg Kobchenko的胜利的忠实粉丝:

 corr =: (+/@:* % *&(+/)&.:*:)&(- +/%#) 
Run Code Online (Sandbox Code Playgroud)

正如我在2013年提到的,它有J中所有主要成分的标本:

  • 叉子 f g h
  • f g
  • 在顶上 f@:g
  • 撰写 f&g
  • f&.:g

除了&恰好其中之一.对于一个非常真实,非常常见的计算.整齐!

而且,如果你能阅读J,它比标准的数学符号有明显的改进,因为你可以从字面上看到构成该公式的一些对称性:左边的叉是产品的总和(+/@:*),右边是产品的总和.sums(*&(+/)).

整个中叉是一只优雅的蝴蝶,有着美丽的对称翅膀(头上有天线%!).

   c=:+/@:* % *&(+/)

   5!:4<'c'
         +- / --- +
  +- @: -+- *      
  +- %             
--+      +- *      
  +- & --+- / --- +
Run Code Online (Sandbox Code Playgroud)

此外,整个事情是代数减少的.这也就意味着,相反,你必须将标准的数学符号X S和ÿ S和X秒和ȳ的疏散所有的地方,在corr很明显,我们做的第一件事情是规范变量,此后所有我们曾经处理的是三角洲,因此我们不受规模变化,测量单位等的影响.

作为J符号的另一个例子揭示了潜在的数学结构,Oleg进一步减少了一点,并削减了这个jem:

Cr=: +/@:*&(% +/&.:*:)&(- +/ % #)
Run Code Online (Sandbox Code Playgroud)

正如我后面在2013年的讨论中讨论的那样,我仍然更喜欢原版,因为它的结构对称性,但是这个版本也有它的优点:它清楚地表明,在一些标准化/标准化之后,相关性只是系列的线性组合.

sum             =:  +/         
of              =:  @          
the_product     =:  *          
after           =:  &          
scaling         =:  % +/&.:*:
after           =:  &          
standardizing   =:  - +/%#


corr =: sum of the_product after scaling after standardizing
Run Code Online (Sandbox Code Playgroud)

我们只是通过尝试不同的表达方式来深入了解数学!

但同样,出于实际目的,我建议你遵循@ EelVex的回答中的建议.正如亨利·里奇在Oleg发现这些美丽形式的线索中所观察到的:

不认为这些形式中的任何一种对实际工作都有用,因为它们涉及减去大的近似相等的数字,但我通过编写它来学习计算的一些东西.

然后,Oleg具体地说明了这一点:

运行维基百科稳定性测试很容易看到:

   CR=: (+/@:* % *&(+/)&.:*:)&(- +/ % #)

  0j20":CR/900000000(+,:-)1+i.1000000
_1.00000000000000000000

  COR f.
(+/ % #)@:*&(- (+/ % #)) % *&(%:@(+/ % #)@:*:@:- (+/ % #))

  0j20":COR/900000000(+,:-)1+i.1000000
_1.00000000000000000000

  0j20":c/900000000(+,:-)1+i.1000000
1.00000229430253350000

  load'stats'
  0j20":corr/900000000(+,:-)1+i.1000000
_0.99999999999619615000
Run Code Online (Sandbox Code Playgroud)

但是,那不是重点.最终,我认为June Kim在2007年总结得最好:

当我尝试将数学表达式转换为J表达式时,我常常非常高兴地发现表达式中隐藏的模式.

它有时会引导我走向新的见解.


Eel*_*vex 7

您的代码很好,实际上非常类似于'stats'库中定义的代码.

load'stats'
varp a               NB. variance of population a
  0.666667
a covp b             NB. covariance of a/b
  0.666667
Run Code Online (Sandbox Code Playgroud)

看一下统计库

我会写你的corr_a_b二元函数:

 corr_a_b =: ((getmean @: *) - (* &: getmean))
Run Code Online (Sandbox Code Playgroud)