python 中矩阵的协方差

Covariance of Matrix in python

我想找到一个 10304*280 矩阵的协方差(即 280 个变量,每个变量有 10304 个对象),我正在使用以下 numpy 函数来找到它。

cov = numpy.cov(matrix)

我预计结果是 208*280 矩阵,但它返回了 10304*10304 矩阵。

这是 numpy.cov(m, y=None..) 文档所说的

m : array_like A 1-D or 2-D array containing multiple variables and observations. Each row of m represents a variable, and each column a single observation of all those variables...

因此,如果您的矩阵包含 280 个变量,每个变量有 10304 个样本,则它应该是 280*10304 矩阵而不是 10304*280 矩阵。简单的解决方案与其他人的建议相同。

swap_matrix = numpy.swapaxis(matrix)
cov = numpy.cov(swap_matrix)

正如上一个答案中所建议的,您可以更改内存布局。 在 2d 中执行此操作的一种简单方法是简单地转置矩阵:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r.T).shape # is (10,10)

但您也可以指定一个 rowvar 标志。了解它 here:

import numpy as np
r = np.random.rand(100, 10)
np.cov(r).shape # is (100,100)
np.cov(r, rowvar=False).shape # is (10,10)

我认为特别是对于大型矩阵,这可能会更高效,因为您避免了轴的 swapping/transposing。

更新:

我考虑了一下,想知道根据 rowvar == Truerowvar == False 算法是否真的不同。好吧,事实证明,如果您更改 rowvar 标志,numpy 只是转置数组本身 :P.

here.

因此,就性能而言,两个版本之间没有任何变化。