假设我有两个长度为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协方差矩阵?
答案 0 :(得分: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)
答案 1 :(得分:11)
你有两个向量,而不是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
1x n
向量的协方差(我认为/希望)
答案 2 :(得分:3)
阅读文档,
>> np.cov.__doc__
或查看Numpy Covariance,Numpy将每行数组视为一个单独的变量,因此您有两个变量,因此您得到一个2 x 2协方差矩阵。
我认为之前的帖子有正确的解决方案。我有解释: - )
答案 3 :(得分:2)
你应该改变
np.cov(x,y, rowvar=0)
到
np.cov((x,y), rowvar=0)
答案 4 :(得分:1)
我认为你所寻找的实际上是一个协方差函数,它是一个时间函数。我正在做那样的自协方差:
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))
答案 5 :(得分:1)
您得到的(2 x 2)比25 * 25更有用。 X和Y的协方差是在对称的cov_matrix非对角线项。
如果您坚持我认为没用的(25乘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)
答案 6 :(得分:1)
为澄清关于使用两个N维向量定义的协方差矩阵的小困惑,有两种可能性。
您必须问自己的问题是您是否考虑:
[X1,X2,X3]
和[Y1,Y2,Y3]
,其中变量X有3个实现和Y)[X1,Y1,Z1]
和[X2,Y2,Z2]
,其中变量X,Y和1具有1个实现每个向量Z)由于将协方差矩阵直观地定义为基于两个不同变量的方差:
如果您认为每个向量有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]])
答案 7 :(得分:0)
如上所述,您只有两个向量,因此您只能获得2x2的cov矩阵。
2个非对角线项将是和((x-均值(x))(y-均值(y)))/(n-1)。在这种情况下,n = 25。
答案 8 :(得分: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)
答案 9 :(得分:-2)
我不认为你理解协方差矩阵的定义。 如果需要25 x 25协方差矩阵,则需要25个向量,每个向量具有n个数据点。