我已经自己编写了以下代码,它逐步计算相关/相关矩阵:
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'这样的库。但是,似乎没有这些库在线的文档。有谁知道在哪里可以找到这些库的细节?
答案 0 :(得分:9)
出于实际目的,@EelVex is right,你应该使用J附带的库,因为它们封装了JSoftware认为它的“最佳实践”。
然而,出于教学,智力和美学的原因,我是Oleg Kobchenko's triumph的忠实粉丝:
corr =: (+/@:* % *&(+/)&.:*:)&(- +/%#)
作为I mentioned in 2013,它有J中所有主要成分的标本:
f g h
f g
f@:g
f&g
f&.:g
下除了&
之外,恰好是其中之一。对于一个非常真实,非常常见的计算。整齐!
而且,如果你能阅读J,它比标准的数学符号有明显的改进,因为你可以从字面上看到一些对称作为该公式的基础:左边的齿是总和的product(+/@:*
)和right是sums(*&(+/)
)的乘积。
整个中叉是一只优雅的蝴蝶,有着美丽的对称翅膀(头上有天线%
!)。
c=:+/@:* % *&(+/)
5!:4<'c'
+- / --- +
+- @: -+- *
+- %
--+ +- *
+- & --+- / --- +
另外,整个事情是代数减少的。这意味着,与标准的数学符号相比,你有 x s和 y s和x̄ 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:
我不认为这些形式对实际工作有用,因为它们涉及减去大的近似相等的数字,但是我通过编写来学习计算的东西强>
很容易看到正在运行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
我会将你的corr_a_b
写为二元函数:
corr_a_b =: ((getmean @: *) - (* &: getmean))