Exemple #1
0
        public static PCAData GetPCAData(Matrix LoadMatrix,  object Tag = null)
        {
            ColumnVector AverageVector = LoadMatrix.GetAverageRow();
            Matrix AverageMatrix = Matrix.GetSameElementMatrix(AverageVector, LoadMatrix.ColSize);
            Matrix DiffMatrix = LoadMatrix - AverageMatrix;
            SymmetricMatrix LMatrix = new SymmetricMatrix(DiffMatrix.GetTranspose() * DiffMatrix);
            EigenSystem EigenSystemData = LMatrix.GetEigenVectorAndValue(0.00001);
            Matrix LEigenVector = EigenSystemData.GetEigenVectors();
            Matrix FinalEigenVector = (LoadMatrix * LEigenVector).GetNormalizedMatrixCol();
            EigenSystem FinalEigenSystem = new EigenSystem();
            for (int i = 0; i < EigenSystemData.Count; i++)
            {
                if (EigenSystemData[i].EigenValue > 0.0001)
                    FinalEigenSystem.Add(new EigenVectorAndValue(FinalEigenVector.GetColVector(i), EigenSystemData[i].EigenValue));
            }
            Matrix CoefficientMatrix = FinalEigenSystem.GetEigenVectors().GetTranspose() * DiffMatrix;

            return new PCAData( FinalEigenSystem, CoefficientMatrix, AverageVector, Tag);
        }
 /// <summary>
 /// ベクトルを対象行列にします。
 /// </summary>
 /// <returns>対象行列</returns>
 public virtual SymmetricMatrix GetSymmetricMatrix()
 {
     int i, j, length = element.Length;
     SymmetricMatrix returnMatrix = new SymmetricMatrix(length);
     for (i = 0; i < length; i++)
     {
         for (j = 0; j < length; j++)
         {
             returnMatrix[i, j] = element[i] * element[j];
         }
     }
     return returnMatrix;
 }
 /// <summary>
 /// 与えられた対称行列と同一の対称行列を作成します。
 /// </summary>
 /// <param name="matrix">コピー元の対称行列</param>
 public SymmetricMatrix(SymmetricMatrix matrix)
     : base(matrix)
 {
 }