数据降维之主成分分析法(PCA)

PCA(主成分分析法)数据降维(Proj No.1)

原理解释

所谓的主成分分析,不过是在高维的空间中寻找一个低维的正交坐标系,比如说在三维空间中寻找一个二维的直角坐标系。那么这个二维的直角坐标系就会构成一个平面,将三维空间中的各个点在这个二维平面上做投影,就得到了各个点在二维空间中的一个表示,由此数据点就从三维降成了二维。

这个过程的关键在于,我们如何选取这个低维的坐标系,即坐标系原点在哪?各个轴朝哪个方向?一个原则就是使得各个点到到这个平面的距离平方和达到最小。由此,通过简单地数学推导,就能得到原点的表达公式和坐标系的各个基向量的表达公式。

PCA算法流程

下面以基于矩阵的视角写出PCA算法的算法流程,输入为p*N矩阵X,输出为d*N矩阵Y。矩阵的每一列都表示一个对象,每一行都表示对象的一个特征表示。

这里写图片描述

源代码

%%
%编写程序,实现PCA和LEE算法
%对图像进行降维实验,并显示降维重建后的图像
%运行已有程序,和自己的对比
%实验报告(伪代码(或流程图)、源代码、实验结果及分析)
%%
%编写程序,实现PCA和LEE算法
%对图像进行降维实验,并显示降维重建后的图像
%运行已有程序,和自己的对比
%实验报告(伪代码(或流程图)、源代码、实验结果及分析)
clc
clear
addpath(genpath(pwd));%将子孙文件添加到工作目录
load AR %导入数据
d = 20;

%%
AR = double(AR);%双进度化
[p ,N] = size(AR);%特征维度和对象数目
% for i = 1:N
% image = AR(:,i);
% image = reshape(image,50,40);
% imshow(mat2gray(image));%对原矩阵归一化
% end
x0 = mean(AR,2);%计算样本均值
AR_shift = AR - repmat(x0,1,N);%中心平移每个训练样本
%计算协方差矩阵的(n-1)倍,不用内置函数cov,提高代码的重用率和运行速度
Sigma = AR_shift*AR_shift';
%Sigma = cov(AR')*(N-1);
[W,D] = eigs(Sigma,d);%前d个特征向量作为wi
Lambda = diag(D);%提取特征值
%%
close all;
k = 1;
Y = W'*AR_shift(:,k);%第k个图像的输出表示
X_rebuid = W*Y + x0;%第k个图像的重建还原

image = AR(:,k);
image = reshape(image,50,40);
imshow(mat2gray(image));%对原矩阵归一化

figure;
image_re = X_rebuid;
image_re = reshape(image_re,50,40);
imshow(mat2gray(image_re));%对原矩阵归一化

实验结果与分析

实验结果

选取了2000x1680的数据集进行了测试,选取降维后维数为20,其降维前后的图像(降维后的图像指的是投影点还原到原空间对应的坐标值重构出的图像)如下所示(选取第一个点为代表):

降维前的图像

![降维后的重建图像

实验结果分析

我们使用别人制作的降维工具箱“drtoolbox”重新进行计算并和我的程序结果进行比较。工具箱的使用代码和结果如下:

%% 使用工具箱进行进行降维来和我的实验结果进行比较
%% 使用工具箱进行进行降维来和我的实验结果进行比较
clc
clear
close all

method = 'LLE';%可选LLE或者PCA
addpath(genpath(pwd));

% 产生测试数据
%[X, labels] = generate_data('helix', 2000);
if strcmp(method,'PCA')
    load AR %导入数据
    [p,N] = size(AR);
    X = double(AR);%导入数据
else
    load face_images %导入数据
    [p,N] = size(images);
    X = double(images);%导入数据
end


% 估计本质维数
%no_dims = round(intrinsic_dim(X, 'MLE'));
%disp(['MLE estimate of intrinsic dimensionality: ' num2str(no_dims)]);
d = 2;
k = 12;
% PCA降维或LLE降维
[mappedX, mapping] = compute_mapping(X', method,d);
Y = mappedX';

if strcmp(method,'PCA')
    x0 = (mapping.mean)';
    W = (mapping.M);
    AR_shift = X - repmat(x0,1,N);

    %%
    close all;
    k = 1;
    y = Y(:,k);
    X_rebuid = W*y + x0;%第k个图像的重建还原

    image = AR(:,k);
    image = reshape(image,50,40);
    imshow(mat2gray(image));%对原矩阵归一化

    figure;
    image_re = X_rebuid;
    image_re = reshape(image_re,50,40);
    imshow(mat2gray(image_re));%对原矩阵归一化

end

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jITcuPJk-1595493052714)(pics/pic3.eps)]{width=“8cm”}](https://img-blog.csdn.net/20180325030002643?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1c29uZ25vMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdwLy7xu-1595493052716)(pics/pic4.eps)]{width=“8cm”}](https://img-blog.csdn.net/20180325030011630?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1c29uZ25vMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

当然,我们也可以比较我的程序和工具箱程序的误差的大小,比如 L 2 L_2 L2误差。都很简单,暂且不提。

PCA 过程的一个优雅的记忆方式

PCA 方法,在别的领域有叫 POD 的,有叫 KL 变换的。PCA 的过程看起来非常繁琐难记,面试的时候,可能要推导才能想起来,其实非常地简单,下面我们提供一个优雅的记忆方式。

假设 X X X是一个矩阵,它的每一列是一个数据点,并且它经过了去中心化。

假设它的奇异值分解为 X = U Λ V ∗ X = U \Lambda V^* X=UΛV,那么降维后的数据点在原空间的表示(低秩逼近,表示维数不变)为:
X ~ = U Λ ~ V ∗ \tilde X = U \tilde \Lambda V^* X~=UΛ~V
这里的 Λ ~ \tilde \Lambda Λ~ Λ \Lambda Λ的一个 truncation,即让对角线上后面几个较小的特征值用 0 替换。

其中, U U U 的前几列就是低维的坐标系, Λ ~ V ∗ \tilde \Lambda V^* Λ~V 的每一列,就是降维后的每个点在低维坐标系下的坐标表示。

这种记忆方式,不涉及矩阵 size 的变化,当时内涵适合矩阵规模变化时一致的。比如说,不管是对 U U U 做 truncate,对 U U U 做 truncate,还是对 V V V 做 truncate,或者对其中的几个做 truncate,本质上是一码事,这是因为:

X = U Λ V ∗ = Σ σ i u i v i ∗ X = U \Lambda V^*=\Sigma\sigma_iu_iv_i^* X=UΛV=Σσiuivi

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值