PCA主成分分析之三维演示(Matlab)

写这个的主要原因是实验课上的要求,原本需要写一个演示 PCA 原理的 demo ,按照实验指导书上来说,在二维上演示就好了,但是为了折腾和无聊装逼,我写了这个程序,我觉得更能直观的看出 PCA 的原理。可以完整的看到数据从三维降到二维,再到一维的整个过程。别看是简简单单的感觉,要写出来,还是需要对原理有比较深刻的认识的,代码没有参照网上,仅靠个人推导和联想,多多指教。

目录

PCA主成分分析之三维演示(Matlab)

目录

原理简介

结果展示

源代码

体会

原理简介

主成分分析(principal component analysis PCA),通过正交变换将一组可能存在相关性的变量转换成一组线性不相关的变量,转换之后的这组变量叫做主成分。常用于提取数据主要特征变量,常用于高维数据的降维。在用统计分析的方法研究多变量的时候,变量的个数太多,增加了复杂性,由于变量之间是有一定的相关性的,也就是说不同的变量所代表的全局信息是有重叠,有冗余的。其算法流程如下图所示:

结果展示

如图1所示绘制随机的3维点,如图2所示,选取特征值最大的两个特征向量进行投影,绘制其投影平面,如图3所示,绘制出3维到2维的投影垂线以示意这个过程的原理。如图4所示为最后投影得到的二维点在三维坐标中的位置,可以看到,这些点都位于一个平面上,如图5所示为二维点到一维点的投影线,所选的投影基为特征值最大的特征向量,如图6所示,绘制了二维到一维的投影垂线,如图7所示为二维降为一维的点。整个过程演示了一个三维特逐渐降为一维的过程,特征有所损失,但是仍能被区分。

图1 随机三维点

图2 三维到二维投影面

图3 三维到二维的投影过程

图4 三维到二维的投影点

图5 二维到一维的投影线

图6 二维到一维的投影过程

图7 二维到一维的投影点

源代码

function PCAdemo

close all;clear;clc;

h_figure = figure;

mu = [0 0 0];

%协方差矩阵,对角为方差值0.3,0.35

dim = 3;

var = [0.2 0 0; 0 0.5 0; 0 0 0.8];

samNum = 100;

data = mvnrnd(mu,var,samNum);

h_plotMain = plot3(gca,data(:,1),data(:,2),data(:,3),'o',...

'MarkerSize',5,'MarkerFaceColor','k');

xlim([-2 2]);ylim([-2 2]);zlim([-2 2]);

grid on;axis square;hold on;

pause();

covdata = cov(data);%求协方差矩阵

[eigVector, eigValue] = eig(covdata);%求协方差矩阵的特征值和特征向量

eigValue = diag(eigValue)';

[eigValue_sort, IX] = sort(eigValue, 2, 'descend');

eigVector_sort = [];

for i = 1:dim

tempIX = IX(i);

eigVector_sort = [eigVector_sort eigVector(:, tempIX)];

end

base_3to2 = eigVector_sort(:,1:2);%三维降2维

base_3to1 = eigVector_sort(:,1);%三维降1维

base_3to2 = base_3to2';

base_3to1 = base_3to1';

%%%%%绘制3维变成2维度的投影平面%%%%%

A = base_3to2(1, :);%新基i帽(相对原基)

B = base_3to2(2, :);%新基j帽(相对原基)

C = [0 0 0];

syms x y z;

D = [ones(4, 1), [[x, y, z]; A; B; C]];%由空间解析几何的内容知道D的行列式等于零就是平面方程。

detd = det(D);

z = solve(detd,z);

ezmesh(z,[-2, 2, -2, 2]);

pause();

%%%%%%%%%%%%

data_proj3_2 = base_3to2*data';%投影到新基坐标(相对新基)

data_proj3_1 = base_3to1*data';%投影到新基坐标(相对新基)

data_proj3_2 = data_proj3_2';

data_proj3_1 = data_proj3_1';

data_proj_respect_to_orienbasis3_2 = [];%新基坐标用原基表示

data_proj_respect_to_orienbasis3_1 = [];%新基坐标用原基表示

for i = 1:samNum

data_proj_respect_to_orienbasis3_2 = [data_proj_respect_to_orienbasis3_2;...

data_proj3_2(i,1)*base_3to2(1,:)+data_proj3_2(i,2)*base_3to2(2,:)];

data_proj_respect_to_orienbasis3_1 = [data_proj_respect_to_orienbasis3_1;...

data_proj3_1(i)*base_3to1(1,:)];

end

%绘制3维降为2维后的数据

