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) { }