PCA降维(Opencv,C++)


//找工作好无趣,还是来写篇博客吧~


为了防止误导,先说一下,PCA降维的作用其实是确定一种从高维映射到低维的关系。PCA名儿叫主成分分析法,顾名思义就是通过加加减减各行得到少于之前的行数来达到计算量降低的效果。


例如在人脸识别中,确定了一个降维矩阵后,每张图片进来都乘以这个矩阵映射到低维的空间来进行计算,无论是分类还是其他啥都会减少很多计算量。


===================下面就开始不正经了=====================


先放一个效果图吧

没错,这个降维效果已经准确把握了降维的精髓了,一语中的找出了图片想表达的内容……



然后放上一波代码

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;


int main() {

	Mat frame = imread("test.jpg");

	cvtColor(frame, frame, CV_RGB2GRAY);
//	double 阈值 = 99.999999999999 / 100.0;
//	PCA pca(frame, Mat(), CV_PCA_DATA_AS_COL, 阈值);
/*
#define CV_PCA_DATA_AS_ROW 0
#define CV_PCA_DATA_AS_COL 1
#define CV_PCA_USE_AVG 2
*/
	int 层数 = 120;
	PCA pca(frame, Mat(), CV_PCA_DATA_AS_COL, 层数);
	//图片大小为400*362
	//这里按COL的方式降维,保证列数不便,行数降低到120层
	//所以可以发现打印的均值的规格为1*362
	cout << "均值的规格:" << pca.mean.size() << endl;//均值
	  cout << "特征值的规格:"<<pca.eigenvalues.size() << endl;//特征值
	  cout <<"特征向量的规格:" <<pca.eigenvectors.size() << endl;//特征向量

	Mat dst = pca.project(frame);//映射新空间
								 //cout << dst;
	Mat src = pca.backProject(dst);//反映射回来
								   //	cout << src;

	imshow("原图", frame);
	imshow("PCA降维后", dst);
	imshow("反映射", src);

	waitKey(-1);

	return 0;
}


当然,一般来说,PCA降维也没我这么用的,而且一般也没这效果……

(某种程度上可能还有些误导作用,所有还是先看看降维步骤吧)


PCA降维的步骤:


设有m条n维数据。

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

3)求出协方差矩阵

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)PX即为降维到k维后的数据



附上原图




  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值