如何使用 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
我会把你的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 和 x̄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.
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.
我已经自己写了下面的代码,一步步计算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
我会把你的corr_a_b
写成二元函数:
corr_a_b =: ((getmean @: *) - (* &: getmean))
出于实际目的,
但是,出于教学、智力和美学原因,我是 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 和 x̄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.
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.