Python numpy.corrcoef()RuntimeWarning:在true_divide中遇到无效值c/= stddev [:,None]

Abd*_*heb 10 python numpy correlation

看来,corrcoefnumpy抛出RuntimeWarning当一个恒定的列表传递给corrcoef()函数,例如下面的代码抛出一个警告:

import numpy as np
X = [1.0, 2.0, 3.0, 4.0]
Y = [2, 2, 2, 2]
print(np.corrcoef(X, Y)[0, 1])
Run Code Online (Sandbox Code Playgroud)

警告 :

/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py:3003: RuntimeWarning: invalid value encountered in true_divide
  c /= stddev[:, None]
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么当其中一个列表是常量时抛出此错误,以及如何在将常量列表传递给函数时防止此错误.

and*_*ece 13

相关性衡量两个向量在变化时彼此跟踪的程度.当一个向量不变时,您无法跟踪相互更改.

正如在OP注释所指出的,为皮尔逊积差相关系数划分的协方差XY通过它们的标准偏差的乘积.由于Y您的示例中的方差为零,因此其标准偏差也为零.这就是你得到true_divide错误的原因- 你试图除以零.

注意:从工程角度来看,简单地将一个非常小的数量(例如,机器epsilon上方的值)添加到其中一个条目中似乎很有吸引力,Y以便绕过零分割问题.但这在统计上并不可行.即使添加1e-15也会严重扰乱相关系数,具体取决于您将其添加到哪个值.

考虑这两种情况之间的区别:

X = [1.0, 2.0, 3.0, 4.0]

tiny = 1e-15

# add tiny amount to second element
Y1 = [2., 2.+tiny, 2., 2.]
np.corrcoef(X, Y1)[0, 1] 
-0.22360679775

# add tiny amount to fourth element
Y2 = [2., 2., 2., 2.+tiny]
np.corrcoef(X, Y2)[0, 1]
0.67082039325
Run Code Online (Sandbox Code Playgroud)

这对统计学家来说可能是显而易见的,但考虑到问题的性质,这似乎是一个相关的警告.