2024-04-29 01:15:09 发布
网友
我假设numpy.cov(X)将样本协方差矩阵计算为:
numpy.cov(X)
1/(N-1) * Sum (x_i - m)(x_i - m)^T (where m is the mean)
即外部产品的总和。但在文献中没有提到,它只是说“估计协方差矩阵”。
有人能确认这是否是它内部的功能吗?(我知道我可以用bias参数更改前面的常量。)
bias
是的,这就是numpy.cov计算的结果。FWIW,我比较了numpy.cov的输出与显式迭代样本(如您提供的伪代码)以比较性能,结果输出数组中的差异是由于浮点精度而预期的。
numpy.cov
如您所看到的,在最简单的情况下,没有掩码,N变量都有M个样本,它返回(N, N)协方差矩阵,计算如下:
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
如果您想查看源代码,look here而不是来自Mr E的链接,除非您对屏蔽数组感兴趣。正如你提到的,the documentation并不好。
[1]这在本例中是有效的(但不完全是)外积,因为(x-m)具有长度为M的N列向量,因此(x-m).T与行向量一样多。最终的结果是所有外部产品的总和。如果顺序颠倒,同样的*将给出内部(标量)积。但是,从技术上讲,这两个都只是标准矩阵乘法,真正的外积只是列向量与行向量的乘积。
(x-m)
(x-m).T
是的,这就是
numpy.cov
计算的结果。FWIW,我比较了numpy.cov
的输出与显式迭代样本(如您提供的伪代码)以比较性能,结果输出数组中的差异是由于浮点精度而预期的。如您所看到的,在最简单的情况下,没有掩码,
N
变量都有M
个样本,它返回(N, N)
协方差矩阵,计算如下:其中
*
表示矩阵乘积[1]大致实现为:
如果您想查看源代码,look here而不是来自Mr E的链接,除非您对屏蔽数组感兴趣。正如你提到的,the documentation并不好。
[1]这在本例中是有效的(但不完全是)外积,因为
(x-m)
具有长度为M
的N
列向量,因此(x-m).T
与行向量一样多。最终的结果是所有外部产品的总和。如果顺序颠倒,同样的*
将给出内部(标量)积。但是,从技术上讲,这两个都只是标准矩阵乘法,真正的外积只是列向量与行向量的乘积。相关问题 更多 >
编程相关推荐