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

时间:2017-03-07 16:37:16

标签: python arrays numpy statistics

考虑以下代码

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)

1 个答案:

答案 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值返回零。

更多关于Pearson的相关性herehere