考虑以下代码
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)
答案 0 :(得分:1)
当我运行你的代码时,它会给我以下错误。你没有收到这个错误吗?
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
的值似乎等于零,这会导致值为零除法错误或{{ 1}}(Pearson相关系数)在第2558行,因此代码中为r
。
理想情况下,r需要为零,因为两个相同集合(具有相同数据)之间的相关性为零。
您可以尝试使用自己的功能获取类似数据,如下所示。 来自this SO posting
r = NaN
仍然与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
函数的错误完全相同
另请注意 r = NaN 的返回值。
pearsonr
您可以通过使用 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
值返回零。