机器学习——主成分分析 PCA

一、PCA的概念与原理

1.1.算法

主成分分析是一种经典的降维技术,用于数据的探索性分析和特征提取。简单来说,PCA可以帮助我们找到数据中的主要信息,并将其表示为一组新的特征,这些特征被称为主成分。

1.2.PCA目标

PCA的目标是找到一个新的特征空间,其中每个新特征(主成分)都是原始特征的线性组合。这些主成分按照解释方差的贡献程度排列,从最重要的主成分到最不重要的主成分。

最小重构误差:求重构误差最小的投影方向,即让样本点到投影超平面的距离都足够近。

最大可分性:求散度最大的投影方向,即让样本点到投影超平面的投影尽可能的分开。

1.3.PCA原理

1.3.1.基于最大可分性推导

主成分分析日标就是寻找最能够代表原始数据分布特性的投影方向,假设有n个d维的样本:x1.x2,x3,x4,......,xn,经过投影变换z1=a1xi 得到在低维坐标系的投影为a1x1,a1x2,a1x3,

a1x4,......a1xn,要使原样本在低维坐标系具有最大可分性,即样本点在这个投影超平面上尽可能的分开,考虑方差:

为了更方便,我们可以对样本进行中心化处理,则可以推出:

                                               

即a1是S的一个特征向量,对应着最大的特征值。

1.3.2.基于最近重构误差推导

假定数据样本进行了中心化,即\sum_{i}^{}xi=0 ;再假定投影变换后得到的新坐标系为 {w1,w2,

...,wd},其中wi是标准正交基向量,若丢奔新坐标系中的部分坐标,即将维度降低到d<d,则样本点xi在低维坐标系中的投影是zi=(zi1,zi2,...,zid)。

即等价于最大化方差:

1.4.算法步骤

1:数据标准化
在PCA之前,我们需要对数据进行标准化,确保每个特征都有相同的尺度。这一步很重要,因为PCA是基于协方差矩阵的,而不同尺度的特征会影响协方差的计算。

2:计算协方差矩阵
接下来,我们计算标准化后的数据的协方差矩阵。协方差矩阵的元素表示了不同特征之间的关系,以及它们如何共同变化。

3:计算特征值和特征向量
然后,我们计算协方差矩阵的特征值和特征向量。特征向量表示主成分的方向,而特征值表示主成分的重要性。

4:选择主成分
我们按照特征值的大小降序排列特征向量,并选择前k个特征向量作为主成分,其中k是我们希望降维到的维度。

5:投影数据
最后,我们将原始数据投影到选定的主成分上,从而获得一个低维度的表示。这个新的表示保留了尽可能多的原始数据的方差。
 

二、实现(PCA运用于人脸识别)

2.1.PCA人脸数据降维

代码:

