OPENCV中的PCA使用(ZZ)

对于PCA,一直都是有个概念,没有实际使用过,今天终于实际使用了一把,发现PCA还是挺神奇的。

     在OPENCV中使用PCA非常简单,只要几条语句就可以了。

1、初始化数据

     //每一行表示一个样本

     CvMat* pData = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 ); 

     CvMat* pMean = cvCreateMat(1, 样本的维数, CV_32FC1);

      //pEigVals中的每个数表示一个特征值

     CvMat* pEigVals = cvCreateMat(1, min(总的样本数,样本的维数), CV_32FC1);

     //每一行表示一个特征向量

     CvMat* pEigVecs = cvCreateMat( min(总的样本数,样本的维数),  样本的维数, CV_32FC1); 

 2、PCA处理,计算出平均向量pMean,特征值pEigVals和特征向量pEigVecs

     cvCalcPCA( pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );

3、选出前P个特征向量(主成份),然后投影,结果保存在pResult中,pResult中包含了P个系数            

      CvMat* pResult = cvCreateMat( 总的样本数, PCA变换后的样本维数(即主成份的数目), CV_32FC1 );

      cvProjectPCA( pData, pMean, pEigVecs, pResult );

 

 4、 重构,结果保存在pRecon中

       CvMat* pRecon = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );

       cvBackProjectPCA( pResult, pMean, pEigVecs, pRecon );

 

 5、重构误差的计算

       计算pRecon和pData的"差"就可以了.

 

使用时如果是想用PCA判断“是非”问题,则可以先用正样本计算主成分,判断时,对需要判断得数据进行投影,然后重构,计算重构出的数据与原数据的差异,如果差异在给定范围内,可以认为“是”。

如果相用PCA进行分类,例如对数字进行分类,则先用所有数据(0-9的所有样本)计算主成分,然后对每一类数据进行投影,计算投影的系数,可简单得求平均。即对每一类求出平均系数。分类时,将需要分类得数据进行投影,得到系数,与先前计算出得每一类得平均系数进行比较,可判为最接近得一类。当然这只是最简单得使用方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值