22

假设我有两个长度为 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 协方差矩阵?

4

10 回答 10

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这需要1xn向量的协方差(我认为/希望)

于 2013-02-23T02:15:52.777 回答
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)
于 2013-02-25T13:55:43.587 回答
4

 来自样本向量的协方差矩阵

为了澄清关于什么是使用两个 N 维向量定义的协方差矩阵的小混乱,有两种可能性

您必须问自己的问题是您是否考虑:

  • 每个向量作为一个单一变量的 N 个实现/样本(例如两个 3 维向量[X1,X2,X3][Y1,Y2,Y3],其中变量 X 和 Y 分别有 3 个实现)
  • 每个向量作为 N 个变量的 1 个实现(例如,两个 3 维向量[X1,Y1,Z1][X2,Y2,Z2],其中每个向量的变量 X、Y 和 Z 有 1 个实现)

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

  • 在第一种情况下,您有 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]])
于 2019-04-02T09:10:12.737 回答
3

阅读文档,

>> np.cov.__doc__ 

或查看Numpy Covariance,Numpy 将数组的每一行视为一个单独的变量,因此您有两个变量,因此您得到一个 2 x 2 协方差矩阵。

我认为上一篇文章有​​正确的解决方案。我有解释:-)

于 2013-02-23T02:16:31.293 回答
2

我想你正在寻找的实际上是一个协方差函数,它是一个时滞函数。我正在做这样的自协方差:

 def autocovariance(Xi, N, k):
    Xs=np.average(Xi)
    aCov = 0.0
    for i in np.arange(0, N-k):
        aCov = (Xi[(i+k)]-Xs)*(Xi[i]-Xs)+aCov
    return  (1./(N))*aCov

autocov[i]=(autocovariance(My_wector, N, h))
于 2015-08-05T18:34:08.650 回答
2

你应该改变

np.cov(x,y, rowvar=0)

np.cov((x,y), rowvar=0)
于 2017-11-20T13:43:47.357 回答
1

你得到的(2 x 2)比 25*25 更有用。X 和 Y 的协方差是对称 cov_matrix 中的非对角项。

如果你坚持我认为没用的(25 x 25),那你为什么不写出定义呢?

x=np.random.normal(size=25).reshape(25,1) # to make it 2d array.
y=np.random.normal(size=25).reshape(25,1)

cov =  np.matmul(x-np.mean(x), (y-np.mean(y)).T) / len(x)
于 2019-02-01T19:08:47.113 回答
0

如上所述,你只有两个向量,所以你只会得到一个 2x2 cov 矩阵。

IIRC 的 2 个主要对角线项将是 sum( (x-mean(x))**2) / (n-1) ,对于 y 也是如此。

2 个非对角项将是 sum( (x-mean(x))(y-mean(y)) ) / (n-1)。在这种情况下,n=25。

于 2013-02-23T02:30:33.980 回答
0

根据文档,您应该期望列中的变量向量:

If we examine N-dimensional samples, X = [x1, x2, ..., xn]^T

虽然后来它说每一行都是一个变量

Each row of m represents a variable.

所以你需要输入你的矩阵作为转置

x=np.random.normal(size=25)
y=np.random.normal(size=25)
X = np.array([x,y])
np.cov(X.T)

并根据维基百科:https ://en.wikipedia.org/wiki/Covariance_matrix

X is column vector variable
X = [X1,X2, ..., Xn]^T
COV = E[X * X^T] - μx * μx^T   // μx = E[X]

你可以自己实现它:

# X each row is variable
X = X - X.mean(axis=0)
h,w = X.shape
COV = X.T @ X / (h-1)
于 2019-04-29T16:56:56.023 回答
-2

我认为您不了解协方差矩阵的定义。如果您需要 25 x 25 协方差矩阵,则需要 25 个向量,每个向量具有 n 个数据点。

于 2016-07-31T03:34:22.527 回答