代码之家  ›  专栏  ›  技术社区  ›  user13321

numpy协方差矩阵

  •  22
  • user13321  · 技术社区  · 12 年前

    假设我有两个长度为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 回复  |  直到 12 年前
        1
  •  13
  •   David Marx    12 年前

    你有两个矢量,而不是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 矢量

        2
  •  13
  •   bernie2436 MarioD    10 年前

    试试这个:

    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)
    
        3
  •  5
  •   Community CDub    5 年前

    样本向量的协方差矩阵

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

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

    • 每个向量作为一个单个变量的N个实现/样本 (例如两个三维矢量 [X1,X2,X3] [Y1,Y2,Y3] ,其中变量X和Y分别有3个实现)
    • 每个向量作为N个变量的1个实现 (例如两个三维矢量 [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]])
    
        4
  •  3
  •   Arcturus    12 年前

    阅读文档时,

    >> np.cov.__doc__ 
    

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

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

        5
  •  2
  •   Leukonoe    10 年前

    我想你要找的其实是一个协方差函数,它是一个时滞函数。我是这样做的:

     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))
    
        6
  •  2
  •   FooBar167    7 年前

    你应该改变

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

    np.cov((x,y), rowvar=0)
    
        7
  •  2
  •   aerin    6 年前

    你得到的(2乘2)比25*25更有用。X和Y的协方差是对称协方差矩阵中的一个非对角项。

    如果你坚持(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)
    
        8
  •  0
  •   Stuart    12 年前

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

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

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

        9
  •  0
  •   andrewchan2022    6 年前

    根据文档,您应该在以下列中预期变量向量:

    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)
    
        10
  •  -2
  •   Edison Chen    9 年前

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