详情请参考,在站内搜索 每天进步一点点《PCA的简要学习》

一:简单的例子
例子一:
有一组体检的数据表(每个人的身高和体重)
一共七个人,每个人的身高和体重如下:
165 170 175 180 185 190 195 身高cm
90 90 91 90 90 89 90 体重kg

如果,现在给你个其中一组数据,让你去分别出哪个数据是哪个人的,我们肯定会只根据身高去判断哪个数据是哪个人的了吧。我们潜意识内已经把一个二维数据自动用了一个一维的数据进行划分了。这就是降维。我们很开心,因为就现成的维度就能划分出来。

每天进步一点点《PCA的简要学习》_特征值

例子二:
再给你七个人的数据,每个人的身高和体重如下:
165 170 175 180 185 190 195 身高cm
51 62 71 79 92 103 112 体重kg

这个稍微更好分一些了,因为我们按照哪个维度都是比较容易区分的,但是这个选择是最容易区分的维度么?

每天进步一点点《PCA的简要学习》_数据_02

很显然不是,如果我们换个角度,转一转下图像,我们就能看到隐约某个直线经过所有点的地方是更加明显的,更进一步,这个角度是,来自于身高和体重这俩维度的共同作用下产生的新的某个维度,某个方向(失去了某种现实意义的纯数字上的维度)。

所以我们大概总结一下:
1:我们一般采集样本的多个维度,都是来自于现实世界上的某种有物理含义的维度。
2:为了更加明显地区分样本,我们会选择差异较大的维度。数据离散程度很大,也就是寻找数学上的方差较大的维度,这个维度方向上数据离散的最好,分布方向明显,但是很多情况情况下,在源维度坐标下是无法轻易分别样本。
3:降维,或者转换维度,是某种“转一转/缩放 图像”的过程,其实在数学上,就是将某几个维度合并成一个维度的过程。

4:寻找方差较大的方向,是某几个维度共同作用形成的,比如将某两个维度合并成一个维度,使得得到的新的维度具有很大的方差,查一下。而且,在新的维度坐标系下,较大的维度下单个维度自身的方差最大,但是维度和其他维度之间的相关性很低,在新的维度下,能仅用几个维度就能区分,就好像是上述讲的第一个例子轻松划分一样。最好还是符合一般习惯,还是正交的。

可是大部分场景,数据不会这么好区分,一般特征有很多很多,无法图示,无法直接进行维度划分,这时候就需要PCA的数学过程了。

二:一些基本知识

投影:
一个向量在另一个向量上的分量大小,叫做投影。

假设而且空间中两个向量,A=(x1,y1), B=(x2,y2)
内积是:A⋅B=|A||B|cos(a)
A在B上的投影则是:A cos(a) = A⋅B / |A|;

A在横坐标单位向量(1,0)上的投影就是(1x1 + 0 y1)= x1

基-坐标:
是向量空间的一组线性无关的向量,比如我们正在二维直角坐标系中的坐标(3,4),可以写成
3i + 4j,i= (1,0)代表是横坐标单位向量,j = (0,1)是纵坐标的单位向量,3是在i方向上的投影,4是在j方向上的投影。是线性无关的(还是正交的)任何二维空间的任何向量都可以用这俩向量的某种线性组合表示,因此,这俩坐标称之为基-坐标,类似这样的坐标呢,是有无数种的,只要是线性无关的(一般还习惯选择正交的)。

基-坐标变换
上面说了,基坐标不是唯一的,可以做任何变换,转变成一个新的基坐标。同一个坐标点,在不同的基坐标下,坐标位置是不同的。
比如(1,1)点在i =(1,0),j=(0,1)的基坐标下是(1,1),但是在i =(1,1),j=(-1,1)的坐标下,是(1,0)。
回到上述的例子,我们看到在某个方向上,有最大的方差,最大的差异性,这个方向可以确认,然后所有的点在该方向上的投影,就是在转换后的新的一个坐标值。

方差最大的方向,就是差异性最大的方向,所有点在该方向上的投影即是转换到新坐标下的新的坐标值。

PCA定义:
PCA的目的是降噪和去冗余,是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
直白的来说,就是对一个样本矩阵,
(1)换特征,找一组新的特征来重新表示
(2)减少特征,新特征的数目要远小于原特征的数目
所以我们的目的是什么?就是找一个新的矩阵(也就是一组基底的合集),让样本矩阵乘以这个矩阵,实现换特征+减少特征的重新表示。

三:算法过程(按照实例二运行)
• Step 1:参数中心化——去均值,根据需要,有的需要归一化——Normalized;
• Step 2:求解协方差矩阵;
• Step 3:利用特征值分解/奇异值分解 求解特征值以及特征向量;
• Step 4:利用特征向量构造投影矩阵;
• Step 5:利用投影矩阵,得出降维的数据。

上述实例代码如下:

clc;clear all;close all;
set(0,'defaultfigurecolor','w') ;
x = [165 170 175 180 185 190 195];
y = [51 62 71 79 92 103 112];
figure()
subplot(1,2, 1)
scatter(x, y, 'r', 'linewidth', 5);
xlim([150,200]);
ylim([50,120]);
grid on;
xlabel('heigth');
ylabel('weight');



% 形成矩阵
dataSet = [x;y]';

%步骤一:中心化处理(均值化处理)
meanVal = mean(dataSet);
dataSet(:,1) = dataSet(:,1)- meanVal(1);
dataSet(:,2) = dataSet(:,2)- meanVal(2);

