简析PCA

PCA 具有两个功能:(1)数据降维(2)数据可视化、

本篇文章主要是简述PCA在图像方面的可视化,

下面将结合代码来讲述一下整个PCA的过程:

1.首先获得一些关于自然图像的data,例如需要用在Auto-encoder,或者CNN中的最简单的数据格式,本文我是用到了一个64*2400000,数据不算大只是用来测试。其中前边的64=8*8指的是你从一张图像上取的patch的大小(8),后边的2400000则是指共采样了多少个这样的patch。

对应代码‘patches = sampleIMAGESRAW();’ 其中sampleIMAGESRAW()与auto-encoder中的图像采样相同。

randsel = randi(size(patches,2),204,1); 
display_network(patches(:,randsel)); 从所以的patches中随机选出204个patch可视化出来。


2.对获取到的数据进行均值为0处理。因为自然图像每一部分的统计特征都非常的相似,因此不需要对图像进行方法归一化,但是有文中提到,如果是对其它的图像,例如最熟悉的手写字的识别时,还是有必要进行方差归一化的。

patches = patches-repmat(mean(patches,1),size(patches,1),1);%均值为0处理


3.PCA处理,首先要清楚PCA的计算过程其实主要就是求两个东西:(1)降维后的各个向量的方向(2)原先的样本在新的方向上投影后的值

具体来说,(1)求出训练样本的协方差矩阵 对应代码  “sigma = (1.0/m)*patches*patches';

                    (2)通过MATLAB自带的SVD函数对求得的协方差矩阵进行分解,得到两个酉矩阵u和v,以及一个对角矩阵s,其中所得u矩阵中的每一列就是这些数据样本的新的方向向量,排在前面的向量则代表主方向,依次类推。(对于SVD函数,SVD理论的几何意义就可以做如下的归纳:对于每一个线性映射T: K → K,T把K的第i个基向量映射为K的第i个基向量的非负倍数,然后将余下的基向量映射为零向量。对照这些基向量,映射T就可以表示为一个非负对角阵。也有人说奇异值分解(sigular value decomosition,SVD)是一种正交矩阵分解法,它是一种可靠的分解法,比QR分解(QR分解是将矩阵分解成一个正规正交矩阵与上三角矩阵)花费时间多,使用svd分解法的用途是解最小平方误差法和数据压缩)  对应代码“[u s v] = svd(sigma);”

                     (3)用u的转置乘以样本值patches便可得到降维后的样本值  “xRot = u'*patches;”

xRot值的几何意义是原乡点到该方向上的距离值,但是这个距离有正负之分,因此满足上边所讲的PCA的两个主要任务。用u*xRot即可还原出patches。


4.可视化经过PCA变换后的样本的协方差矩阵 对应代码“covar = zeros(size(patches, 1));  covar = (1./m)*xRot*xRot';  imagesc(covar);”

其中imagesc函数则是将cover中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色来渲染。

5.对patch进行99%的方差保留的PCA计算  对应代码“k=0;
                                                              ss=diag(s);
                                                              k = length(ss((cumsum(ss)/sum(ss))<=0.99));
                                                              xHat = zeros(size(patches));  
                                                              xHat = u*[u(:,1:k)'*patches;zeros(n-k,m)];”


6.代码:patches=zffsampleIMAGES;
randsel=randi(size(patches,2),204,1);
display_network(patches(:,randsel),8);%显示某些样本
figure('name','Raw images');


%2.1 PCA处理以做可视化 均值为0处理
patches = patches-repmat(mean(patches,1),size(patches,1),1);%求的是每一列的均值


xRot=zeros(size(patches));
[n,m]=size(patches);
sigma=(1/m)*patches*patches';
[u s v]=svd(sigma); %SVD理论的几何意义就可以做如下的归纳:
                    %对于每一个线性映射T: K → K,T把K的第i个基向量映射为K的第i
                    %个基向量的非负倍数,然后将余下的基向量映射为零向量。对照这些基向量,
                    %映射T就可以表示为一个非负对角阵。
xRot=u'*patches;




%2.2 可视化 经过PCA变换后的新样本的协方差矩阵
covar=zeros(size(patches,1));
covar=(1/m)*xRot*xRot';
figure('name','Visualisation of covariance matrix');
imagesc(covar);


k=0;
ss=diag(s);
k = length(ss((cumsum(ss)/sum(ss))<=0.99));
xHat = zeros(size(patches));  
xHat = u*[u(:,1:k)'*patches;zeros(n-k,m)];


figure('name',['PCA processed images ',sprintf('(%d / %d dimensions)', k, size(patches, 1)),'']);
display_network(xHat(:,randsel));
figure('name','Raw images');
display_network(patches(:,randsel))

;

原图


新样本数据的协方差矩阵


保留99%的方差后的PCA还原原始数据


接下来还会再继续讲述PCA Whitening 以及ZCA Whitening



猜你喜欢

转载自blog.csdn.net/SusanZhang1231/article/details/52195434