我正在使用GSL库1.14和ruby包装器(gsl)进行一些数学计算。我需要的一件事是Pearson相关性。但是当我的数组为0时,我遇到了问题。
例如,我有这段代码:
x = [1,2,2,2,12]
y = [1,2,1,3,33]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> 0.9967291641974002
但是当我尝试用以下数组值计算它时,我得到一个NaN:
x = [1,1,1]
y = [1,1,1]
or
x = [0,1,1]
y = [1,1,1]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> NaN
当我尝试使用这个值时,它可以工作:
x = [0,1,1]
y = [1,0,1]
puts GSL::Stats::correlation(
GSL::Vector.alloc(x),GSL::Vector.alloc(y)
)
=> -0.5
有人知道为什么吗?这很奇怪,不是吗?
答案 0 :(得分:2)
我不知道GSL实现,但一般来说,Pearson相关系数的计算涉及除以两个标准偏差,因此如果它们中的任何一个为0,则计算失败。如果所有向量元素相等,则标准偏差为0。所有失败的示例都有一个具有相同元素的向量。我希望这能回答你的问题。
答案 1 :(得分:0)
理论上的相关意味着找到两个数据集之间的关系。取决于数据集的模式,它可以是正数或负数。但我想传达的是当你将0作为数据集的一个元素时,你不能将数量0与其他数据集的其他非零元素相关联。这就是它给NaN的原因。