主成分分析与白化预处理

上一节介绍了主成分分析应用于2维数据。现在使用高维的图像数据来试试效果。

原始图像如图1所示。

图1

每个图片都是12*12的小patch,原始数据是一个144*10000的矩阵x

在使用了PCA旋转之后,可以检查一下此时的协方差矩阵是否已经成功变成对角阵了,如图2所示。

avg=mean(x,1);
x=x-repmat(avg,size(x,1),1);
xRot = zeros(size(x)); % You need to compute this
[u,s,v]=svd(x*x'/size(x,2));
xRot=u'*x;
covar = zeros(size(x, 1)); % You need to compute this
covar=xRot*xRot'/size(xRot,2);
figure('name','Visualisation of covariance matrix');
imagesc(covar);</span>

图2

接下来我们需要找到使得图片方差保持在90%以上的k值。即取协方差矩阵最大的k个特征值用来后面降维。

k = 0; % Set k accordingly
partial=0;
total=sum(diag(s));
for k=1:size(x,1)
partial=partial+s(k,k)/total;
if partial>0.9
break;
end
end</span>

这个k值是43。如果要求保持99%的样本方差,则k取116。

确定了k值之后,就可以用PCA降维了。

xHat = zeros(size(x));
xHat=u(:,1:k)*u(:,1:k)'*x;</span>

可视化一下,可以看到用43个特征来重构出144维图片的效果,还是不错的。如图3。

图3

而如果像前文所说,取能保持99%的k值116的话,效果会更好,如图4。

图4

接下来还可以进行PCA白化。

epsilon = 0.1;
xPCAWhite = zeros(size(x));
xPCAWhite=diag(1./sqrt(diag(s)+epsilon))*u'*x;</span>

然后我们验证一下白化之后的新的协方差矩阵是否是对角阵,如图5。

covar = zeros(size(xPCAWhite, 1)); % You need to compute this
covar=xPCAWhite*xPCAWhite'/size(xPCAWhite,2);
figure('name','Visualisation of covariance matrix');
imagesc(covar);</span>

图5

最后是ZCA白化的处理效果,可以看出ZCA在不降维的情况下,通过变换将原始数据的边缘提取了出来,如图6。

xZCAWhite = zeros(size(x));
xZCAWhite=u*xPCAWhite;
figure('name','ZCA whitened images');
display_network(xZCAWhite(:,randsel));
figure('name','Raw images');
display_network(x(:,randsel));

图6

欢迎参与讨论并关注本博客微博以及知乎个人主页后续内容继续更新哦~

转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!

主成分分析与白化预处理,布布扣,bubuko.com

时间: 2024-10-29 10:46:25

主成分分析与白化预处理的相关文章

UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)

首先将本节主要内容记录下来,然后给出课后习题的答案. 笔记: 1:首先我想推导用SVD求解PCA的合理性. PCA原理:假设样本数据X∈Rm×n,其中m是样本数量,n是样本的维数.PCA降维的目的就是为了使将数据样本由原来的n维降低到k维(k<n).方法是找数据随之变化的主轴,在Andrew Ng的网易公开课上我们知道主方向就是X的协方差所对应的最大特征值所对应的特征向量的方向(前提是这里X在维度上已经进行了均值归一化).在matlab中我们通常可以用princomp函数来求解,详细见:http

深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同样的方差,降低相邻像素的相关性. 主成分分析PCA PCA算法可以将输入向量转换为一个维数低很多的近似向量.我们在这里首先用2D的数据进行试验,其数据集可以在UFLDL网站的相应页面http://ufldl.stanford.edu/wiki/index.php/Exercise:PCA_in_2D

应该如何入门deep learning呢?从UFLDL开始!

抱歉,大家,这里不是要分享如何学习deep learning,而是想要记录自己学习deep learning的小历程,算是给自己的一点小动力吧,希望各位业内前辈能够多多指教! 看到有网友提到,Andrew Ng的网页教程UFLDL Tutorial是入门不错的教程,好吧,试着从这里开始吧,加油! UFLDL即Unsupervised Feature Learning and Deep Learning 发现这个网页教程居然有中文版,还是很惊喜的! 该网页课程已经稳定的章节包括: 稀疏自编码器.矢

Deep Learning五:PCA and Whitening_Exercise(斯坦福大学UFLDL深度学习教程)

前言 本文是基于Exercise:PCA and Whitening的练习. 理论知识见:UFLDL教程. 实验内容:从10张512*512自然图像中随机选取10000个12*12的图像块(patch),然后对这些patch进行99%的方差保留的PCA计算,最后对这些patch做PCA Whitening和ZCA Whitening,并进行比较. 实验步骤及结果 1.加载图像数据,得到10000个图像块为原始数据x,它是144*10000的矩阵,随机显示200个图像块,其结果如下: 2.把它的每

本人部分博客导航

Deep Learning学习笔记: Deep Learning 21:针对调制信号分类的深度学习尝试3 Deep Learning 20:针对调制信号分类的深度学习尝试2_CNN Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程) Deep Learning 18:DBM的学习及练习_读论文“Deep Boltzmann Machines”的笔记 Deep Learning 17:DBN

MachineLearning Exercise 7 : K-means Clustering and Principle Component Analysis

findClosestCentroids.m m = size(X,1); for i=1:m [value index] = min(sum((repmat(X(i,:),K,1)-centroids).^2,2)); idx(i) = index; end computeCentroids.m temp = [X idx]; // pdf说能向量化实现更高效,本人对matlab实在不熟,勉强实现了下,若有大神,敬请赐教. for i=1:K [index_row index_column]=

ICA (独立成分分析)

介绍 独立成分分析(ICA,Independent Component Correlation Algorithm)简介 X=AS X为n维观测信号矢量,S为独立的m(m<=n)维未知源信号矢量,矩阵A被称为混合矩阵. ICA的目的就是寻找解混矩阵W(A的逆矩阵),然后对X进行线性变换,得到输出向量U. U=WX=WAS 过程 编辑 (1)对输入数据进行中心化和白化预处理 X*=X-u 经过白化变换后的样本数据为 Z=Wz X* (2)从白化样本中求解出解混矩阵W 通过优化目标函数的方法得到W

Sklearn K均值聚类

## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Learn 可视化数据:主成分分析(PCA) SciKit-Learn 预处理数据 SciKit-Learn K均值聚类 SciKit-Learn 支持向量机 SciKit-Learn 速查 到目前为止,我们已经非常深入地了解了数据集,并且把它分成了训练子集与测试子集. 接下来,我们将使用聚类方法训练一个模

skLearn 支持向量机

## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Learn 可视化数据:主成分分析(PCA) SciKit-Learn 预处理数据 SciKit-Learn K均值聚类 SciKit-Learn 支持向量机 SciKit-Learn 速查 前面章节尝试了K均值聚类模型,准确率并不高.接下来我们尝试一种新方法:支持向量机(SVM). 支持向量机 支持向量机