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

标签 python pandas pearson-correlation

x=[0.3, 0.3, 0.3, ..., 0.3](0.3 的数量:10)

y=x

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

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

scipy.stats.pearsonr(x, y) 会给你 Yes (1.0, 0.0)。但这有意义吗?

但是,如果我们将所有 0.3 更改为 3,scipy 将为您提供 No (NaN, 1.0)。为什么它与之前的(0.3)不同?和 float 的偏差有关吗?但如果我们使用 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)

请参阅上面的内联评论。

最佳答案

在一堆常量上使用 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;虽然应用该方法仍然无效。

关于python - DataFrame.corr() - 使用相同的重复数据计算 PIL 逊线性相关性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54177124/

相关文章:

python - 如何使用 Plotly (Python) 中的 Candlestick 制作动画

python - 如何使用 XlsxWriter 阻止 Excel 以科学计数法显示数字?

python - PIL 逊相关系数和 nan 值

python - 如何直接从数据类生成带有假设的测试样本?

python - 相邻矩阵中的度中心性和聚类系数

python - 如何在任何行在 Python pandas 数据框中具有 NaN 值后删除列

python - 特定轴上 np.corrcoef 的 Tensorflow 等效项

python - pandas:计算表行之间的相关性

python - 如何阻止matplotlib GUI线程卡住?

python - OpenCV 错误 : bitwise_and throws error that mask and image are not same size