Numpy - 相关系数和相关统计函数结果不一致
对于数据 X = [0,0,1,1,0]
和 Y = [1,1,0,1,1]
>> np.corrcoef(X,Y)
返回的结果是
array([[ 1. , -0.61237244],
[-0.61237244, 1. ]])
但是,我无法通过 np.var
和 np.cov
重现这个结果,参考的公式可以在这个链接找到:
>> np.cov([0,0,1,1,0],[1,1,0,1,1])/sqrt(np.var([0,0,1,1,0])*np.var([1,1,0,1,1]))
array([[ 1.53093109, -0.76546554],
[-0.76546554, 1.02062073]])
这到底是怎么回事呢?
2 个回答
4
根据你提供的链接(http://docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html),你需要注意一下索引的问题...
c = np.cov([0,0,1,1,0],[1,1,0,1,1])
corrcoef = [[ c[0,0]/np.sqrt(c[0,0]*c[0,0]), c[0,1]/np.sqrt(c[0,0]*c[1,1]) ],
[ c[1,0]/np.sqrt(c[1,1]*c[0,0]), c[1,1]/np.sqrt(c[1,1]*c[1,1]) ]]
print corrcoef
# [[1.0, -0.61237243569579447], [-0.61237243569579447, 1.0]]
没错!
5
这是因为,np.var
的默认自由度是 0
,而不是 1
。
In [57]:
X = [0,0,1,1,0]
Y = [1,1,0,1,1]
np.corrcoef(X,Y)
Out[57]:
array([[ 1. , -0.61237244],
[-0.61237244, 1. ]])
In [58]:
V = np.sqrt(np.array([np.var(X, ddof=1), np.var(Y, ddof=1)])).reshape(1,-1)
np.matrix(np.cov(X,Y))
Out[58]:
matrix([[ 0.3 , -0.15],
[-0.15, 0.2 ]])
In [59]:
np.matrix(np.cov(X,Y))/(V*V.T)
Out[59]:
matrix([[ 1. , -0.61237244],
[-0.61237244, 1. ]])
或者换个角度看:
In [70]:
V=np.diag(np.cov(X,Y)).reshape(1,-1) #the diagonal elements
In [71]:
np.matrix(np.cov(X,Y))/np.sqrt(V*V.T)
Out[71]:
matrix([[ 1. , -0.61237244],
[-0.61237244, 1. ]])
当你使用 np.cov(m, y=None, rowvar=1, bias=0, ddof=None)
时,如果没有提供 bias
和 ddof
,默认的归一化方式是用 N-1
,这里的 N 是观测值的数量。所以,这相当于自由度是 1
。不幸的是,np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
的默认自由度是 0
。
如果不确定,最安全的做法是直接取协方差矩阵的对角元素,而不是单独计算 var
,这样可以确保结果的一致性。