DataFrame.corr()-用相同的重复数据计算的皮尔逊线性相关性?

时间:2019-01-14 07:17:31

标签: python pandas pearson-correlation

x=[0.3, 0.3, 0.3, ..., 0.3](0.3:10)

y=x

xy之间的线性相关系数是多少?

对于此xy,所有对都指向同一点(0.3, 0.3)。我们可以说xy是线性相关的吗?

scipy.stats.pearsonr(x, y)将为您提供(1.0, 0.0)。但这有意义吗?

但是,如果我们将所有0.3更改为3,scipy不会给您任何(NaN, 1.0)。为什么与以前的(0.3)不同?与浮点数的偏差有关吗?但是,如果我们使用3.0而不是3,则仍会得到No (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)

请参阅上面的在线注释。

1 个答案:

答案 0 :(得分:0)

使用一堆常数上的Pearson R系数(假定数据为正态分布)在数学上是不确定的。

xm = x - x.mean()
ym = y - y.mean()
r = sum(xm * ym) / np.sqrt( sum(xm**2) * sum(ym**2) )

换句话说,如果数据没有变化,则将被零除。

现在说明它可以重复float 0.3的原因:

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。尽管该方法的应用仍然无效。

相关问题