背景
真实数据训练中可能会出现过多相似特征,PCA可通过降维来优化数据、提升性能:
汽车样本特征“千米/小时”、“英里/小时”意义相似
词频统计时“study”、“learn”词性相似
特征远大于数据的情况(过拟合)
主成分分析(PCA)意为提取主要信息,摒弃次要信息,从而得到压缩后的数据。它的输入数据是不带标签的,应用于无监督学习中的一种降维方式。PCA 可应用于数据压缩:减少磁盘/内存占用、加快算法运行速度或数据可视化:降至2 、3 维。虽然PCA可减少特征数,但它并不生为防拟合(过拟合仍应使用正则化)。PCA是算法优化的一个步骤,并非机器学习的必须步骤,因为次要信息可能包含样本差异的重要信息(非高斯分布的数据使用PCA效果可能打折扣),降维丢弃该特征对模型效果会有一定的影响。所以PCA并非模型建立时拿来就用,而是当内存占用太大,运算时间太长时考虑引用
PCA转换为数学问题是将原n维数据下降为k维。在k维数据中满足:
•每对特征之间不具备相关性:最大化实现降维
•特征数据最大化分布在这个新系中:若k维数据都在一个点上,则无法判断新老数据对应关系
即寻找一组新坐标系,使数据最大化分布,则转换为如下问题:
最大方差=最大化数据分布
中学经典试题“小明语文100、数学60,小红语文85、数学75,虽平均分一样,但小明更偏科”,方差反映数据波动程度:,为样本数量、为该特征数据平均值
无偏估计的方差公式不同(分母为),上式为有偏估计。但对于机器学习求极值下参数大小的问题,这里的分母就是个常量,因此无需介意不同文章使用无偏方差来计算(无偏是考虑到抽样数据的平均值与全部数据的平均值存在误差,然后通过数学推理要避免这个误差分母需为m-1)
向量内积几何意义为A在B上的投影,若两者垂直则。当两者长度均为1时,A、B可构成一组正交基。当两者不垂直时,则是将数据A投影至B上
假设B是一维基,要使m个数据最大化分布在B上,则左图效果好于右图。假定平均值为0:白圆点部分为原点,则等价于要寻找过这个原点使数据有最大分布的直线(对应的单位向量),那么最大化方差是一个简单的表示形式,因为大方差的数据波动足够剧烈,才更有机会分布在直线上更大的范围内
协方差为零=特征之间互不相关
协方差反应两组数据的相关性,数据X=[11 12 13 ...]、Y=[16 16 28 ...]的分布如下
,如图可知:
•两组数据正相关,更多数据落在一、三象限:
•两组数据负相关,更多数据落在二、四象限:
•两组数据不相关,数据平均落在4个象限:
则每对特征不具备相关性,则数据投影至不同基后,每两组数据的协方差为0
数据构建
有了上述两个数学思想后,将样本数据构建成需要解决的数学问题,设样本仅有两个特征,对应数据:x、y
①计算平均值并中心化数据(使平均值为0,便于后续计算)
②计算每个特征的方差 ,数据y同理
③计算每两组特征的协方差
为描述所有特征方差、特征之间的协方差,则需要构建矩阵。令原数据
则(用到知识:矩阵转置、矩阵乘法)
特征值分解
我们的目标是引入正交矩阵P,使数据投影后的对角线上每个数值最大化、非对角线每个数值为0:
P中每一行为一个向量基(称为正交矩阵),任意两行向量基相乘为0、自己与自己相乘为1(单位长度):
(单位矩阵以E简写)
令,则(单位矩阵在矩阵乘法中类似第一代数学中的系数1,可直接消掉)
乍一看还是不知道该怎么求Q,仍需找到数学巧力来化解这个尴尬。令,列向量对应原正交矩阵的一个行向量基
则、
则对任意一列数据有。在数学上右式被理解为“如果一组矩阵作用于向量,只改变它的长度而不改变它的方向,则称为特征值、为特征向量”,比如向量(1,1)只改变长度为(2,2),但改变方向为(2,3)
如此一来,求得一个特征值,便解锁一个特征向量,所有特征向量便组成最终的正交矩阵P,将特征向量按特征值降序,这样方差最大的排前面,选前前k个特征向量压缩行数据进行降维:
m×n代表m行n列的矩阵,每一列为不同特征、每一行为一组数据,上式可使n维数据降至k维
SVD分解
让机器像人类一样学习抽取重要特征,SVD将复杂矩阵分解为简单子矩阵,这些子矩阵拥有原数据重要特性,相比特征值分解仅适用于方针而言,SVD适用于任意矩阵,其几何意义:向量x经过对角矩阵∑缩放、坐标系U旋转,等价于其投影至坐标系V并通过矩阵A旋转与缩放
是对角线以外均为0的矩阵,为奇异值,左奇异向量、右奇异向量是正交矩阵
利用SVD的主要特征进行降维,自然只会取分解后的部分数据。SVD定义原矩阵信息量为每个元素平方和再开平方根
H开平方省去根号后在矩阵中等效于:tr表示矩阵的迹,代指矩阵对角线元素之和。可以简单验证:
对于分解矩阵则有:
说明原数据信息量仅与奇异值有关,实际情况中部分奇异值就能达到原矩阵90%的信息量。为了方便选择奇异值,我们对SVD分解后的按奇异值从大到小对矩阵重新排序:,原矩阵如下:
对角线后的元素为0,因此前2个矩阵相乘的矩阵中,最后一个奇异值后的值为0,再乘以矩阵则有效值计算到不了最后一行数据(除非m=n),所以此处以j表示
原始SVD分解时,奇异值不一定按从大到小排序,此时如果将排序到,为保持A矩阵数值仍不变,则需要互换。更一般地,,若互换,则矩阵U每行的列p、q值互换,V同理。这样便实现奇异值从大到小排序而不影响最终输出值
接着,设置保留信息量,使程序逐一计算满足条件的前k个奇异值,此时左奇异取前k列、右奇异行向量取前k行,则
SVD与PCA的特征值分解有等效关系
令,则
特征值分解针对方针,SVD矩阵自乘也是方阵,则奇异分解A并代入得,其中是对角矩阵,。PCA中的D也是对角矩阵,
假定,则直接奇异分解A得到的右奇异向量转置V等效于特征值分解中的P。这样便可以通过SVD右奇异向量②等效地进行降维
①左奇异向量实现数据压缩:
②右奇异向量实现特征降维:
正如其他文章所说,选择SVD分解将无需计算协方差矩阵,而是直接奇异分解并使用右奇异向量降维
特征值求解
先看简单情况,假设已计算方差矩阵、待解基,转化为线性方程:
将m、n看做一个参数,这样2个方程组对应2个参数后λ可解
将方程组上式代入方程组下式得
以上式子是时λ的取值。更一般地,特征值求解即是已知方阵A的行列式为0求λ。然后通过λ求得特征向量,取将λ从大到小排序取前k个对应特征向量即可(较大的特征值对应较大的方差,取方差越大的特征则压缩损失越小)
实际问题并非求解2×2矩阵的特征值。可以根据矩阵大小、结构选择QR、QZ、Cholesky、分治法来获取特征值上述方法属于特征值分解
以上分解方式属于纯数学范畴,如果仅进行简单的应用,在各类AI框架里已经有相应的封装和优化。手动自实现与计算优化恐怕需数学专业人士配合,非专业人士离场
奇异值求解
一个很自然的问题:既然PCA最终转换为特征值分解的数学问题,那为什么不做特征值分解,而需要把问题转换为奇异值求解。对于这个问题国外网站有相关讨论:为什么PCA可以通过SVD达成?、对于PCA,为什么吴恩达倾向于SVD而不是特征值分解?
参见了相关评论,核心是认为SVD分解速度更快、结果更稳定。对于线性方程求解:a+b=1、2a+b=1,通过小学待入式可得a=0、b=1,然而对于计算大型线性方程组并不适用。求解算法要么是初始化解,然后不断迭代到精确值(类似梯度下降)、要么是分解矩阵迭代到精确值。但有一些中肯的评论我比较赞成,他们解释到本质上SVD与EIG算法都是向后稳定型(迭代次数越多,结果越稳定),只是在PCA这个问题上,两者计算的数据源本身就有所不同,同时不同框架中实现SVD与EIG的方法也有所不同(有些数据场景下EIG远快于SVD)。所以从习惯上来说,PCA可以默认选用SVD来做
但机器学习避免盲目的算法崇拜,如果SVD、EIG都采用最先进的求解算法,同时实际数据的特征数量并非远大于样本数量、数据未完全服从高斯分布等原因,孰强孰若还需要结合实际情况来看
奇异值计算可以通过Lanzos、Jacobi、QR、分治法来实现,详细可参考知乎Matlab 的 svd 是怎么实现的?