最近对PCA主成分分析做了一定的了解,对PCA基础和简单的代码做了小小的总结

有很多博客都做了详细的介绍,这里也参考了这些大神的成果:

http://blog.sina.com.cn/s/blog_75e063c101014aob.html 这个博客opencv简单实现了PCA,对PCA关键技术做了详细的分析

http://blog.sina.com.cn/s/blog_4b9b714a0100hc8o.html 这篇文章介绍了opencv实现PCA的相关函数

http://blog.csdn.net/huangxy10/article/details/7912189 这篇文章给出了一个PCA的opencv代码实现的例子

http://blog.csdn.net/augusdi/article/details/9005276/  讲的比较详细

先把实验的代码贴出来(主要是参考上面博客的代码)

 1 #include <iostream>
 2 #include <opencv2/highgui/highgui.hpp>
 3 #include <opencv2/core/core.hpp>
 4 #include <opencv/cv.hpp>
 5
 6 using namespace std;
 7 using namespace cv;
 8
 9 float Coordinates[50]={2.5,0.5,2.2,1.9,3.1,2.3,2.0,1.0,1.5,1.1,
10     2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9,
11     2.1,0.4,2.7,2.2,3.4,2.5,1.3,1.2,1.5,0.8,
12     2.0,0.2,2.4,2.3,3.1,2.3,1.4,1.9,1.1,1.8,
13     1.9,0.3,2.8,2.2,1.1,2.7,4.4,1.5,1.8,1.8
14 };
15
16 void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
17
18 int main()
19 {
20     CvMat *Vector1;
21     CvMat *AvgVector;
22     CvMat *EigenValue_Row;
23     CvMat *EigenVector;
24
25     Vector1=cvCreateMat(5,10,CV_32FC1);
26     cvSetData(Vector1,Coordinates,Vector1->step);  //给vector1赋值(样本矩阵)
27     AvgVector=cvCreateMat(1,10,CV_32FC1);  //这个用处还不知道
28     EigenValue_Row=cvCreateMat(1,5,CV_32FC1);  //每个数表示一个特征值,5是选取的样本数和维度中较小的数
29     EigenVector=cvCreateMat(5,10,CV_32FC1);  //每一行表示一个特征向量,5是选取的样本数和维度中较小的数
30
31     //PCA的实现函数
32     cvCalcPCA(Vector1,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);
33
34     CvMat *Vector2 = cvCreateMat(5,5,CV_32FC1);
35     //cvProjectPCA(Vector1,AvgVector,EigenVector,Vector2);  //选择前面的特征向量(主成分)
36
37     printf("原始样本矩阵:\n");
38     PrintMatrix(Vector1,Vector1->rows,Vector1->cols);
39     printf("----------------------\n");
40     printf("----------------------\n");
41     printf("特征值:\n");
42     PrintMatrix(EigenValue_Row,EigenValue_Row->rows,EigenValue_Row->cols);
43     printf("----------------------\n");
44     printf("特征向量:\n");
45     PrintMatrix(EigenVector,EigenVector->rows,EigenVector->cols);
46
47     system("pause");
48     return 0;
49 }
50 void PrintMatrix(CvMat *Matrix,int Rows,int Cols)
51 {
52     for(int i=0;i<Rows;i++)
53     {
54         for(int j=0;j<Cols;j++)
55         {
56             printf("%.4f ",cvGet2D(Matrix,i,j).val[0]);
57         }
58         printf("\n");
59     }
60 }  

上面的主要的函数是cvCalcPCA(Vector1,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);功能是计算特征值和特征向量

CV_PCA_DATA_AS_ROW:是以列为主的资料的排列
Vector1:所有样本组成的矩阵(这里有5个样本,每个样本是10维的特征向量)

AvgVector:空的平均数向量(不懂)

EigenValue_Row:存放求出的特征值

EigenVector:存放特征向量

另外,函数cvProjectPCA()和函数cvBackProjectPCA(),可以通过矩阵的乘法实现样本特征的降维和重新转回原来维度的坐标系。

PCA的技术介绍:

PCA是主成分分析,主要用于降噪和去冗余(降维),对于一系列sample(n个样本)的feature(m维)组成的多维向量,多维向量里的某些元素本身没有区分性,比如某个元素在所有的sample中都为1,或者与1相差不大,那么这个元素本身就没有区分性,用它来做特征区分,贡献非常小。所以我们的目的是找那些变化大的元素,即方差大的那些维,而去除变化不大的维,从而使feature留下的都是区分能力强的,而且计算量也变小了。

协方差矩阵:

协方差用来描述二维数据,要想描述多维的数据就把所有维度进行两两求协方差,也就组成了协方差矩阵。协方差矩阵度量的是维度与维度之间的关系,而不是样本与样本的关系。

可见协方差矩阵是一个对称的矩阵,对角线上是各个维度的方差。是各个维度拥有的能量。降噪:是把协方差矩阵对角化。去冗余:取出对角化之后最大特征值上的维度。如果对角线上值比较小,说明在所有样本上变化不明显,对区分不同样本作用不大,是冗余的。

因为协方差矩阵的特征值的大小代表了这个维度上的能量,找出最大的特征值即为主分量。

协方差矩阵对角线上表示每一维的方差(可以表示这一维的能量),非对角线上的值就是每两个维度之间的相关性。去除噪声就是要减小相关性把非对角线的值减小。通过矩阵对角化来完成。对角化后的矩阵,对角线上的值是协方差矩阵的特征值:它是每个维度上的新方差(表示能量),这样就把各维度间的相关性减到最小。