h_plot3_2 = plot3(gca,data_proj_respect_to_orienbasis3_2(:,1),...

data_proj_respect_to_orienbasis3_2(:,2),data_proj_respect_to_orienbasis3_2(:,3),...

'o','MarkerSize',5,'MarkerEdgeColor','g','MarkerFaceColor','g');

%绘制3维降为2的投影虚线

hl3_2 = [];

hl3_1 = [];

for i = 1:samNum

dd = [data_proj_respect_to_orienbasis3_2(i,:);data(i,:)];

hl3_2(i) = plot3(gca,dd(:,1),dd(:,2),dd(:,3),'-.','markersize',10);

end

pause();

delete(h_plotMain);delete(hl3_2);

pause();

%绘制3维降为1的基准线

h_zhixian = plot3(gca,data_proj_respect_to_orienbasis3_1(:,1),...

data_proj_respect_to_orienbasis3_1(:,2),data_proj_respect_to_orienbasis3_1(:,3),...

'color','r','linewidth',2);

pause();

%绘制3维降为1的数据

h_plot3_1 = plot3(gca,data_proj_respect_to_orienbasis3_1(:,1),...

data_proj_respect_to_orienbasis3_1(:,2),data_proj_respect_to_orienbasis3_1(:,3),...

'o','MarkerSize',5,'MarkerEdgeColor','r','MarkerFaceColor','r');

%绘制3维降为1的投影虚线

for i = 1:samNum

dd=[data_proj_respect_to_orienbasis3_1(i,:);data_proj_respect_to_orienbasis3_2(i,:)];

hl3_1(i)=plot3(gca,dd(:,1),dd(:,2),dd(:,3),'-.','markersize',10);

end

pause();

delete(h_plot3_2);

delete(hl3_1);

delete(h_zhixian);

end

可以直接复制以上代码,或者可以下载链接:https://download.csdn.net/download/qq_33826564/10574325

GitHub: https://github.com/swq123459/PCA-3D-demo

体会

1.使用PCA对数据进行降维的思路:将输入的样本看成一个随机向量,即

X⃗={X1,X2,X3,...XN}N=0,1,2...(1) (1) X → = { X 1 , X 2 , X 3 , . . . X N } N = 0 , 1 , 2...

有M个样本,说明发生了M次X⃗ X →事件,X⃗ X →有N维,每一维为单独的随机变量XN X N,若要将降维,降维后的需满足其内部各维之间的协方差为0,已保证降维后的数据无冗余,每一位表示的信息不正交不重叠;同时各维的方差需要最大,因为方差大代表着数据集中性越差,说明越方便被辨别。随机向量协方差矩阵中,各维均值位于对角线,协方差位于其他非对角线位置,我们需要对角线值最大,其他位置值为0,这不免让我们想到了矩阵的对角化。对角化完成的功能真是将矩阵除对角线为其他元素变成0.矩阵的对角化表达式为

B=T−1AT(2) (2) B = T − 1 A T

其中A为待对角化矩阵,T为A的特征向量组成的矩阵,这里我们将A看成是的协方差矩阵,那么T就是这个协方差矩阵特征向量组成的矩阵。对角化的过程已经完成了协方差0的任务,接下来使各维的方差最大,即B的对角线元素最大。因为特征值大的特征向量是矩阵变换的主要方向,所以其占的变换成分应该比较大,对B的对角线元素影响也比较大,所以这里才有根据特征值来排序特征向量来组成矩阵T的方法。按照成分的贡献率,可以执行降维,维度贡献率不能少于80% 80 %。

在计算协方差矩阵的时候,A为样本数据集矩阵,N为样本维数,需要注意的是样本数据集A必须去均值,即使样本各维均值为0,这样使用该公式计算出来的才是协方差矩阵。

C=1NAAT(3) (3) C = 1 N A A T

在执行数据降维的时候,从二维数据降至一维的变换为A,得到的这个一维的数据是以A的基为基的坐标再乘以这个基的范数,若这个变换本身就同其基一致的话,得到的一维数据为其投影长度。Matlab中计算特征向量的函数已经完成了特征向量单位化的操作,所以,将数据同其内积得到的便是投影长度。实验中涉及将这个投影长度在原来的维度中显示的问题,只要将这个投影长度乘以原来投影的基向量就行了。

Matlab中如果要在上写文中索引当前axes,进行绘图, 只需要进行一次hold on,就可以防止plot句柄的自动回收。

