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