主成分分析(PCA)——以2维图像为例

来源:互联网 发布:vb自动处理网页弹框 编辑:程序博客网 时间:2024/06/06 04:26


主成分分析(PCA)——以2维图像为例

分类: UFLDL 913人阅读 评论(0)收藏 举报
深度学习模式识别Deep LearningUFLDL压缩

这一节不论是思想还是实现都比较容易。

主成分分析(PCA)就是模式识别里面说的K-L变换,思想是完全相同的。

详情可见我的博文:特征选择(三)-K-L变换

这里简单介绍几个概念。顺便贴出代码和效果图。

[cpp] view plaincopyprint?
  1. <span style="font-family:Times New Roman;font-size:14px;">xRot = zeros(size(x));  
  2. xRot=u'*x;  
  3. figure(2);  
  4. scatter(xRot(1, :), xRot(2, :));  
  5. title('xRot');</span>  
得到原始图和主轴方向,如图1所示。


图1


PCA变换

就是要找到数据分布最大的方向,作为主轴方向,然后以这些主轴方向为基,旋转过去,就完成了数据的去相关性,这是因为此时数据的协方差矩阵成了对角阵。如图2所示。

[cpp] view plaincopyprint?
  1. xRot = zeros(size(x));   
  2. xRot=u'*x;  
  3. figure(2);  
  4. scatter(xRot(1, :), xRot(2, :));  
  5. title('xRot');  


图2


PCA降维

如果我们只取了特征根最大的几个特征向量作为旋转矩阵,那么这就是PCA降维。如图3。

[cpp] view plaincopyprint?
  1. <span style="font-family:Times New Roman;font-size:14px;">k = 1;   
  2. xHat = zeros(size(x));  
  3. xHat=u(:,1:k)*u(:,1:k)'*x;  
  4. figure(3);  
  5. scatter(xHat(1, :), xHat(2, :));  
  6. title('xHat');</span>  

图3

 

PCA白化

我们不降维,而此基础上将数据左乘一个,那么数据就按照各自主轴方向进行压缩拉伸,成了一个球形,这就是PCA白化。

[cpp] view plaincopyprint?
  1. epsilon = 1e-5;  
  2. xPCAWhite = zeros(size(x));  
  3. xPCAWhite=diag(1./(diag(s)+epsilon))*u'*x;  
  4. figure(4);  
  5. scatter(xPCAWhite(1, :), xPCAWhite(2, :));  
  6. title('xPCAWhite');  

这里加了一个epsilon是因为有的特征根已经很小了,归一化的时候根号了一下,容易出现数据上溢。同时它还有消除噪声的作用。如图4。


图4

 

 ZCA白化

我们在PCA白化的基础上,左乘一个特征向量矩阵,数据的方向就会又转回去了。这就是ZCA白化,ZCA白化去除了数据的相关性、保留了最大限度原始数据的形式。是数据预处理的好方法。如图5。

[cpp] view plaincopyprint?
  1. xZCAWhite = zeros(size(x));   
  2. xZCAWhite=u*diag(1./(diag(s)+epsilon))*u'*x;  
  3. figure(5);  
  4. scatter(xZCAWhite(1, :), xZCAWhite(2, :));  
  5. title('xZCAWhite');  


图5

0 0