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