前言:首先参考了不少的博客文章,形式上貌似懂了,但是没有实际代码的实现,于是在一个夜晚,我从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的矩阵就可以了 (为什么是这样,一开始我们的引入给了我们参考,从一个坐标系到另一个坐标系是那样运算的,那么反过来求原来坐标系,我们就需要直接左乘它的逆)