Numpy-相关系数和相关统计函数给出的结果不同

2024-05-09 13:03:26 发布

您现在位置:Python中文网/ 问答频道 /正文

对于数据X = [0,0,1,1,0]Y = [1,1,0,1,1]

>> np.corrcoef(X,Y) 

回报

array([[ 1.        , -0.61237244],
       [-0.61237244,  1.        ]])

然而,我不能使用np.varnp.cov来重现这个结果,给出了http://docs.scipy.org/doc/numpy/reference/generated/numpy.corrcoef.html中所示的公式:

>> 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]])

怎么回事?


Tags: 数据orgnumpyhttpdocsdocvarhtml
2条回答

根据你的链接(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]]

是的!

这是因为,np.var默认的delta自由度是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),当biasddof都不提供时,默认的规范化是N-1,N是观察数。所以,这相当于有1的δ自由度。不幸的是,np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)的默认值具有0的默认增量自由度。

如果不确定,最安全的方法是获取协方差矩阵的对角元素,而不是分别计算var,以确保一致的行为。

相关问题 更多 >