numpy 协方差矩阵

22 投票
10 回答
92239 浏览
提问于 2025-04-17 16:50

假设我有两个长度为25的向量,我想计算它们的协方差矩阵。我尝试用numpy.cov来做,但总是得到一个2x2的矩阵。

>>> import numpy as np
>>> x=np.random.normal(size=25)
>>> y=np.random.normal(size=25)
>>> np.cov(x,y)
array([[ 0.77568388,  0.15568432],
       [ 0.15568432,  0.73839014]])

使用rowvar这个选项也没有帮助——结果还是一样。

>>> np.cov(x,y,rowvar=0)
array([[ 0.77568388,  0.15568432],
       [ 0.15568432,  0.73839014]])

我该如何得到一个25x25的协方差矩阵呢?

10 个回答

5

从样本向量得到协方差矩阵

为了澄清关于如何用两个N维向量定义协方差矩阵的小困惑,有两种可能性

你需要问自己的是,你是把:

  • 每个向量看作是一个单一变量的N个实现/样本(比如两个3维向量 [X1,X2,X3][Y1,Y2,Y3],这里你分别有3个X和Y的样本)
  • 每个向量看作是N个变量的一个实现(比如两个3维向量 [X1,Y1,Z1][X2,Y2,Z2],这里每个向量都有X、Y和Z的一个样本)

因为协方差矩阵直观上是基于两个不同变量的方差定义的:

  • 在第一种情况下,你有2个变量,每个变量有N个样本值,所以你得到的是一个2x2的矩阵,其中的协方差是通过每个变量的N个样本计算得出的
  • 在第二种情况下,你有N个变量,每个变量有2个样本,所以你得到的是一个NxN的矩阵

关于实际问题,使用numpy

如果你认为每个向量有25个变量(为了简化示例代码,这里用了3个而不是25),那么在一个向量中有多个变量的一个实现,使用 rowvar=0

# [X1,Y1,Z1]
X_realization1 = [1,2,3]

# [X2,Y2,Z2]
X_realization2 = [2,1,8]

numpy.cov([X,Y],rowvar=0) # rowvar false, each column is a variable

代码返回,考虑3个变量:

array([[ 0.5, -0.5,  2.5],
       [-0.5,  0.5, -2.5],
       [ 2.5, -2.5, 12.5]])

否则,如果你认为一个向量是一个变量的25个样本,那么使用 rowvar=1(这是numpy的默认参数)

# [X1,X2,X3]
X = [1,2,3]

# [Y1,Y2,Y3]
Y = [2,1,8]

numpy.cov([X,Y],rowvar=1) # rowvar true (default), each row is a variable

代码返回,考虑2个变量:

array([[ 1.        ,  3.        ],
       [ 3.        , 14.33333333]])
13

试试这个:

import numpy as np
x=np.random.normal(size=25)
y=np.random.normal(size=25)
z = np.vstack((x, y))
c = np.cov(z.T)
13

你有两个向量,而不是25个。我现在用的电脑上没有python,所以我没法测试这个,但你可以试试:

z = zip(x,y)
np.cov(z)

当然……其实你想要的可能更像是:

n=100 # number of points in each vector
num_vects=25
vals=[]
for _ in range(num_vects):
    vals.append(np.random.normal(size=n))
np.cov(vals)

这个是计算num_vects个1行n列向量的协方差(我想/希望是这样)

撰写回答