考虑以下代码
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)
发布于 2017-03-07 17:59:21
当我运行您的代码时,它会给我以下错误。你不明白这个错误吗?
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
(皮尔逊相关系数)的零除法误差,从而导致了代码中的r = NaN
。
理想情况下,r需要为零,因为两个相同的集合(具有相同的数据)之间的相关性为零。
对于类似的数据,您可以使用自己的函数进行试用,如下所示。来源于这个帖子
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
值返回零。
https://stackoverflow.com/questions/42653563
复制相似问题