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 == True
或 rowvar == False
算法是否真的不同。好吧,事实证明,如果您更改 rowvar
标志,numpy 只是转置数组本身 :P.
看here.
因此,就性能而言,两个版本之间没有任何变化。
我想找到一个 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 == True
或 rowvar == False
算法是否真的不同。好吧,事实证明,如果您更改 rowvar
标志,numpy 只是转置数组本身 :P.
看here.
因此,就性能而言,两个版本之间没有任何变化。