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

How to create a function calculating correlation/correlation matrix using J?

我已经自己写了下面的代码,一步步计算correlation/correlation矩阵:

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 中的 correlation/corellation 矩阵的最佳方法是什么?或者有什么办法可以将我所有的代码合并到一个函数中吗?

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

您的代码很好,实际上与 '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))

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

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

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

作为I mentioned in 2013,它有J:

中所有主要成分的标本
  • 分叉f g h
  • f g
  • f@:g
  • 撰写f&g
  • 低​​于 f&.:g

除了 & 之外,恰好每一个。对于一个很真实,很普通的计算。整洁!

而且,如果您能读懂 J,这将是对标准数学符号的明显改进,因为您可以从字面上看到构成该公式基础的一些对称性:左齿是乘积 (+/@:*) 的总和,right 是总和 (*&(+/)) 的乘积。

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

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

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

再加上整个事情都是代数减少的。这意味着,与标准数学符号相比,你有 xs 和 ys 和 s 和 ȳs 散布在各处,在 corr 中很明显,我们做的第一件事就是标准化变量,此后我们所处理的就是delta,所以我们不受尺度、测量单位等变化的影响。

作为进一步阐明基础数学结构的 J 符号示例,Oleg took the reduction a step further, and cut this jem:

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

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

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


corr =: sum of the_product after scaling after standardizing

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

但再次强调,出于实用目的,我建议您遵循@EelVex 回答中的建议。正如 Oleg 发现这些美丽形式的帖子中的 Henry Rich observed

I don't think either of these forms is useful for real work, since they involve subtracting big near-equal numbers, but I learned something about the computation by writing them.

具体是Oleg then demonstrated

That is easily seen running 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

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

While I try to translate a mathematical expression into a J expression, I often discover hidden patterns in the expression with great joy.

It sometimes leads me to a path to new insights.