μ£Όμ±λΆ λΆμμ μ°¨μ μΆμλ₯Ό νκΈ° μν΄ μ¬μ©νλ μκ³ λ¦¬μ¦ κΈ°λ²μ΄μμ.
μμλ‘ μ€λͺ
νλ©΄ x,y,z μ 3μ°¨μ μ’νλ₯Ό κ°μ§κ³ μλ 리μ€νΈκ° μλ€κ³ ν λ, μ΄λ₯Ό λΆμν΄μ κ²½ν₯μ±μ μμΉνν΄ 2μ°¨μ μ’νλ‘ λνλ΄κ²λ νλ κΈ°λ²μ΄μμ.
μ€μ ꡬν μμ μ½λλ μλμ κ°μμ.
public static List<double> GetPCADataErrorValue(List<double[]> coordinates)
{
var originalData = coordinates.DeepClone();
var data = coordinates.ToArray();
var centroid = Measures.Mean(data, dimension: 0);
PrincipalComponentAnalysis pca = new PrincipalComponentAnalysis()
{
Method = PrincipalComponentMethod.CovarianceMatrix,
Means = centroid,
};
var adjustData = AdjustData(data, centroid);
var covariance = Measures.Covariance(adjustData);
pca.Learn(covariance);
var transform = pca.Transform(originalData.ToArray());
double maxDistance = 0;
List<double> distanceList = new List<double>();
// κ° μ μμ μ£Όμ΄μ§ μ μ λν 거리 κ³μ°
for (int i = 0; i < data.Length; ++i)
{
var distance = Math.Sqrt(Math.Pow(transform[i][1], 2) + Math.Pow(transform[i][2],2));
distanceList.Add(distance);
maxDistance = Math.Max(maxDistance, distance);
}
}
private static double[][] AdjustData(double[][] data, double[] centroid)
{
for (int i = 0; i < data.Length; i++)
for (int j = 0; j < data[i].Length; j++)
data[i][j] -= centroid[j];
return data;
}