NumPy协方差函数的简单实现
我在尝试实现 numpy.cov()
这个函数,具体内容可以在这里找到: numpy cov (协方差) 函数到底计算了什么?,但是我得到了些奇怪的结果。请帮我纠正一下:
import numpy as np
def my_covar(X):
X -= X.mean(axis=0)
N = X.shape[1]
return np.dot(X, X.T.conj())/float(N-1)
X = np.asarray([[1.0,1.0],[2.0,2.0],[3.0,3.0]])
## Run NumPy's implementation
print np.cov(X)
"""
NumPy's output:
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
"""
## Run my implementation
print my_covar(X)
"""
My output:
[[ 2. 0. -2.]
[ 0. 0. 0.]
[ -2. 0. 2.]]
"""
到底哪里出错了呢?
1 个回答
6
你的函数和默认情况下的 np.cov
都假设 X
的行代表的是 变量,而列代表的是 观测值。
当你通过减去平均值来对 X
进行中心化时,你需要计算的是 观测值 的平均值,也就是 X
的列,而不是行:
X -= X.mean(axis=1)[:, None]