x=[0.3, 0.3, 0.3, ..., 0.3]
(0.3: 10)
y=x
x
和y
之间的线性相关系数是多少?
对于这个x
和y
,所有对都指向同一点(0.3, 0.3)
。我们可以说x
和y
是线性相关的吗?
scipy.stats.pearsonr(x, y)
会给你是的(1.0, 0.0)
.但这有意义吗?
但是,如果我们将所有0.3
更改为 3
,scipy不会给你(NaN, 1.0)
。为什么它与以前的(0.3)不同?与浮点数的偏差有关?但是如果我们使用 3.0 而不是 3,我们仍然得到 没有(NaN, 1.0)
.有谁知道为什么不同的输入会产生不同的输出?
# When using 0.3:
# result: (1.0, 0.0)
import scipy.stats
a=[]
for i in range(10):
a.append(0.3)
b=a
scipy.stats.pearsonr(a,b)
# When using int 3:
# result: (nan, 1.0)
import scipy.stats
a=[]
for i in range(10):
a.append(3)
b=a
scipy.stats.pearsonr(a,b)
# When using 3.0:
# result: (nan, 1.0)
import scipy.stats
a=[]
for i in range(10):
a.append(3.0)
b=a
scipy.stats.pearsonr(a,b)
请参阅上面的内联注释。
在一堆常量上使用假设数据呈正态分布的 Pearson R 系数在数学上是未定义的运算。
xm = x - x.mean()
ym = y - y.mean()
r = sum(xm * ym) / np.sqrt( sum(xm**2) * sum(ym**2) )
换句话说,如果数据中没有变化,则除以零。
现在它适用于重复 0.3 float
的原因:
a = [0.3 for _ in range(10)] #note that single-decimal only 0.3 and 0.6 fail
b = [3.0 for _ in range(10)]
print(np.asarray(a).mean(), np.asarray(b).mean())
#0.29999999999999993 3.0
print(0.3 - 0.29999999999999993)
#5.551115123125783e-17
因此,由于平均运算产生的这种微小的浮点偏差,有一些东西需要计算,相关性可以固定在1.0;尽管该方法的应用仍然无效。