解析


データリスト(ベクトルの配列)から分散共分散行列を作成します。 まず、前述のVectorクラスに共分散を計算する演算子^を追加定義します。

		
public class Vector
{
  /// <summary>オペレータ^</summary>
  /// <returns>共分散</returns>
  public static double operator ^( Vector dat1, Vector dat2 )
  {
    if( dat1.Count != dat2.Count ) return 0;
    int n = dat1.Count;

    // 偏差値
    double dAverage1 = dat1.Average;
    Vector dp1 = new Vector( n );
    for( int i = 0; i < n; i++ )
    {
      dp1[ i ] = dat1[ i ] - dAverage1;
    }
    double dAverage2 = dat2.Average;
    Vector dp2 = new Vector( n );
    for( int i = 0; i < n; i++ )
    {
      dp2[ i ] = dat2[ i ] - dAverage2;
    }

    // 偏差積
    for( int i = 0; i < n; i++ )
    {
      dp1[ i ] = dp1[ i ] * dp2[ i ];
    }
    
    return dp1.Average;
  }
}
		
	

計算する演算子^が定義できましたので、生データのリスト(ベクトルリスト)の分散共分散行列は以下のように正方行列で求められます。
		
/// <summary>分散共分散行列作成</summary>
/// <param name="listData">生データリスト</param>
/// <returns><para>True: OK</para><para>False: NG</para></returns>
public static SquareMatrix CalcurateCovarianceMatrix( List<Vector> listData )
{
  SquareMatrix matrix = new SquareMatrix( listData.Count );
  for( int i = 0; i < listData.Count; i++ )
  {
    for( int j = 0; j < listData.Count; j++ )
    {
      matrix[ i, j ] = listData[ i ] ^ listData[ j ];
    }
  }
  return matrix;
}

		
	


inserted by FC2 system