numpy 协方差矩阵
假设我有两个长度为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
列向量的协方差(我想/希望是这样)