%步骤二:求协方差矩阵,且是一个对称实数矩阵,那么可以将特征向量成单位正交阵,且特征值是实数。
R = dataSet' * dataSet;

%步骤三:求特征值、特征向量
%利用:eig 进行特征值分解
[V,D] = eig(R);
[EigR,PosR] = sort(diag(D),'descend');
VecR = V(:,PosR);

%步骤四:利用特征向量构造投影矩阵
%假设降到一维,我们目前二维,降到一维
% 与投影矩阵想乘,也就是将原向量的样本的向量,纷纷在投影方向上做投影。

K = 1;
Proj = VecR(:,1:K);

%步骤五:利用投影矩阵,得出降维的数据
DataPCA = dataSet * Proj;
x0 = -40:40;
subplot(1, 2, 2)
scatter(dataSet(:,1), dataSet(:,2), 'r', 'linewidth', 5);hold on; %打点
plot(x0, Proj(2)/Proj(1)*x0, 'b', 'linewidth', 3);hold on; %绘出投影方向
xlim([-40,40]);
ylim([-40,40]);
grid on;
xlabel('heigth');
ylabel('weight');

每天进步一点点《PCA的简要学习》_线性代数_03

四:多说一点
4.1:特征去均值化
有的特征可能范围很长,最小化过程中,收敛速度会受到影响,因此需要做个平均,减少一定的差距。
假设某特征P范围:[a,b]
均值化:P = P – mean§
最终范围是:-range§/2 ~ range§/2
特点:仍然带有量纲,受量纲的范围影响

4.2:特征归一化且有去均值化
均值化不能完全解决特征之间的差距,虽然只是所有缓解,最好的是消除量纲带来的差距,进一步进行归一化。
假设某特征P范围:[a,b]
均值化:P = (P – mean§) / (range§)
最终范围是:-0.5 ~ 0.5
特点:不带有量纲,不受量纲的范围影响

4.3:仅仅进行归一化
可能有的不需要去均值化,直接归一化,也是比较直接的做法。但是在求协方差矩阵的情况下是不可取的。
假设某特征P范围:[a,b]
均值化:P = § / (range§)
最终范围是:0 ~ 1
特点:不带有量纲,不受量纲的范围影响

总之,归一化能消除不同参数表示的量纲带来的数值上的差距。

4.4:PCA做了之后,新得到的坐标值,失去了物理意义。无法描述他的现实含义。
比如上述的例子,身高和体重共同作用下的坐标,是个啥?身高和体重共同维度下是个啥?无法描述啊。

4.5:协方差矩阵CovA是对称矩阵

对称矩阵特征值分解,那么可以将特征向量成单位正交阵,且特征值是实数。CovA对角线上的是每一个参数的方差,CovA[i][j] = CovA[j][i] 是参数i和参数j的协方差。

协方差:

每天进步一点点《PCA的简要学习》_机器学习_04

方差:

每天进步一点点《PCA的简要学习》_机器学习_05

协方差矩阵:

每天进步一点点《PCA的简要学习》_线性代数_06

4.6:做特征值分解的时候,有俩中方法,一个是正常的eig()方法,特征分解,一个是SVD奇异值分解,这个是如何选择,其实这俩方法没有大的区别。
在对XTX 特征值分解要求的,恰好也是 SVD 分解后的右奇异矩阵。所以,都一样使用,没事儿。
XXT 左奇异矩阵,没有意义。

4.7:为什么要用协方差矩阵的主要特征向量来做降维?

协方差的结果有什么意义呢?如果结果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义,除以量纲);如果是负数,则是负相关;如果是0,则没有相关性。

我们进行PCA的基本要求
(1)第一个要求:使得样本在选择的基底上尽可能的而分散,维度自身方差大,数据分散。
(2)第二个要求:使得各个选择的基底关联程度最小,维度之间关联性小。
所以我们的目的是什么?就是找一个新的矩阵(也就是一组基底的合集),让样本矩阵乘以这个矩阵,实现换特征+减少特征的重新表示。

我们求出了原来样本的协方差矩阵,协方差矩阵的对角线代表了原来样本在各个维度上的方差,其他元素代表了各个维度之间的相关关系,协方差。
也就是说我们希望优化后的样本矩阵,它的协方差矩阵,对角线上的值都很大,而对角线以外的元素都为0。

下面我们来说一下协方差特征值和特征向量的性质:
1:协方差特征值对应的特征向量指向数据分布的主要方向,一般认为是数据主要的传播方向。哦!!!!!搜嘎!!!!!
2:样本的均值代表了分布中心点的位置;协方差矩阵代表了图像扁圆程度。

每天进步一点点《PCA的简要学习》_数据_07


每天进步一点点《PCA的简要学习》_特征值_08

感觉和二次型很神似啊,总是希望经过某个变换,得到只是主元对角线上的数值,其他都是元素都是0,这样我们能轻易看出来数据的分布规律。
而且二次型矩阵,恰恰是一个对称矩阵。只不过PCA的时候呢,还多做了一步就是舍弃掉影响很小的特征方向,只选取主要的方向。

也就说,二次型就是做到了换特征,所有的信息都保留(此过程也可以看做是一定程度的降维),PCA在此基础上更进一步,还做到了减少特征。

说到这里,好像,二次型就是一种降维的过程,将一个多项式的维度降低到仅仅包含二次项的过程。每一项都是一个维度参数。
F(x) = k1x2 + k2y2 + k3z2 + k4xy + k5xz+ k6yz 经过转变的到下面的多项式
F(x’) = k1x2 + k2y2 + k3z2