Python Numpy——相关系数和相关统计函数don';我不能给出同样的结果

Python Numpy——相关系数和相关统计函数don';我不能给出同样的结果,python,numpy,statistics,probability,correlation,Python,Numpy,Statistics,Probability,Correlation,对于数据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重现此结果,因为公式如下所示: 这是怎么回事?根据您的链接()您需要注意索引 c = np.cov([0,0,1,1,0],[1,1,0,1,1]) corrcoef = [[ c[0,0

对于数据
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
重现此结果,因为公式如下所示:

这是怎么回事?

根据您的链接()您需要注意索引

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
默认的增量自由度是
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
,以确保行为一致。

2快速且可能是基本的问题:为什么要将V与其转置相乘,而不是将两个方差相乘?特别是,当我将ddof设置为1而不是默认的0时,ddof的意义是什么?如果你只是
V*V
,它将是一个元素操作,结果不是我们想要的2乘2矩阵。第二个问题见(样本方差vs.总体方差)。但这不是这里的确切问题,请参见编辑。
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.        ]])