PCA主成分分析入门(一)(MATLAB实战)

前言:首先参考了不少的博客文章,形式上貌似懂了,但是没有实际代码的实现,于是在一个夜晚,我从MATLAB中实现了一下

 

首先,主成分分析就是要看看数据集中占比重要的是什么,原理性质的东西不做多讲,直接从实战来理解

首先要有下面这个基础:

左边[1/sqrt(2),1/sqrt(2)]这个单位基向量 代表我们映射后的横轴  也就是斜率为1单位向量

[-1/sqrt(2),1/sqrt(2)] 这个单位基向量  代表映射后的纵轴   斜率为-1的单位向量

(1,1) (2,2) (3,3) 代表我们正常的坐标系中的点  横向是(1,0) 纵向是(0,1)的基构建的坐标系

那么经过上图中的运算之后,我们得到了[2/sqrt(2),0]  [4/sqrt(2),0]  [6/sqrt(2),0]这三个坐标,它的涵义是在y=x这条直线上,也就是[1/sqrt(2),1/sqrt(2)] 这个基向量为方向的一维坐标上的坐标点。图形如下

上卖弄这两条直线是垂直的  可能matlab画出来就不垂直了  大家可以用我下面的源代码去跑跑

 

有了上面基础  留个印象,就是我们把一组坐标系换成另一组坐标系中要怎么将元素填充进矩阵中做运算

先看我们图中的结果:为什么是斜着的  因为matlab画出来的图不拖动 很难看出图中两条直线是垂直关系

这个结果说明,经过PCA变换,我们的数据没有浮动了   投映射在了它主成分向量的方向上:代码和注释都在下面,最后有一个总结

现在将matlab代码和代码中的注释贴到下面:

%简要从点的角度来说明PCA干了什么 
%找到一个最佳的方向,在这个方向上 保留了我们信号的大部分信息

clc 
clear
close all
x=-4:0.1:4;
y=x;
y1=-x;
figure(1)
plot(x,y)
hold on 
plot(x,y1)
hold on
xx=[1,2,3]
yy=[1,2,3]
hold on 
plot(xx,yy,'*')


X=[2.5 0.5 2.2 1.9 3.1 2.3 2   1   1.5 1.1
   2.4 0.7 2.9 2.2 3.0 2.7 1.6 1.1 1.6 0.9];
size = size(X);
m_X=[0;0];
for i=1:size(2)
    m_X=m_X+X(:,i);
end
m_X=m_X/size(2);%样本均值
zhongxinhua_X=X-m_X;
D = cov(zhongxinhua_X');%求协方差矩阵
[fVector,fValue]=eig(D);%fVector第一列是第一个特征值对应的特征向量,第二列是第二个特征值对应的特征向量
%这里求出来的fVector每一列已经是单位向量了
featureValue = diag(fValue);%最大特征值对应的特征向量就是我们要缩放的矩阵W   
z=fVector(:,2)'*zhongxinhua_X;%得到的z是在我们选定的特征向量上的投影  的坐标  可以看成是(z1,0)(z2,0)....(zn,0)
%所以要将z变换会我们原来的坐标需要这样
zero = zeros(1,size(2));
x_y0=[z;zero];%这是在我们主成分分析最大方向上的坐标集
featureVectory=[fVector(:,2) fVector(:,1)];%横坐标是第二个特征值   纵坐标是第一个特征值
x_yX=inv(featureVectory')*x_y0;
figure
scatter(zhongxinhua_X(1,:),zhongxinhua_X(2,:));
hold on
scatter(x_yX(1,:),x_yX(2,:));

%特征向量fVector用了第二个
kk=fVector(:,2);
k=kk(2)/kk(1);
x=min(zhongxinhua_X(1,:)):0.1:max(zhongxinhua_X(1,:));
y=k*x;  %这里可以说明特征向量值的第二列就是主成分分析的那个方向向量   根据向量乘法的物理意义可以知道
        %这就是投影在我们该特征向量上的值(该特征向量是一个单位基向量)
hold on
plot(x,y)
kkk=fVector(:,1);
k1=kkk(2)/kkk(1);
y=k1*x;
hold on
plot(x,y)

现在来总结一下:

1. 对原始数据做中心化(减去均值)

2. 对中心化后的数据做协方差运算   (MATLAB函数)conv

3. 对协方差矩阵求解特征向量和特征值  (MATLAB语法)[fVector,fValue]=eig(D);

4 fVector 每一列是我们的特征向量  fValue 每一个值是我们的特征向量对应的特征值

5 选择特征值最大的特征向量,意味着在这个方向上,集中了我们数据的大部分信息

6 用特征值大的特征向量重构信号   W*x=y    对于二维信号就是我们数据在特征向量方向上的投影,出来的y是在特征向量为坐标系的点的坐标(一维坐标意味着到原点的距离)

7 还原到原来的坐标中观察

   (1) (选中的特征列向量,该列向量的单位正交基)的逆  左乘 第一行是y第二行是0的矩阵就可以了  (为什么是这样,一开始我们的引入给了我们参考,从一个坐标系到另一个坐标系是那样运算的,那么反过来求原来坐标系,我们就需要直接左乘它的逆)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值