🎡第二版修订(2021.4.26)🎡
1. 背景
在机器学习中,处理成千上万甚至几十万维特征的情况也并不罕见。在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。
降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。
那么如何降维呢?例如京东店铺的数据中,“浏览量”和“访客数”往往具有较强的相关关系,而“下单数”和“成交数”也具有较强的相关关系。这时,如果我们删除浏览量或访客数其中一个指标,我们应该并不会丢失太多信息。因此我们可以删除一个,以降低机器学习算法的复杂度。
上面给出的是降维的朴素思想描述,可以有助于直观理解降维的动机和可行性,但并不具有操作指导意义。例如,我们到底删除哪一列损失的信息才最小?亦或根本不是单纯删除几列,而是通过某些变换将原始数据变为更少的列但又使得丢失的信息最小?
除了利用相关关系,我们还可以利用PCA来把数据在低维度尽量分的越开越好。例如,
假设这些科目成绩不相关,一眼就能看出来,数学、物理、化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数学成绩拉的最开)。为什么一眼能看出来?因为坐标轴选对了!
二、先修知识
1. 基
- 一组正交向量
- 模为1
2. 方差
表示数据的分散程度:
3. 协方差
表示两个分布的线性相关性
三、PCA的一个简单实例
假设我们现在有五条数据,每个数据是二维的(第一行是x值,第二行是y值):
为了后续处理方便,我们首先将每行都减去该行的均值,其结果是将每个字段都变为均值为0(这样做的道理和好处后面会看到)。于是,数据变成了这样:
我们可以看下五条数据在平面直角坐标系内的样子:
现在问题来了:如果我们必须使用一维来表示这些数据,又希望尽量保留原始的信息,你要如何选择?
通过上一节对基变换的讨论我们知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。
那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散(方差最大)。
以上图为例,可以看出如果向x轴投影,那么最左边的两个点会重叠在一起,中间的两个点也会重叠在一起,这是一种严重的信息丢失。我们直观目测,如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。
下面,我们用数学方法表述这个问题。
3.1 方差
上文说到,我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。
由于上面我们已经将每个字段的均值都化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示:
于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
3.2 协方差
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决:考虑三维降到二维问题,与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性:
由于已经让每个字段均值为0,则:
可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维,其目标是选择K个单位正交基,使得原始数据变换到这组基上后(投影),各字段两两间协方差为0(正交),而字段的方差则尽可能大
3.4 协方差矩阵
原始矩阵A:
则构建协方差矩阵
奇迹出现了!这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是X和Y的协方差 -- 两者被统一到了一个矩阵。
3.5 协方差矩阵对角化
我们发现要达到优化,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。
由上文知道,协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为 ,我们将其按列组成矩阵:
则对协方差矩阵C有如下结论:
四、PCA算法
设有m条n维数据
1)将原始数据按列组成n行m列矩阵A
2)将A的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵 ,该矩阵的对角线上为方差(需要最大化之),其他元素为协方差(需要最小化之)
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P(4、5步相当于对协方差矩阵做有损的SVD分解)
6)B=PA即为降维到k维后的数据 (将原始数据投影到k个特征向量组成的单位正交基坐标系中),在这k个特征向量的投影上,实现了方差最大化和协方差最小化。
参考资料: