deep learning PCA(主成分分析)、主份重构、特征降维

原创 2014年10月25日 22:58:58

前言

    前面几节讲到了深度学习采用的数据库大小为28×28的手写字,这对于机器学习领域算是比较低维的数据,一般图片是远远大于这个尺寸的,比如256×256的图片。然而特征向量的维数过高会增加计算的复杂度,像前面训练6000028×28的手写字,在我这个4G内存,CORE i5CPU上训练需要3个小时,如果你使用GPU当然会增加训练的速度。维数过高会对后续的分类问题带来负担,实际上维数过高的特征向量对于分类性能(识别率)也会造成负面的影响。很多人认为提取的特征维数越高对提高识别有用,然而事实并不是我们通常想的,因为一张图片中的很多特征是相关的。也就是选取合适的特征向量对提高识别率有很大的影响。因此就出现了PCA


快速PCA算法

             PCA的计算中最主要的工作是计算样本的协方差矩阵的特征值和特征向量,当然这对于MATLAB来说是非常容易的了。设样本矩阵X的大小为n×dn代表样本的个数,d代表一个样本的特征向量。则样本的散布矩阵(协方差矩阵)S是一个d×d的方阵,当维数d较大时,如维数d=10000,那么S是一个10000×10000的矩阵,这样非常消耗内存,结果就是你的笔记本电脑卡死,CPU使用率变高,内存被占的满满的,你无法做任何其他事。这时就出现了快速PCA算法。

    计算散布矩阵的特征值和特征向量,设Zn×d的样本举证X中的每一个样本减去样本均值m后得到的矩阵,即散布矩阵SZ'ZSd×d。若现在考虑矩阵R=ZZ',Rn×n,一般情况下样本目标n是远远小于样本的维数d的,R的尺寸也是远远大于散布矩阵S,然而它与S有着相同的非零特征值。

    设n维列向量vR的特征向量,则有

(ZZ')v=λv   (1)

       将式(1)的两边同时左乘Z',并利用矩阵乘法结合律得

(Z'Z)(Z'v)=λ(Z'v)    (2)

       式(2)说明Z'v为散布矩阵S=Z'Z的特征值。这说明可以计算小矩阵R=ZZ'的特征向量v,而后通过左乘Z'得到散布矩阵S=Z'Z的特征向量Z'v。

        下面以剑桥大学的ORL人脸库进行试验。下面是数据库中的样本例子:


STEP 1

     生成样本矩阵,大小为n×d,n代表样本个数,d代表一个样本的特征数。下面是代码。

ReadFaces.m

<span style="font-family:Times New Roman;"><span style="font-size:14px;">function [imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson,nPerson,bTest)
if nargin==0
    nFacesPerPerson=5;
    nPerson=40;
    bTest=0;
elseif nargin<3
    bTest=0;
end
img=imread('D:\机器学习\att_faces\s1\1.pgm');
[imgRow,imgCol]=size(img);
FaceContainer=zeros(nFacesPerPerson*nPerson,imgRow*imgCol);
faceLabel=zeros(nFacesPerPerson*nPerson,1);

for i=1:nPerson
    i1=mod(i,10);
    i0=char(i/10);
    strPath='D:\机器学习\att_faces\s';
    if(i0~=0)
        strPath=strcat(strPath,'0'+i0);
    end
    strPath=strcat(strPath,'0'+i1);
    strPath=strcat(strPath,'/');
    tempStrPath=strPath;
    for j=1:nFacesPerPerson
        strPath=tempStrPath;
        
        if bTest==0
            strPath=strcat(strPath,'0'+j);
        else
            strPath=strcat(strPath,num2str(5+j));
        end
        strPath=strcat(strPath,'.pgm');
        img=imread(strPath);
        FaceContainer((i-1)*nFacesPerPerson+j,:)=img(:)';
        faceLabel((i-1)*nFacesPerPerson+j)=i;
    end
end
save('FaceMat.mat','FaceContainer')</span></span>


STEP 2
       利用生成的样本矩阵求特征值和特征向量。(1)先求出样本矩阵特征的平均值;(2)计算协方差矩阵;(3)计算协方差矩阵前k个特征值和特征向量;(4)得到协方差矩阵的特征向量然后再归一化;(5)线性变化投影到k维。

fastPCA.m

<span style="font-family:Times New Roman;"><span style="font-size:14px;">function [pcaA V]=fastPCA(A,k)

%  A-代表样本矩阵
%  k-代表降至k维
%  PcaA-降维后的k维样本特征向量组成的矩阵,每一行代表一个样本,
%       列数k为降维后的样本矩阵的维数
%  V-主成份向量
A=load('FaceMat.mat');
[r c]=size(A);
meanVec=mean(A);%求样本的均值
Z=(A-repmat(meanVec,r,1));
covMatT=Z*Z'; %计算协方差矩阵,此处是小样本矩阵
[V D]=eigs(covMatT,k);%计算前k个特征值和特征向量
V=Z'*V;%得到协方差矩阵covMatT'的特征向量
%特征向量归一化单位特征向量
for i=1:k
    V(:,i)=V(:,i)/norm(V(:,i));
end
pcaA=Z*V;%线性变化降维至k维
save('PCA.mat','V','meanVec');</span></span>

通过前两步就提取到了样本的特征向量和特征值并存储在pcaA中。

下面将介绍可视化主成份脸。V中每一列存储的是主份特征,第一列就表示存储的第一主成份,第二列表示存储的第二主成份,以此类推。

visualize_pc.m

<span style="font-family:Times New Roman;"><span style="font-size:14px;">function visualize_pc(E)
[size1 size2]=size(E);
global imgRow;
global imgCol;
row=imgRow;
col=imgCol;
figure
img=zeros(row,col);
for ii=1:20
    img(:)=E(:,ii);
    subplot(4,5,ii);
    imshow(img,[]);
end</span></span>

main1.m

<span style="font-family:Times New Roman;font-size:14px;">function main1(k)
%k代表降至k维
global imgRow;
global imgCol;
nPerson=40;
nFacesPerPerson=5;
display('读入人脸数据.....');
[imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson,nPerson);
display('..................');
nFaces=size(FaceContainer,1);
display('PCA降维.....');
[LowDimFaces W]=fastPCA(FaceContainer,k);
visualize_pc(W);
save('LowDimFaces.mat','LowDimFaces');
display('结束.....');</span>

任意显示20个主分脸

主份脸重构
   对于一张图片,可以用如下的式子表示:

其中e_k分别是散布矩阵Sk个特征值对应的特征向量。a_1,a_2,...,a_k被称为主成份,可以如下公式表示:

那么现在可以得到主份脸重构后的图像。结果如下


==============================================================================================
第六节:convolution and pooling
==============================================================================================

怀柔风光

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BP神经网络

今天来讲BP神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识别,分类,数据压缩,数据 挖掘等领域。接下来介绍BP神经网络的原理及实现。   Contents     1. BP神经网络...

哈儿小波分解和重构(降维和升维)实现算法

【0】README 0.1)本文旨在讲解 哈儿小波变换(分解和重构)进行数据的降维和升维; 【1】intro to 哈儿小波 1.1)定义:哈尔小波变换分为哈尔小波分解和重构。本文利用哈尔小波分...

【读书笔记】基于Autoencoder 网络的数据降维和重构

是一篇学术文章,我在学习autoencoder的时候找到的,看了看。主要是想弄清楚两个问题:1. autoencoder与RBM的区别;2. autoencoder最后训练出的结果怎么用。 ...

主成分分析(PCA)原理详解

机器学习中有关特征选择的问题,其实就是要剔除和类标签无关的特征,去除噪声或者冗余。在这种情况下,需要一种特征降维的方法来减少特征数,减少噪音和冗余,减少过度拟合的可能性。PCA的思想是将n维特征映射到...

图像处理中经常用到的主成分分析PCA的原理详解

学习图像处理,无疑会涉及到降维的操作,而PCA是常用的降维算法,既然经常用到,所以需要抠明白才行啊~~     PCA(PrincipalComponents Analysis)即主成分分析,是图像...

PCA降维算法总结以及matlab实现PCA(个人的一点理解)

PCA的一些基本资料 最近因为最人脸表情识别,提取的gabor特征太多了,所以需要用PCA进行对提取的特征进行降维。 本来最早的时候我没有打算对提取的gabor特征进行降维,但是如果一个图像时64...

浅谈对主成分分析(PCA)算法的理解

以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识。本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会。 主成分分析(...

PCA 降维算法详解 以及代码示例

1. 前言  PCA : principal component analysis ( 主成分分析) 最近发现我的一篇关于PCA算法总结以及个人理解的博客的访问量比较高, 刚好目前又重新学习了一下PC...

机器学习(七):主成分分析PCA降维_Python

六、PCA主成分分析(降维) github地址:https://github.com/lawlite19/MachineLearning_Python 全部代码 1、用处 数据压缩(Data Comp...

线性SVM与SoftMax分类器

作者: 寒小阳  时间:2015年11月。  出处:http://blog.csdn.net/han_xiaoyang/article/details/49999299  声明:版权所有,转载请注明出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)