numpy协方差矩阵

use*_*321 19 python numpy covariance

假设我有两个长度为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]])
Run Code Online (Sandbox Code Playgroud)

使用rowvar标志也无济于事 - 我得到了完全相同的结果.

>>> np.cov(x,y,rowvar=0)
array([[ 0.77568388,  0.15568432],
       [ 0.15568432,  0.73839014]])
Run Code Online (Sandbox Code Playgroud)

如何获得25x25协方差矩阵?

小智 12

试试这个:

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)
Run Code Online (Sandbox Code Playgroud)

  • 应该是z = np.vstack((x,y)) (2认同)

Dav*_*arx 11

你有两个向量,而不是25.我在的计算机没有python,所以我无法测试,但尝试:

z = zip(x,y)
np.cov(z)
Run Code Online (Sandbox Code Playgroud)

当然......你真正想要的可能更像是:

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)
Run Code Online (Sandbox Code Playgroud)

这需要num_vects1x n向量的协方差(我认为/希望)

  • 如果您有两个带有25个点的向量,则可能只需要2x2协方差矩阵。 (3认同)

Blu*_*pon 5

\n

\xc2\xa0样本向量的协方差矩阵

\n

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

\n

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

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

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

\n
    \n
  • 在第一种情况下,您有 2 个变量,每个变量有 N 个示例值,因此您最终得到一个 2x2 矩阵,其中通过每个变量的 N 个样本来计算协方差
  • \n
  • 在第二种情况下,你有 N 个变量,每个变量有 2 个样本,所以你最终得到一个 NxN 矩阵
  • \n
\n

关于实际问题,使用 numpy

\n

如果您认为每个向量有 25 个变量(为了简化示例代码,用了 3 个而不是 25 个),因此一个向量中多个变量的一种实现,请使用rowvar=0

\n
# [X1,Y1,Z1]\nX_realization1 = [1,2,3]\n\n# [X2,Y2,Z2]\nX_realization2 = [2,1,8]\n\nnumpy.cov([X,Y],rowvar=0) # rowvar false, each column is a variable\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
array([[ 0.5, -0.5,  2.5],\n       [-0.5,  0.5, -2.5],\n       [ 2.5, -2.5, 12.5]])\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
# [X1,X2,X3]\nX = [1,2,3]\n\n# [Y1,Y2,Y3]\nY = [2,1,8]\n\nnumpy.cov([X,Y],rowvar=1) # rowvar true (default), each row is a variable\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
array([[ 1.        ,  3.        ],\n       [ 3.        , 14.33333333]])\n
Run Code Online (Sandbox Code Playgroud)\n