gpt4 book ai didi

python - 为什么两个矩阵的相关性返回 nan?

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:21 24 4
gpt4 key购买 nike

考虑以下代码

import numpy as np
from scipy.stats.stats import pearsonr
A = np.ones([5,5])
B = np.ones([5,5])
pearsonr(A.flatten(), B.flatten())

现在我的问题是为什么最后一行代码返回:

(nan, 1.0)

最佳答案

当我运行你的代码时,出现以下错误。您没有收到此错误吗?

    In [6]:runfile('C:/Users/a*/.spyder-py3/temp.py', wdir='C:/Users/a*/.spyder-py3')
(nan, 1.0)
C:\Anaconda3\lib\site-packages\scipy\stats\stats.py:3029:
RuntimeWarning: invalid value encountered in double_scalars
r = r_num / r_den
C:\Anaconda3\lib\site-packages\scipy\stats\stats.py:5084:
RuntimeWarning: invalid value encountered in less
x = np.where(x < 1.0, x, 1.0) # if x > 1 then return 1.0

当我通过打开 stats.py 进行深入研究时,在 peasronr 函数中,似乎 r_den 的值等于零,这导致第 2558 行上的值或 r( PIL 逊相关系数)出现零除错误,因此代码中的 r = NaN

理想情况下,r 需要为零,因为两个相同集合(具有相同数据)之间的相关性为零。

您可以尝试使用自己的函数来获取类似的数据,如下所示。来源 this SO posting

import numpy as np
from scipy.stats.stats import pearsonr
import warnings

def pearsonr(X, Y):
''' Takes X & Y as numpy array
returms Pearson Correlation Coefficient
'''
# Normalise X and Y
X -= X.mean(0)
Y -= Y.mean(0)
# Standardise X and Y
X /= X.std(0)
Y /= Y.std(0)
# Compute mean product
return np.mean(X*Y)

A = np.ones([5,5]).flatten()
B = np.ones([5,5]).flatten()
print pearsonr(A, B)

仍然给出与 stats.py pearsonr 函数完全相同的错误。
另请注意 r = NaN 的返回值。

 In [7]: runfile('C:/Users/a*/.spyder-py3/temp.py', wdir='C:/Users/a*/.spyder-py3')
nan
C:/Users/a*/.spyder-py3/temp.py:14:
RuntimeWarning: invalid value encountered in true_divide
X /= X.std(0)
C:/Users/amandr/.spyder-py3/temp.py:15:
RuntimeWarning: invalid value encountered in true_divide
Y /= Y.std(0)

您可以通过使用 try - except 捕获警告来覆盖警告,以便在值相同的情况下为 r 值返回零。

有关 Pearson 相关性的更多信息 herehere .

关于python - 为什么两个矩阵的相关性返回 nan?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42653563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com