pictures=dir('C:\Users\Yezi\Desktop\机器学习\实验1:PCA算法\face10080\*.bmp');
sample=[];% 样本矩阵
for i=1:length(pictures)
    picture=imread("C:\Users\Yezi\Desktop\机器学习\实验1:PCA算法\face10080\"+pictures(i).name);
    picture=double(picture);
    picture=picture(:);% 单张图片拉成列向量
    sample=[sample,picture];
end
% PCA 主流程
meanFace=mean(sample); % 求样本均值
meanFace=ones(size(sample,1),1)*meanFace;% 矩阵化样本均值
sample=sample-meanFace; % 样本中心化:减去样本均值
covMatrix=sample*sample';% 求样本的协方差矩阵
[egienvectors,diagonalMatrix]=eig(covMatrix);% 协方差矩阵的特征值分解
egienvalues=diag(diagonalMatrix);% 取特征值
[egienvalues,order]=sort(egienvalues,'descend');% 特征值降序排序
egienvectors=egienvectors(:,order);% 将特征向量按特征值降序排序
2.2.PCA人脸重构

代码:

oneFace=sample(:,1);
for dimension=20:20:160
    egienvector=egienvectors(:,1:dimension);
    rebuildFace=egienvector*(egienvector'*oneFace);
    rebuildFace=reshape(rebuildFace,100,80);
    index=dimension/20;
    subplot(2,4,index);
    imshow(mat2gray(rebuildFace));
    xlabel(sprintf("dimension=%d",dimension));
end

实现基于不同维度的特征向量重构人脸,并将结果显示在一个子图网格中。每个子图对应一个特定的维度值,同时还在每个子图上方显示该维度的标签。这样可以观察不同维度下重构人脸的效果,并比较不同维度对重建结果的影响。

2.3.PCA人脸可视化

二维:                                                              三维:

代码:

visualizeDataTemp=[];
%5个人
for i=0:4
    visualizeDataTemp=[visualizeDataTemp,sample(:,i*10+1:i*10+10)];
end
 
for dimension=2:3
    egienvector=egienvectors(:,1:dimension);
    visualizeData=egienvector'*visualizeDataTemp;
    colors=[];
    for i=1:50
        color=floor((i-1)/10+1)*20;
        colors=[colors,color];
    end
    if dimension==2
        scatter(visualizeData(1,:),visualizeData(2,:),[],colors);
    else
        scatter3(visualizeData(1,:),visualizeData(2,:),visualizeData(3,:),[],colors);
    end
end

将经过PCA降维处理的人脸样本进行可视化展示。具体而言,对于每个维度值,将选择相应数量的特征向量,并将样本数据投影到这些特征向量上,得到降维后的可视化数据。然后使用散点图或3D散点图将数据点绘制出来,并根据数据点的分组信息为其指定不同的颜色。

2.4.PCA人脸识别

不同维度的识别率:                                         不同knnk值的识别率:

代码:

trainNumber=5;
testNumber=6;
trainData=[];
testData=[];
for i=0:14
    trainData=[trainData,sample(:,i*11+1:i*11+trainNumber)];
end
for i=0:14
    testData=[testData,sample(:,i*11+trainNumber+1:i*11+11)];
end
result=[];
for knnK=1:8
    for dimension=10:10:160
        egienvector=egienvectors(:,1:dimension);
        trainDataTemp=egienvector'*trainData;
        testDataTemp=egienvector'*testData;
        error=0;
        testDataNumber=size(testDataTemp,2);
        trainDataNumber=size(trainDataTemp,2);
        for i=1:testDataNumber
            distances=[];
            for j=1:trainDataNumber
               distance=0;
               for k=1:dimension
                  distance=distance+(testDataTemp(k,i)-trainDataTemp(k,j))^2; 
               end
               distances=[distances,distance];
            end
            [distances,index]=sort(distances);
            rightIndex=floor((i-1)/testNumber)+1;
            testIndex=0;
            knn=[];
            for k=1:knnK
               knn=[knn,floor((index(k)-1)/trainNumber)+1];
            end
            [modeIndex,times]=mode(knn);
            if times==1
                testIndex=knn(1);
            else
                testIndex=modeIndex;
            end
            if testIndex~=rightIndex
                error=error+1;
            end
        end
        rate=(testDataNumber-error)/testDataNumber;
        result=[result,rate];
    end
end
X=10:10:160;
Y=1:8;
result=reshape(result,16,8);
result=result';
waterfall(X,Y,result);%不同k值不同维度的识别率
%plot(X,mean(result));%不同维度的平均识别率

三、总结

3.1.什么时候使用PCA


如果你想要访问隐藏的特征,而你认为这些特征可能显示在你的数据的图案中,你要做的所有工作可能就是要确定是否存在隐藏的特征,也就是说,你只想知道第一个主成分的大小。
降维
a.帮你可视化高维数据
b. 减少噪声, 较大的主成分表示主要数据,较小的主成分表示可能的噪声,抛弃小的主成分即可消除噪声
c.在使用另一个算法之前,先用PCA进行预处理。也就是归纳或分类任务
 

3.2.PCA优点

降低维度:PCA可以将高维数据映射到较低维度的空间,从而减少特征的数量。这有助于去除冗余信息,提高计算效率,并且可以更好地可视化和理解数据。

去相关性:PCA通过线性变换将原始特征转换为一组无关的主成分。这是通过选择具有最大方差的主成分实现的,从而减少特征之间的相关性。这使得数据更易于处理和分析,提高了模型的性能和可靠性。

数据解释性:PCA选择的主成分对应于数据中的最大方差,因此它们包含了最重要的信息。这使得我们能够通过分析主成分来理解数据的结构和模式,以及不同特征之间的关系。

数据压缩:PCA将高维数据映射到较低维度,从而实现了数据的压缩。这可以减少存储空间的需求,并且在处理大规模数据时提高计算效率。


3.3.PCA缺点

数据预处理:PCA对数据的预处理要求较高。标准化是必要的,因为PCA是基于特征之间的协方差矩阵进行计算的。如果数据不经过合适的预处理,可能会导致结果不准确或不可靠。

特征解释性:PCA虽然能够保留最重要的信息,但在降维的过程中也可能丢失一些较低方差的特征。这些特征可能对于特定任务的解释和理解是有意义的,但在降维过程中被忽略了。

非线性问题:PCA是一种线性降维方法,它假设数据是线性可分的。对于非线性问题,PCA可能无法捕捉到数据的复杂结构。针对非线性问题,可以使用核PCA或其他非线性降维方法。

主成分选择:确定要保留的主成分数量是一个挑战。选择较少的主成分可以实现较高的压缩率,但可能会丢失一些重要信息。而选择较多的主成分可能会保留过多的冗余信息。因此,在选择主成分的数量时需要权衡。

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值