<p>这是因为,<code>np.var</code>默认的delta自由度是<code>0</code>,而不是<code>1</code>。</p>
<pre><code>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. ]])
</code></pre>
<p>或者从另一个角度看:</p>
<pre><code>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. ]])
</code></pre>
<p>实际情况是,<code>np.cov(m, y=None, rowvar=1, bias=0, ddof=None)</code>,当<code>bias</code>和<code>ddof</code>都不提供时,默认的规范化是<code>N-1</code>,N是观察数。所以,这相当于有<code>1</code>的δ自由度。不幸的是,<code>np.var(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)</code>的默认值具有<code>0</code>的默认增量自由度。</p>
<p>如果不确定,最安全的方法是获取协方差矩阵的对角元素,而不是分别计算<code>var</code>,以确保一致的行为。</p>