Cov

计算协方差矩阵。

matrix matrix::Cov(

  const bool    rowvar=true  // 所观测向量的行或列

);



matrix vector::Cov(

  const vector&  b           // 第二个向量

);

参数

b

[输入]  第二个向量。

注意

计算协方差矩阵。

以 MQL5 实现的计算两个向量的协方差矩阵的简单算法:

bool VectorCovariation(const vector& vector_a,const vector& vector_b,matrix& matrix_c)

  {

   int i,j;

   int m=2;

   int n=(int)(vector_a.Size()<vector_b.Size()?vector_a.Size():vector_b.Size());

//--- 检查

   if(n<=1)

      return(false);

   for(i=0; i<n; i++)

     {

      if(!MathIsValidNumber(vector_a[i]))

         return(false);

      if(!MathIsValidNumber(vector_b[i]))

         return(false);

     }

//---

   matrix matrix_x(2,n);

   matrix_x.Row(vector_a,0);

   matrix_x.Row(vector_b,1);

   vector t=vector::Zeros(m);

//--- 计算

   for(i=0; i<m; i++)

      for(j=0; j<n; j++)

         t[i]+=matrix_x[i][j]/double(n);

   for(i=0; i<m; i++)

      for(j=0; j<n; j++)

         matrix_x[i][j]-=t[i];

//--- syrk C=alpha*A^H*A+beta*C (beta=0 且不考虑)

   matrix_c=matrix::Zeros(m,m);

   for(i=0; i<m; i++)

     {

      for(j=0; j<n; j++)

        {

         double v=matrix_x[i][j]/(n-1);

         for(int i_=i; i_<m; i_++)

            matrix_c[i][i_]+=v*matrix_x[i_][j];

        }

     }

//--- 强制对称性

   for(i=0; i<m-1; i++)

      for(j=i+1; j<m; j++)

         matrix_c[j][i]=matrix_c[i][j];

//---

   return(true);

  }

MQL5 示例:

   matrix matrix_a={{3,-2.1},{1.1,-1},{0.12,4.3}};

   Print("covariation cols\n",matrix_a.Cov(false));

   Print("covariation rows\n",matrix_a.Cov());



   vector vector_a=matrix_a.Col(0);

   vector vector_b=matrix_a.Col(1);

   Print("covariation vectors\n",vector_a.Cov(vector_b));



  /*

   covariation cols

   [[2.144133333333333,-4.286]

    [-4.286,11.71]]

   covariation rows

   [[13.005,5.355,-10.659]

    [5.355,2.205,-4.389]

    [-10.659,-4.389,8.736199999999998]]

   covariation vectors

   [[2.144133333333333,-4.286]

    [-4.286,11.71]]

  */

Python 示例:

import numpy as np

matrix_a=np.array([[3,-2.1],[1.1,-1],[0.12,4.3]])

matrix_c=np.cov(matrix_a,rowvar=False)

print("covariation cols\n",matrix_c)

matrix_c2=np.cov(matrix_a)

print("covariation rows\n",matrix_c2)



vector_a=matrix_a[:,0]

vector_b=matrix_a[:,1]

matrix_c3=np.cov(vector_a,vector_b)

print("covariation vectors\n",matrix_c3)



covariation cols

 [[ 2.14413333 -4.286     ]

 [-4.286      11.71      ]]

covariation rows

 [[ 13.005    5.355  -10.659 ]

 [  5.355    2.205   -4.389 ]

 [-10.659   -4.389    8.7362]]

covariation vectors

 [[ 2.14413333 -4.286     ]

 [-4.286      11.71      ]]