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



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

分类: UFLDL 913人阅读 评论(0) 收藏 举报

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

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

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

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

  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>  
<span style="font-family:Times New Roman;font-size:14px;">xRot = zeros(size(x));
xRot=u'*x;
figure(2);
scatter(xRot(1, :), xRot(2, :));
title('xRot');</span>
得到原始图和主轴方向,如图1所示。


图1


PCA变换

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

  1. xRot = zeros(size(x));   
  2. xRot=u'*x;  
  3. figure(2);  
  4. scatter(xRot(1, :), xRot(2, :));  
  5. title('xRot');  
xRot = zeros(size(x)); 
xRot=u'*x;
figure(2);
scatter(xRot(1, :), xRot(2, :));
title('xRot');


图2


PCA降维

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

  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>  
<span style="font-family:Times New Roman;font-size:14px;">k = 1; 
xHat = zeros(size(x));
xHat=u(:,1:k)*u(:,1:k)'*x;
figure(3);
scatter(xHat(1, :), xHat(2, :));
title('xHat');</span>

图3

 

PCA白化

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

  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 = 1e-5;
xPCAWhite = zeros(size(x));
xPCAWhite=diag(1./(diag(s)+epsilon))*u'*x;
figure(4);
scatter(xPCAWhite(1, :), xPCAWhite(2, :));
title('xPCAWhite');

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


图4

 

 ZCA白化

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

  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');  
xZCAWhite = zeros(size(x)); 
xZCAWhite=u*diag(1./(diag(s)+epsilon))*u'*x;
figure(5);
scatter(xZCAWhite(1, :), xZCAWhite(2, :));
title('xZCAWhite');


图5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值