PCA分析以及MATLAB实现
来源:互联网 发布:淘宝同款比价软件 编辑:程序博客网 时间:2024/06/06 02:12
(前半部分解释来自吴恩达的机器学习视频)
一、数据降维
(1)二维数据->一维数据
降维到一维之后的数据:
(2)三维数据->二维数据
上图中的数据可以投影到二维平面上,大致在如下平面上:
投影之后如下图所示:
二、主成分分析的原理
(1)PCA投影
假设有一组二维数据如下图所示:
若将上图中的数据投影到图中的红色直线上,注意到原始数据到投影数据的距离为蓝色线段,且距离最短。PCA求解的目标是:将原始数据投影到低维平面上,使得图中蓝色线段的和达到最小,即投影误差最小。
换一个投影方向,投影到图中玫红色的直线上,投影误差达到最大化。
将二维数据投影成一维数据,需要寻找一个投影方向,或者是一个n维向量
将三维数据降为二维数据,需要寻找两个n维向量,组成一个投影平面:
(2)PCA与线性回归的区别
在PCA由二维投影成一维的过程中,与线性回归类似,都是寻找一条直线,但是本质却不同。左图是线性回归中的预测直线,预测值与真实值之间的误差是图中蓝色线段,可见蓝色线短和y轴平行;右图是PCA的投影方向,蓝色线段是投影误差,可见蓝色线段垂直于投影方向,是最短距离。除此之外,线性回归需要使用标记数据,获取样本的类别标记,而PCA算法则是无监督的,不需要使用样本的类别标记。
(3)PCA算法
再进行PCA算法之前,首先将数据进行归一化处理。当数据特征很多时,特征的范围差别可能很大。
算法过程:
1、求数据矩阵的协方差矩阵Sigma;
2、计算Sigma的特征值与特征向量;
3、选出特征矩阵中的前k列,与原始数据矩阵X相乘,得到降维数据Z。
注:在Sigma的特征值与特征向量的计算方法中,使用奇异值分解函数svd或者特征值求解函数eig都可以求得特征向量(协方差矩阵是特例),在这里使用svd,因为后面要使用到svd中的结果确定k的值。
svd中得出的结果,U是Sigma的特征向量,S的对角线是Sigma的奇异值。关于svd函数的详细解释,请参考博客点击打开链接。
最后的计算公式为:
z就是最后投影得到的降维样本。
(4)K值的选择
先看两个误差:第一个误差是投影误差,即投影之前的数据与投影之后的数据之差;第二个误差是数据的方差,由于数据进行归一化,所以相当于样本向量到零向量的距离。选择适当的K值,使二者的比值尽可能小,比值越小,也就代表保留了越大的方差。因为PCA算法的原理,是使投影之后的数据,方差尽可能的大,因为方差越大,表明数据之间的差异越大,也就越容易区分。
一种计算K值的方法是:使用代入法,一个一个的试验K值,直到满足下式为止。
另一个方法是:在SVD的求解当中,S矩阵是一个对角矩阵,可以利用对角线元素进行保留方差百分比的计算:n是样本总数,对于给定的K值,直接计算下式是否满足等式,比起使用上图的计算方法要简单许多。
(5)重建数据
(6)使用PCA的建议
1、数据压缩:减少内存或者硬盘的存储空间;
2、对数据降维,加速学习算法;
3、将数据降低到二维或者三维,可视化数据。
疑惑点:
1、PCA的实现方式有两种,一种是如上所示,第二种是:
(1)计算Sigma=X*X’;
(2)计算[V,D]=eig(Sigma);
(3)选择特征值中前k大的特征值对应的特征向量,组成投影矩阵U,与原始数据矩阵相乘,进行降维;
在第二种算法中,对特征值进行排序,选择前K个较大的特征值对应的特征向量,投影后得到最大的K个主成分。在第一种算法中,通过SVD计算,得到向量U,为什么不选择较大的特征值对应的特征向量,而是直接选择U中的前K个向量呢?因为得出的[U,S,V]中,S中对角线上的元素是默认按照由小到大的顺序排列的,所以不必排序选择。
2、PCA降维不是去掉了数据的某些特征,而是将数据映射到低维空间中表示,而这些低维的数据,足以代表高维的数据。
- PCA分析以及MATLAB实现
- PCA的一些基本资料 以及MATLAB实现
- PCA降维算法总结以及matlab实现PCA
- PCA降维算法总结以及matlab实现PCA
- 主成分分析PCA的matlab实现
- PCA (主成分分析)matlab实现
- matlab 进行PCA分析
- Matlab做PCA分析
- 主成分分析(PCA)原理与故障诊断(SPE、T^2以及结合二者的综合指标)-MATLAB实现
- PCA的MATLAB实现
- PCA matlab实现
- Matlab实现PCA
- PCA的MATLAB实现
- PCA-MATLAB 实现
- PCA(主成分)分析及MATLAB实现
- PCA主成分分析学习笔记 + Matlab实现
- PCA降维算法总结以及matlab实现PCA(个人的一点理解)
- PCA降维算法总结以及matlab实现PCA(个人的一点理解)
- hdu 2089 不要62(数位)
- Nginx实现虚拟机(1.基于ip地址的虚拟主机)
- 欢迎使用CSDN-markdown编辑器
- JavaBean
- Android inflate 方法理解
- PCA分析以及MATLAB实现
- 2017.09.23【NOIP 普及组】模拟赛C组 总结
- 2017.9.23 考试题二:排列
- thymeleaf 传递数据到js变量
- 后缀表达式求值
- python有5种数据类型
- 51Nod1250 排列与交换
- c++学习笔记
- 三帧差法运动目标检测代码及注释