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

时间:2017-06-28 14:30:27

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

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

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

2 个答案:

答案 0 :(得分:9)

出于实际目的,@EelVex is right,你应该使用J附带的库,因为它们封装了JSoftware认为它的“最佳实践”。

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

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

作为I mentioned in 2013,它有J中所有主要成分的标本:

  • fork f g h
  • hook f g
  • atop f@:g
  • 撰写f&g
  • f&.:g

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

而且,如果你能阅读J,它比标准的数学符号有明显的改进,因为你可以从字面上看到一些对称作为该公式的基础:左边的齿是总和的product(+/@:*)和right是sums(*&(+/))的乘积。

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

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

   5!:4<'c'
         +- / --- +
  +- @: -+- *      
  +- %             
--+      +- *      
  +- & --+- / --- +

另外,整个事情是代数减少的。这意味着,与标准的数学符号相比,你有 x s和 y s和 s和ȳ< / em>散布在各地,corr很明显,我们做的第一件事是标准化变量,之后我们所处理的只是三角洲,所以我们不受规模变化的影响,计量单位等

作为J符号的另一个例子揭示了基础数学结构,Oleg took the reduction a step further,并切断了这个jem

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

正如我所讨论的later in the 2013 thread,我仍然更喜欢原版,因为它的结构 对称性,但这个版本也有它的优点:它清楚地表明,相关性只是系列的线性组合,经过一些 归一化/标准化

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


corr =: sum of the_product after scaling after standardizing

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

但是,再次,出于实际目的,我建议你按照@ EelVex的回答中的建议。作为Oleg发现这些美丽形式的线程中的Henry Rich observed

  

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

具体地Oleg then demonstrated

  

很容易看到正在运行the Wikipedia stability test

   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

但是,那不是重点。最终,我认为2007年是June Kim summed it up best

  

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

     

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

答案 1 :(得分:7)

您的代码很好,实际上与'stats'库中的定义非常相似。

load'stats'
varp a               NB. variance of population a
  0.666667
a covp b             NB. covariance of a/b
  0.666667

查看stats library

我会将你的corr_a_b写为二元函数:

 corr_a_b =: ((getmean @: *) - (* &: getmean))