在前面我们学习了一种有监督的降维方法——线性判别分析(Linear Dscriminant Analysis,LDA)。LDA不仅是一种数据压缩方法还是一种分类算法,LDA将一个高维空间中的数据投影到一个低维空间中去,通过最小化投影后各个类别的类内方差和类间均值差来寻找最佳的投影空间。
本文介绍的主成分分析(Principe Component Analysis,PCA)也是一种降维技术,与LDA不同的是,PCA是一种无监督降维技术,因此PCA的主要思想也与LDA不同。LDA是一种有监督的分类兼降维技术,因此其最大化均值差最小化类内差的思想够保证在降维后各个类别依然能够很好地分开。但PCA只用来降维而无需分类,因此PCA需要考虑的是如何在降维压缩数据后尽可能的减少数据信息的损失。在PCA中使用协方差来表示信息量的多少,至于为什么能这么表示后面再进行介绍。下面我们从一些基本的线代知识开始。
线代基础
在进行数据分析时我们的数据样本经常被抽象为矩阵中的一组向量,了解一些线代基础知识理解PCA非常重要,但在这里我们并不准备也不可能将所有的线代知识都罗列以便,因此这里我们仅会复习一些对理解PCA较为重要的东西。更多线代的内容可参考下面几个链接:
- 3Blue1Brown课程:线性代数的本质;
- 马同学的课程,图文并茂,0基础可掌握,思想与上面的课程类似;
- 从另一个纬度理解矩阵:理解矩阵(一),理解矩阵(二),理解矩阵(三);
- 特征值与特征向量的几何含义
为了方便,我们这里以一个二维平面为例。
向量
在前面我们说了,在数据处理时我们经常讲一个样本数据当作一个向量。在二维平面中,一个向量从不同的角度有不同的理解方式,例如对于向量 (-2, 3)T:
- 物理角度:它是一个有向箭头(可表示作用力),由于(长度相当于力的大小,角度相当于作用力的方向)唯一确定,与起点,终点无关。二维向量就是平面的一个箭头;
- 计算机角度:或者更好理解的数据处理角度,一个向量通常用来表示一个样本,不同列表示这个样本的不同属性特征。二维向量可看作一个具有两个特征的样本;
- 数学角度:向量是一个抽象的概念。从几何角度来看,向量(-2, 3)T表示从原点沿着x轴负方向走了两个单位,再沿着y轴走了3个单位。因此两个向量的相加可看作沿着x,y轴各走了两次(一个向量走一次)。
基
在我们描述任何东西的时候其实都是选择了一个参照系的,也即事物都是相对的,最简单的运动与静止(以静止的事物为参照),说一个有点意思的——人,人其实也是放在一个参考系中的,我们可以将其理解为生物种类系统,抛开这个大的系统去独立的定义人是很难让人理解的。向量也是这样的,虽然我们前面没有指明,但是上面的向量其实是在一个默认坐标系(或称为空间)中的,也即x,y轴,但是在线性代数中我们称其为基。在线代中任何空间都是由一组线性无关的(一维空间由一个基组成)基向量组成。这些基向量可以组成空间中的任何向量。
个人理解:
理论上,任何向量都能作为基的,但是使用线性无关的基(也即正交基)来作为一组空间的基更加的“节约”,试想如果两个基是相关的,那么必然存在着一些“浪费”,即一个基里面包含着另一个基的信息(相关)。因此从这个角度来看,PCA就是将各个可能存在线性相关的特征转换为线性无关的特征,即将每个特征作为一个空间的“基向量”,PCA的作用就是将这些线性相关的基向量投影到一个基向量为正交(非线性相关)的空间中。
矩阵与线性变换
现在假设我们有如下一个矩阵相乘的式子:
我们可以从两种视角来看待矩阵:
- Av 可以理解为在某一个坐标系下(默认 E )对向量 v 施加某个运动;
- Av 也可以理解为坐标系 A 下的向量 v (如上的例子,列向量为一组基)。
因此,上面的例子可以有两种理解方式:
(1)如果我们将值全为1对角方阵视为标准坐标系,则它表示在 i=(1, -2)T 和 j=(3, 0)T 这组基底下的坐标 (-1, 2)T 在基底 (1, 0)T、(0, 1)T 下的坐标,如下:
(2)他表示在标准坐标系下我们对一个向量施加了一个变换,也即矩阵相乘表示着线性变换。
从基变换的角度看线性变换的一点解释
当我们讨论向量 (-1, 2)T 时,都隐含了一个默认的基向量假设:沿着x轴方向长度为1的 i,沿着y轴长度为1的j。
但是,(-1, 2)T 可以是任何一组基底下的向量。例如,他可能是i'=(2,1)T, j'=(-1, 1)T 这组基下的一个向量。此时他在我们默认坐标系 i=(1, 0)T,j=(0, 1)T 下的计算过程如下:
我们可以从另一个角度理解基地变换的过程:我们先误认为(-1, 2)T是坐标系i=(1, 0)T,j=(0, 1)T下的坐标,此时我们通过线性变换[[2, -1], [1, 1]](每个嵌套列表看做一行)把坐标轴i,j(基坐标)分别变换到了新的位置 i1=(2, 1)T, j1=(-1, 1)T(他们也是用默认坐标系表示的),即[2, -1], [1, 1]]。此时我们把“误解”转换成了真正的向量。如下:
总结一下计算过程:
- 几何上看:这个矩阵表示把我们的默认坐标系转换为新的基坐标系;
- 数值上看:把其他基底表示的坐标(-1, 2)T转换成默认基底的坐标(-4, 1)T。
从基变换角度来看PCA:
假设我们现在有一些数据x,共计m行n列(即m个样本,每个样本n个特征),那么从 x=Ix (I为单位矩阵)可以认为 x 是存在于标准坐标系(或称默认坐标系)空间中的一些点。现在我们将x放在另一个空间A中:Ax。当A表的维度k小于n时候便可以认为对数据进行了降维。
特征值与特征向量
在上面我们说了矩阵是一种变换,现在我们继续从这个角度来理解特征值和特征向量。为了方便理解,我们在这里做一个类比——将变换看作物理中的作用力。我们知道一个力必须有速度和方向,而矩阵对一个向量施加的变换也是一样的。考虑一下特征向量的定义:
借助上图我们很容易理解:矩阵 A 对向量v 施加了一个变换(作用力),这个变换的方向与特征向量v方向相同,各个方向上的力大小对应着特征值 λ 中对角线上的值对应。
更多关于特征值和特征向量的解释可查看特征值与特征向量的几何含义和如何理解矩阵特征值和特征向量?。
PCA原理
上面介绍了一些基本的线性代数相关的知识,下面开始介绍PCA的原理。
协方差矩阵及优化目标
上面我们讨论了选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量本身的维数,则可以达到降维的效果。但是我们还没有回答一个最最关键的问题:如何选择基才是最优的。或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
要完全数学化这个问题非常繁杂,这里我们用一种非形式化的直观方法来看这个问题。
为了避免过于抽象的讨论,我们仍以一个具体的例子展开。假设我们的数据由五条记录组成,将它们表示成矩阵形式:
其中每一列为一条数据记录,而一行为一个字段。为了后续处理方便,我们首先将每个字段内所有值都减去字段均值,其结果是将每个字段都变为均值为0(这样做的道理和好处后面会看到)。中心化的数据为:
可视化数据:
现在问题来了:如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?
通过上一节对基变换的讨论我们知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。
那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。
以上图为例,可以看出如果向x轴投影,那么最左边的两个点会重叠在一起,中间的两个点也会重叠在一起,于是本身四个各不相同的二维点投影后只剩下两个不同的值了,这是一种严重的信息丢失,同理,如果向y轴投影最上面的两个点和分布在x轴上的两个点也会重叠。所以看来x和y轴都不是最好的投影选择。我们直观目测,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。
下面,我们用数学方法表述这个问题。
方差
上文说到,我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。此处,一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即:由于上面我们已经将每个字段的均值都化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示:
于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
协方差
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
协方差矩阵
上面我们导出了优化目标,但是这个目标似乎不能直接作为操作指南(或者说算法),因为它只说要什么,但根本没有说怎么做。所以我们要继续在数学上研究计算方案。
我们看到,最终要达到的目的与字段内方差及字段间协方差有密切关系。因此我们希望能将两者统一表示,仔细观察发现,两者均可以表示为内积的形式,而内积又与矩阵相乘密切相关。于是我们来了灵感:
假设我们只有a和b两个字段,那么我们将它们按行组成矩阵X:
然后我们用X乘以X的转置,并乘上系数1/m:
这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵的。
根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设C=1/m(XXT),则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
协方差矩阵对角化
根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。这样说可能还不是很明晰,我们进一步看下原矩阵与基变换后矩阵协方差矩阵的关系:
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y=PX,则Y为P对X做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:
现在事情很明白了!我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足PCP𝖳是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
现在所有焦点都聚焦在了协方差矩阵对角化问题上,有时,我们真应该感谢数学家的先行,因为矩阵对角化在线性代数领域已经属于被玩烂了的东西,所以这在数学上根本不是问题。
由上文知道,协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en,我们将其按列组成矩阵:则对协方差矩阵C有如下结论:
其中Λ为对角矩阵,其对角元素为各特征向量对应的特征值(可能有重复)。
以上结论不再给出严格的数学证明,对证明感兴趣的朋友可以参考线性代数书籍关于“实对称矩阵对角化”的内容。
到这里,我们发现我们已经找到了需要的矩阵P:P = ET.
P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果设P按照Λ中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
PCA的特征向量的求解除了使用上述最大化方差的矩阵分解方法,还可以使用最小化损失法,具体可参见:机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)。
PCA算法步骤
总结一下PCA的算法步骤:
设有m条n维数据。
- 1)将原始数据按列组成n行m列矩阵X;
- 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值;
- 3)求出协方差矩阵 C=1/m(XX𝖳);
- 4)求出协方差矩阵的特征值及对应的特征向量;
- 5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;
- 6)Y=PX即为降维到k维后的数据。
PCA与LDA的区别
LDA和PCA都用于降维,两者有很多相同,也有很多不同的地方,因此值得好好的比较一下两者的降维异同点。
首先我们看看相同点:
- 1)两者均可以对数据进行降维;
- 2)两者在降维时均使用了矩阵特征分解的思想;
- 3)两者都假设数据符合高斯分布。
我们接着看看不同点:
- 1)LDA是有监督的降维方法,而PCA是无监督的降维方法;
- 2)LDA降维最多降到类别数k-1的维数,而PCA没有这个限制;
- 3)LDA除了可以用于降维,还可以用于分类;
-
4)LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。
这点可以从下图形象的看出,在某些数据分布下LDA比PCA降维较优。
当然,某些某些数据分布下PCA比LDA降维较优,如下图所示: