PCA算法:
若有m个样本,每个样本的维数为n, 矩阵
(1)将X的每一列进行零均值,即减去该列的均值;
(2)求协方差矩阵
(3)求协方差矩阵C的特征值与特征向量;
(4)将特征值从大到小的顺序对应的特征向量排成矩阵,取前K行组成矩阵P;
(5)Y=PX为矩阵X从n维降到K维的数据。
PCA代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using System.Text;
using Emgu.CV.UI;
using Emgu.CV;
using Emgu.Util;
namespace DecreaseFeaturePCA
{
public class PCA
{
Matrix<float> sample;
public PCA(Matrix<float> s)
{
sample = s;
}
public void DoPCA(out Matrix<float> eigVects,out Matrix<float>eigValues)
{
int sampleNum = sample.Rows;
int sampleDim = sample.Cols;
//计算样本矩阵每一个维度的均值
Matrix<float> mean = new Matrix<float>(1, sampleDim);
for (int i = 0; i < sampleDim; i++)
{
for (int j = 0; j < sampleNum; j++)
{
mean[0, i] += sample[j, i];
}
mean[0, i] /= sampleNum;
}
//对样本矩阵进行零均值化
for (int i = 0; i < sampleNum; i++)
{
for (int j = 0; j < sampleDim; j++)
{
sample[i, j] = sample[i, j] - mean[0, j];
}
}
//计算协方差矩阵
Matrix<float> Cov = new Matrix<float>(sampleDim, sampleDim);
Matrix<float> sample_transpose=sample.Transpose();
Cov=sample_transpose*sample;
Cov._Mul(1.0 / sampleNum);
//计算协方差矩阵的特征值和特征向量
eigVects = new Matrix<float>(sampleDim, sampleDim);
eigValues=new Matrix<float> (sampleDim,sampleDim);
Matrix<float> U=new Matrix<float> (sampleDim,sampleDim);
CvInvoke.cvSVD(Cov.Ptr, eigValues.Ptr, U.Ptr, eigVects.Ptr, Emgu.CV.CvEnum.SVD_TYPE.CV_SVD_V_T);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
讲PCA原理很详细的一篇文章:
[http://www.360doc.com/content/13/1124/02/9482_331688889.shtmlhttp
[http://blog.sina.com.cn/s/blog_59d470310100j7f1.html