PCA with linear Accord.Net

Implements principal component analysis(PCA) algorithm

PCA Summary

์ฃผ์„ฑ๋ถ„ ๋ถ„์„์€ ์ฐจ์› ์ถ•์†Œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•์ด์—์š”.

์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•˜๋ฉด x,y,z ์˜ 3์ฐจ์› ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์ด๋ฅผ ๋ถ„์„ํ•ด์„œ ๊ฒฝํ–ฅ์„ฑ์„ ์ˆ˜์น˜ํ™”ํ•ด 2์ฐจ์› ์ขŒํ‘œ๋กœ ๋‚˜ํƒ€๋‚ด๊ฒŒ๋” ํ•˜๋Š” ๊ธฐ๋ฒ•์ด์—์š”.

์‹ค์ œ ๊ตฌํ˜„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

Example

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;
}

Last updated