我假设numpy.cov(X)
将样本协方差矩阵计算为:
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)
即外部产品的总和。但在文档中没有任何地方真正这么说,它只是说“估计协方差矩阵”。
谁能确认这是否是它在内部所做的?(我知道我可以用参数改变前面的常数bias
。)
我假设numpy.cov(X)
将样本协方差矩阵计算为:
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)
即外部产品的总和。但在文档中没有任何地方真正这么说,它只是说“估计协方差矩阵”。
谁能确认这是否是它在内部所做的?(我知道我可以用参数改变前面的常数bias
。)
正如您所看到的source,在最简单的情况下,没有掩码,并且每个N
变量都有M
样本,它返回(N, N)
计算为的协方差矩阵:
(x-m) * (x-m).T.conj() / (N - 1)
其中*
代表矩阵乘积[1]
大致实现为:
X -= X.mean(axis=0)
N = X.shape[1]
fact = float(N - 1)
return dot(X, X.T.conj()) / fact
如果您想查看源代码,请查看此处而不是 E 先生的链接,除非您对屏蔽数组感兴趣。正如您所提到的,文档不是很好。
[1]在这种情况下是有效的(但不完全是)外积,因为(x-m)
具有N
长度的列向量,M
因此(x-m).T
是尽可能多的行向量。最终结果是所有外部产品的总和。如果顺序颠倒,同样*
会给出内部(标量)产品。但是,从技术上讲,这些都只是标准矩阵乘法,真正的外积只是列向量与行向量的乘积。
是的,这就是numpy.cov
计算。FWIW,我已经将输出numpy.cov
与显式迭代样本(如您提供的伪代码)进行了比较,以比较性能,并且结果输出数组的差异是由于浮点精度所期望的。