三维主成分图matlab,PCA主成分分析之三维演示(Matlab)相关推荐

  1. matlab批量生成灰度图像_科学网—matlab彩色图像的批处理转换为灰度、二值和主成分图图像 - 金秀良的博文...

    这段代码主要用来进行图像的批处理转换为灰度.二值和主成分图图像,希望给大家借鉴.其中 RGB to bw可以直接实现,但是效果不好,所以先用RGB to gray,之后再gray to bw.RGB ...

  2. PCA主成分分析遥感影像融合

    融合目的 多光谱影像具有高光谱分辨率和低空间分辨率,全色影像具有高空间分辨率和低光谱分辨率,将这两种影像进行融合就可以得到同时具有高空间分辨率和高光谱分辨率的影像 PCA主成分变换影像融合 PCA主成 ...

  3. 【三维点云处理】PCA主成分析+实践(一)

    PCA主成分析+实践 PCA简介 python代码 实验结果 PCA简介 PCA 旨在找到线性不相关的正交轴,也称为m维空间中的主成分 (PC),以将数据点投影到这些 PC 上.第一个 PC 捕获数据 ...

  4. matlab 自带pca函数,matlab实现主成分分析 princomp函数 PCA中有这个函数

    matlab实现主成分分析 princomp函数 最近看了些主成分分析,混迹Matlab论坛,翻了n多帖子,对princomp函数有了些了解. 在此只讲一些个人理解,并没有用术语,只求通俗. 贡献率: ...

  5. 三维点云学习(1)上-PCA主成分分析 法向量估计

    三维点云学习(1)上 环境安装 1.系统环境 win10 或者 ubuntu 2. Anaconda3+python3.6 使用Anaconda创建的conda虚拟环境进行python的编写 环境安装 ...

  6. 机器学习算法之PCA(主成分分析)人脸识别,最小重构误差和最大化散度证明,PCA主成分分析原理剖析,PCA人脸识别matlab实现,PCA人脸识别python实现

    目录 PCA介绍 PCA大致思路 PCA人脸识别(特征脸法) matlab代码实现 Python代码实现 PCA几何解释 PCA证明最小重构误差和最大散度等价 实验结果 PCA介绍 主成分分析(Pri ...

  7. 影像组学视频学习笔记(23)-主成分析PCA、降维和特征筛选的区别、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(23)主要讲解: 主成分析PCA,影像组学降维和特征筛选的区别 0. PCA(Principal component analysis) ...

  8. 基于PCA主成分分析的BP神经网络回归预测MATLAB代码

    基于PCA主成分分析的BP神经网络回归预测MATLAB代码 代码注释清楚. 先对数据集进行主成分分析,自主根据贡献率选择主成分:同时计算KMO验证值:用PCA以后数据进行BP神经网络回归预测. 可以读 ...

  9. spss主成分综合得分_【2020.】这种主成分得分图SPSS能够实现吗?

    背景 一后台询问,如下这种主成分分析图怎么实现的,SPSS可以吗?当然可以了,不过一般人不知道怎么做的,呵呵! 常见的SPSS主成分分析的二维图和三维图如下,确实不咋滴,是吧,看松哥怎么让它重生的. ...

最新文章

  1. iOS 11开发教程(十七)iOS11应用视图之使用按钮接收用户输入
  2. Python-Evoked地形图可视化
  3. Android的按钮单击事件及监听器的实现方式
  4. python语言中整数1010的二进制表示_爱校码 - Python 语言基础二
  5. html5添加到安卓桌面图标,Android向桌面添加快捷方式,使其指向特定的网页
  6. 英文歌的计算机普,听到一首音乐 想找歌名(急/英文歌)
  7. elasticsearch索引和映射
  8. EmEditor学习
  9. 电子书下载:Programming Microsoft LINQ in Microsoft .NET Framework 4
  10. 系统上线日期被老外逼得延期了!
  11. C#计算程序的运行时间
  12. Hbase面试 描述 Hbase 中 scan 和 get 的功能以及实现的异同.
  13. 使用mongoose-paginate-v2查询缓慢问题
  14. NET上传大文件出现网页无法显示的问题 默认的上传文件大小是4M
  15. vant组件做表格_有赞团队的vant ui组件库van-field使用
  16. EXPLORING BALANCED FEATURE SPACES FOR REP-RESENTATION LEARNING(2022.5.18)
  17. stm32使用XR20M1172详细攻略·SPI转UART串口
  18. office2010案例一
  19. Qt5.14.2使用虚拟键盘
  20. 福州118个地名解读

热门文章

  1. java包裹邮费计算_猿实战16——承运商之搭建你的运费基石
  2. KVC基本原理和用法
  3. ONF推新版Atrium 获得OpenDaylight支持
  4. EB-Boost :智慧景区共享单车中长期投放量精准预测方法
  5. 苹果手机内屏幕出现彩色条纹怎么办
  6. ElasticSearch索引模块
  7. 后期维特根斯坦的语境观“:语言游戏”与“生活形式”
  8. html5 发送邮件,【JS】使用 Emailjs 发送邮件
  9. matlab 梳妆函数,梳状函数.PPT
  10. 2DPCA的原理推导与实现