解析
- 分散共分散行列
データリスト(ベクトルの配列)から分散共分散行列を作成します。 まず、前述の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;
}