nei*_*nor 3 python statistics numpy probability correlation
对于数据X = [0,0,1,1,0]和Y = [1,1,0,1,1]
>> np.corrcoef(X,Y)
Run Code Online (Sandbox Code Playgroud)
返回
array([[ 1. , -0.61237244],
[-0.61237244, 1. ]])
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用np.var并np.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]])
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
这是因为,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. ]])
Run Code Online (Sandbox Code Playgroud)
或者换个角度看:
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. ]])
Run Code Online (Sandbox Code Playgroud)
真正发生了什么np.cov(m, y=None, rowvar=1, bias=0, ddof=None),当bias和ddof两者都没有提供时,默认的归一化是由N-1,N 是观察的数量。因此,这相当于具有 delta 自由度1。不幸的是,默认为np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)具有默认的 delta 自由度0。
每当不确定时,最安全的方法是获取协方差矩阵的对角元素而不是var单独计算,以确保一致的行为。