利用特征向量矩阵进行降维:

如果选取了p个特征值可以表示所有的99%以上(或者超过95%等都行,看自己的要求),那么最大的p个特征值的特征向量就组成了m*p的矩阵。我们知道样本是m维的,拿样本向量与这个m*p的矩阵相乘,就得到一个p维的特征,这就完成了降维。

转载于:https://www.cnblogs.com/wangjianwei/p/4800658.html

PCA主成分分析 特征降维 opencv实现相关推荐

  1. pca主成分分析_降维:主成分分析(PCA)

    用于降维的PCA算法的设计原理及其从头开始在Python中的实现 介绍 借助高性能CPU和GPU的可用性,几乎可以使用机器学习和深度学习模型解决所有回归,分类,聚类和其他相关问题.但是,在开发此类模型 ...

  2. PCA主成分分析(降维)

    PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法.PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是 ...

  3. 【机器学习算法-python实现】PCA 主成分分析、降维

    1.背景 PCA(Principal Component Analysis),PAC的作用主要是降低数据集的维度,然后挑选出主要的特征. PCA的主要思想是移动坐标轴,找到方差最大的方向上的特征值,什 ...

  4. 【机器学习】特征降维-主成分分析

    主成分分析 目标 应用PCA实现特征的降维 应用:用户与物品类别之间主成分分析 什么是主成分分析(PCA) 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据.创造新的变量 作用:是数据 ...

  5. 【机器学习】特征降维

    特征降维 学习目标 知道特征选择的嵌入式.过滤式以及包裹氏三种方式 应用VarianceThreshold实现删除低方差特征 了解相关系数的特点和计算 应用相关性系数实现特征选择 降维 降维是指在某些 ...

  6. Python数据集可视化:抽取数据集的两个特征进行二维可视化、主成分分析PCA对数据集降维进行三维可视化(更好地理解维度之间的相互作用)

    Python数据集可视化:抽取数据集的两个特征进行二维可视化.主成分分析PCA对数据集降维进行三维可视化(更好地理解维度之间的相互作用) 目录 Python数据集可视化:抽取数据集的两个特征进行二维可 ...

  7. 主成分分析(Principal components analysis)(特征降维)(PCA)-最大方差解释

    在这一篇之前的内容是<Factor Analysis>,由于非常理论,打算学完整个课程后再写.在写这篇之前,我阅读了PCA.SVD和LDA.这几个模型相近,却都有自己的特点.本篇打算先介绍 ...

  8. [学习笔记] [机器学习] 8. 聚类算法(聚类算法:K-means、K-means++;聚类算法评估;特征降维:特征选择(Pearson相关系数、Spearman相关系数)、PCA主成分分析)

    视频链接 数据集下载地址:无需下载 1. 聚类算法简介 学习目标: 掌握聚类算法实现过程 知道 K-means 算法原理 知道聚类算法中的评估模型 说明 K-means 的优缺点 了解聚类中的算法优化 ...

  9. 稀疏学习、稀疏表示、稀疏自编码神经网络、字典学习、主成分分析PCA、奇异值分解SVD 等概念的梳理,以及常用的特征降维方法

    稀疏学习.稀疏表示.稀疏自编码神经网络.字典学习.主成分分析PCA.奇异值分解SVD 等概念的梳理,以及常用的特征降维方法 关于稀疏 稀疏编码 Sparse Coding 与字典学习 神经网络的正则化 ...

最新文章

  1. go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制
  2. Google怎么用linux
  3. IB客座主编(一)--安普布线亚太区业务总监黎启枝
  4. js函数调用html对象参数传递参数吗,js里函数参数传递对象传的是指针吗
  5. 浅谈Java的Fork/Join并发框架
  6. 基于 Knative 打造生产级 Serverless 平台 | KubeCon NA2019
  7. 微信JS-SDK选择相册或拍照并上传PHP实现
  8. Bootstrap基础二 网格系统
  9. 【bat】批处理中的行,段注释
  10. CSS度量单位px/pt/em/in/pc/mm/cm
  11. Linux下的任务管理器 top命令
  12. Debian dns设置
  13. Echarts( Pie,Bar)数据可视化 条形图,柱图,饼图、时间轴代码 JS-NEW
  14. undefined reference to `__stack_chk_guard' .. undefined reference to `__stack_chk_fail'
  15. music-音符与常用记号
  16. 月薪13K!一个“今日”胜于两个“明天”,努力前行,就能获得成功~
  17. 新闻客户端的三种模式和四种活法
  18. 电源专栏 | 硬件工程师常用的5V转3.3V方法
  19. 罗兰钢琴APP有Android版本吗,罗兰Piano Partner 2安卓版
  20. Pr:制作倒计时片段

热门文章

  1. element ui dialog 对话框设置fullscreen_UI设计中的弹窗设计素材,技巧快get起来
  2. lc滤波器是利用电感的感抗_电感知识
  3. 【linux】【tcpdump】linux之tcpdump抓包及wireshark分析详解
  4. python json.load_python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)...
  5. 技术选型方案怎么写_活动运营方案怎么写?
  6. 企业一般用php还是js,网站开发用php还是js
  7. java 配置文件 路径问题_java 配置文件的路径问题
  8. python遍历文件_python遍历目录文件脚本的示例
  9. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...
  10. php后端如何搭建socket服务,从php做一个简单的socket服务器流程