数据压缩
我们希望使用降维的一个主要原因是数据压缩。数据压缩不仅减少了计算机内存和硬盘空间的占用,它还能给算法提速。
如果你有上百或者上千的特征变量,很容易就会忘记你到底有什么特征变量,而且有时候可能有几个不同的工程师团队。这样就很难搞清哪个队给了你什么特征变量。实际上得到这样冗余的特征变量并不难。
二维降到一维
降低维度后,得到一条线,基本所有数据映射到这条线上。之后可以直接测量这条线上每个样本的位置。将这个新特征叫做 。
在之前如果想要表示一个样本点,需要一个二维向量( , ),现在只需用一个一维向量 来表示这个样本点。
三维降到二维
在更典型的降维例子中,我们可能有1000维的数据,我们可能想降低到100维
图上这样的数据集,我有一个样本
的集合,
是一个三维实数的点,所以我的样本是三维的:
实际上,这些样本点,差不多都处于同一平面上。降维在这里的作用,就是把所有的数据,都投影到一个二维的平面内。
所以我们现在只需要两个数: 和 来表示点在平面上的位置即可:
可视化数据
假如我们已经收集了大量的有关全世界不同国家的统计数据集:第一个特征 是国家的国内生产总值;第二个特征 是一个百分比,表示人均占有的GDP;第三个特征 是人类发展指数;第四个特征 是预期寿命;…直到
为了使得我们能更好地来理解数据,我们需要对数据进行可视化展示。这里我们有50个特征,但绘制一幅50维度的图是异常困难的,因此我们需要对数据进行降维,然后再可视化。
具体做法如下:
我们用 和 这两个数来总结50个维度的数据,我们可以使用这两个数来绘制出这些国家的二维图。
在降维处理时,我们用 来表示那些象征着国家整体情况的数据,例如”国家总面积”、”国家总体经济水平”等;用 来表示象征着人均情况的数据,例如”人均GDP”,”人均幸福感”等。
降维处理之后,将数据按照这两个维度展示如下:
在图中,右侧的点,象征着国家整体经济比较好的国家;上方的点,象征着人均经济比较好、人均幸福感较高、人均寿命较长…的国家。
主成分分析(PCA)
对于降维问题来说,目前最流行最常用的算法是主成分分析法(Principal Componet Analysis, PCA)。
PCA的执行过程2D -> 1D
如果我们将数据从二维降到一维的话,我们需要试着寻找一个向量 ,该向量属于n维空间中的向量(在这个例子中是二维的),我们将寻找一个对数据进行投影的方向,使得投影误差能够最小(在这个例子里,我们把PCA寻找到这个向量记做 ):
另外需要说明的时无论PCA给出的是这个 是正还是负都没关系。因为无论给的是正的还是负的 它对应的直线都是同一条,也就是我将投影的方向。
因此PCA做的就是:寻找一组k维向量(一条直线、或者平面、或者诸如此类等等)对数据进行投影,来最小化正交投影误差。
PCA和线性回归的关系
不同点一:
如果我们做线性回归,我们做的是在给定某个输入特征x的情况下预测某个变量y的数值。因此对于线性回归,我们想做的是拟合一条直线,来最小化点和直线之间的平方误差:
所以我们要最小化的是,上图中蓝线幅值的平方。注意我画的这些蓝色的垂直线,这是垂直距离。它是某个点与通过假设的得到的其预测值之间的距离。
与此相反,PCA要做的是最小化这些样本点与直线的最短距离(直角距离):
不同点二:
更一般的是,做线性回归的时候,有一个特别的变量y作为我们即将预测的值,线性回归所要做的就是用x的所有的值来预测y。
而在PCA中,没有这么一个特殊的变量y是我们要预测的。我们所拥有的是特征x1,x2,…,xn,所有的这些特征都是被同样地对待。
因此,PCA不是线性回归。尽管有一定程度的相似性,使得它们看上去是有关联的,但它们实际上是非常不同的算法。
数据预处理
在使用PCA之前,我们通常会有一个数据预处理的过程。
拿到某组有m个无标签样本的训练集,一般先进行均值归一化(mean normalization)。这一步很重要。然后还可以进行特征缩放(feature scaling),这根据你的数据而定。
这跟我们之前在监督学习中提到的均值归一和特征缩放是一样的。
PCA算法
假如说我们想要把数据从n维降低到k维,我们首先要做的是计算出下面这个协方差矩阵(通常用∑来表示):
计算出这个协方差矩阵后,假如我们把它存为Octave中的一个名为Sigma的变量,我们需要做的是计算出Sigma矩阵的特征向量(eigenvectors)。
在Octave中,你可以使用如下命令来实现这一功能:
[U,S,V] = svd(Sigma);
这个协方差矩阵Sigma应该是一个n×n的矩阵,通过定义可以发现这是一个n×1的向量,和它自身的转置(一个1×n的向量)相乘得到的结果,这个结果自然是一个n×n的矩阵。
然后把这n个n×n的矩阵加起来,当然还是n×n矩阵。
然后svd将输出三个矩阵,分别是U,S,V。你真正需要的是U矩阵。
U 矩阵也是一个n×n矩阵:
如果我们想将数据的维度从n降低到k的话,我们只需要提取前k列向量。这样我们就得到了 到 ,也就是我们用来投影数据的k个方向。
我们取出U矩阵的前k列得到一个新的,由 到 组成的矩阵 :
这是一个n×k维的矩阵。
然后我们用这个
来对我的数据进行降维。我们定义:
其中 是k×n的矩阵,x是n×1的矩阵,因此z是k×1的矩阵。
这里的x可以是训练集中的样本,也可以是交叉验证集中的样本,也可以是测试集样本。
另外,跟k均值算法类似,如果你使用PCA的话,你的x应该是n维实数。所以没有 这一项。
选择主成分的数量k
在PCA算法中,我们把n维特征变量降维到k维特征变量。这个数字k是PCA算法的一个参数。这个数字k也被称作主成分的数量。
最小化平均平方映射误差
为了选择参数k(也就是要选择主成分的数量),PCA所做的是尽量最小化平均平方映射误差 (Average Squared Projection Error) 。
因此PCA就是要将下面这个量最小化:
即最小化x和其在低维表面上的映射点之间的距离的平方。这就是平均平方映射误差。
同时我们还要定义一下数据的总变差(Total Variation):
数据的总变差 (Total Variation) 是这些样本的长度的平方的均值。它的意思是 “平均来看,我的训练样本距离零向量(原点)多远?”。
当我们去选择k值的时候,我们通过平均平方映射误差除以数据的总变差来表示数据的变化有多大。我们想要这个比值能够小于1%:
大部分人在考虑,选择k的方法时,不是直接选择k值,而是这里的数字应该设置为多少:
它应该是0.01还是其它的数?如果选择了0.01,那么用PCA的语言说就是保留了99%的差异性。
数字0.01是人们经常用的一个值,另一个常用的值是0.05。如果选择了0.05,就意味着95%的差异性被保留了。从95到99是人们最为常用的取值范围。
使用PCA算法时寻找合适k值的方法
- 首先对协方差矩阵Sigma调用一次svd:
[U,S,V] = svd(Sigma)
- 然后使用下面的不等式求得满足条件的最小k值:
- 最后要注意一点,PCA定义了从x到z的对应关系,这种对应关系只可以通过在训练集上运行PCA定义出来。
- 当你在运行PCA的时候,只是在训练集那一部分来进行的,而不是在交叉验证的数据集或者测试集上运行。
- 在训练集上运行PCA后,得到了从x到z的映射,然后你就可以将这个映射应用到交叉验证数据集,和测试数据集中。
- 特别注意,使用PCA的目的是加速学习算法,但不应该用它来避免过拟合。