Julia 《朱莉娅》中的皮尔逊r

Julia 《朱莉娅》中的皮尔逊r,julia,Julia,我无法在Julia中找到一个已经生成的函数来计算Pearson的r,所以我尝试自己生成它,但我遇到了麻烦 代码: r(x,y) = (sum(x*y) - (sum(x)*sum(y))/length(x))/sqrt((sum(x^2)-(sum(x)^2)/length(x))*(sum(y^2)-(sum(y)^2)/length(x))) 如果我尝试在两个阵列上运行此操作: b = [4,8,12,16,20,24,28] q = [5,10,15,20,25,30,35] 我得到以

我无法在Julia中找到一个已经生成的函数来计算Pearson的r,所以我尝试自己生成它,但我遇到了麻烦

代码:

r(x,y) = (sum(x*y) - (sum(x)*sum(y))/length(x))/sqrt((sum(x^2)-(sum(x)^2)/length(x))*(sum(y^2)-(sum(y)^2)/length(x)))
如果我尝试在两个阵列上运行此操作:

b = [4,8,12,16,20,24,28]
q = [5,10,15,20,25,30,35]
我得到以下错误:

ERROR: `*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})
in r at none:1

您的函数尝试将两个列向量相乘。您将需要反转转置其中一个。考虑:

> [1,2]*[3,4]
ERROR: `*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})
但是:

以及:


您的函数尝试将两个列向量相乘。您将需要反转转置其中一个。考虑:

> [1,2]*[3,4]
ERROR: `*` has no method matching *(::Array{Int64,1}, ::Array{Int64,1})
但是:

以及:


Pearson's r在Julia中的版本为:

当您在Julia中查找函数时,该函数非常有用:

julia> apropos("pearson")
Base.cov(v1[, v2][, vardim=1, corrected=true, mean=nothing])
Base.cor(v1[, v2][, vardim=1, mean=nothing])
您在定义中遇到的问题是元素乘法/幂运算和矩阵乘法/幂运算之间的区别。为了按照您的意愿使用elementwise行为,您需要。*和。^:

只有这三个变化,您的r定义似乎与Julia的cor在几个ULP内匹配:

julia> cor(b,q)
1.0

julia> x,y = randn(10),randn(10)
([-0.2384626335813905,0.0793838075714518,2.395918475924737,-1.6271954454542266,-0.7001484742860653,-0.33511064476423336,-1.5419149314518956,-0.8284664940238087,-0.6136547926069563,-0.1723749334766532],[0.08581770755520171,2.208288163473674,-0.5603452667737798,-3.0599443201343854,0.585509815026569,0.3876891298047877,-0.8368409374755644,1.672421071281691,0.19652240951291933,0.9838306761261647])

julia> r(x,y)
0.23514468093214283

julia> cor(x,y)
0.23514468093214275

Julia的这是零均值实现——调用cor首先减去均值,然后调用corzm,这意味着更少的分配和更好的性能。我不能说数字的精确性。

皮尔逊的r在Julia中可用,如下所示:

当您在Julia中查找函数时,该函数非常有用:

julia> apropos("pearson")
Base.cov(v1[, v2][, vardim=1, corrected=true, mean=nothing])
Base.cor(v1[, v2][, vardim=1, mean=nothing])
您在定义中遇到的问题是元素乘法/幂运算和矩阵乘法/幂运算之间的区别。为了按照您的意愿使用elementwise行为,您需要。*和。^:

只有这三个变化,您的r定义似乎与Julia的cor在几个ULP内匹配:

julia> cor(b,q)
1.0

julia> x,y = randn(10),randn(10)
([-0.2384626335813905,0.0793838075714518,2.395918475924737,-1.6271954454542266,-0.7001484742860653,-0.33511064476423336,-1.5419149314518956,-0.8284664940238087,-0.6136547926069563,-0.1723749334766532],[0.08581770755520171,2.208288163473674,-0.5603452667737798,-3.0599443201343854,0.585509815026569,0.3876891298047877,-0.8368409374755644,1.672421071281691,0.19652240951291933,0.9838306761261647])

julia> r(x,y)
0.23514468093214283

julia> cor(x,y)
0.23514468093214275

Julia的这是零均值实现——调用cor首先减去均值,然后调用corzm,这意味着更少的分配和更好的性能。我不能说数字的准确性。

让我补充一点,同样的问题在向量平方时也会出现。sumx^2可能应该是sumx.^2,它将对x向量的每个元素求平方,然后对所有平方元素求和。这里需要的术语是转置而不是反转。我还要补充一点,当对向量进行平方运算时,也会出现同样的问题。sumx^2应该是sumx.^2,它将对x向量的每个元素进行平方运算,然后对所有平方元素求和。这里需要的术语是转置,而不是反转。
julia> cor(b,q)
1.0

julia> x,y = randn(10),randn(10)
([-0.2384626335813905,0.0793838075714518,2.395918475924737,-1.6271954454542266,-0.7001484742860653,-0.33511064476423336,-1.5419149314518956,-0.8284664940238087,-0.6136547926069563,-0.1723749334766532],[0.08581770755520171,2.208288163473674,-0.5603452667737798,-3.0599443201343854,0.585509815026569,0.3876891298047877,-0.8368409374755644,1.672421071281691,0.19652240951291933,0.9838306761261647])

julia> r(x,y)
0.23514468093214283

julia> cor(x,y)
0.23514468093214275