【问题标题】:numpy covariance matrixnumpy协方差矩阵
【发布时间】:2013-02-23 02:05:32
【问题描述】:

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

【问题讨论】:

    标签: python numpy covariance


    【解决方案1】:

    你有两个向量,而不是 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 向量的协方差(我认为/希望)

    【讨论】:

    • 不,我只有 2 个向量,每个向量有 25 个点。 zip 的解决方案实际上会产生一个 25x25 矩阵,我仍然需要弄清楚它是否是我希望得到的。无论如何谢谢:)
    • 如果你有两个有 25 个点的向量,你可能只需要一个 2x2 协方差矩阵。
    【解决方案2】:

    试试这个:

    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)
    

    【讨论】:

    • vstack() 只需要 1 个参数(给定 2 个)
    • 应该是 z = np.vstack((x, y))
    【解决方案3】:

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

    为了澄清关于什么是使用两个 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]])
    

    【讨论】:

      【解决方案4】:

      阅读文档,

      >> np.cov.__doc__ 
      

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

      我认为之前的帖子有正确的解决方案。我有解释:-)

      【讨论】:

      • 这会产生一个 (50, 50) 矩阵!
      【解决方案5】:

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

       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】:

        你应该改变

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

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

        【讨论】:

          【解决方案7】:

          你得到的(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)
          

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

            • 协方差矩阵是,根据维基百科,是“一个矩阵,其元素在 i, j 位置是第 i 和第 j 个元素之间的协方差”如果他的 i 和 j 是 25,如何这会导致一个 2x2 矩阵吗??
            【解决方案9】:

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

            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】:

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

              【讨论】:

              • no.. 你只需要 2 个长度为 25 的向量。看看维基百科的定义。
              猜你喜欢
              • 2017-08-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-09
              • 1970-01-01
              • 2020-04-13
              相关资源
              最近更新 更多