将讨论第二种无监督学习的问题:降维。数据压缩不仅能让我们对数据进行压缩,使得数据占用较少的内存和硬盘空间,还能对学习算法进行加速。
(一)降维是什么(二维降至一维)
假使我们要采用两种不同的仪器来测量一些东西的尺寸,其中一个仪器测量结果的单位是英寸,另一个仪器测量的结果是厘米,我们希望将测量的结果作为我们机器学习的特征。
现在的问题的是,两种仪器对同一个东西测量的结果不完全相等(由于误差、精度等),而将两者都作为特征有些重复,因而,我们希望将这个二维的数据降至一维。
如果能把数据从二维减少到一维,用来减少这种冗余,通过降维,也就说想找出一条线,看起来大多数样本所在的线,所有的数据都投影到这条线上,通过这种做法,能够测量出每个样本在线上的位置。就可以建立新的特征,只需要一个数就能确定新特征。
意味着:之前要用一个二维数字表示的特征可以一维数直接表示。
通过这种方法,就能够把内存的需求减半或者数据空间需求减半。
(二)降维是什么(三维降至二维)
将数据从三维降至二维: 这个例子中我们要将一个三维的特征向量降至一个二维的特征向量。
过程是与上面类似的,我们将三维向量投射到一个二维的平面上,强迫使得所有的数据都在同一个平面上,降至二维的特征向量。
很难看出图中的数据分布在一个平面上,所以这时降维的方法就是把所有的数据都投影到一个二维平面上:
意味着现在可以把每个样本用两个数字表示出来,即下图中的z1、z2:
这就是降维以及如何用它来压缩数据,接下来将继续探讨如何用这个技术来对学习算法进行加速。
二:降维之数据可视化用一个具体的例子来说:
假设收集了许多统计数据的大数据集,如下图中的全世界各国的情况:
这里有很多的特征和国家,那么用什么方法能够更好地理解这些数据呢?如何可视化这些数据?
这里有50个特征,但是很难绘制50维的数据,可以用使用降维的方法,例如用下面二维向量表示:
这样的话,如果能用2个数字来表示50个特征,要做是从50维降到2维,就可以把这些国家在二维平面上表示出来,这样做了之后,z的值通常不会是你所期望的,具有物理意义的特征,所以要弄清楚这些特征大致意味着什么。
在图中,每一个国家都可以用一个点来表示,横轴可能表示国家的经济规模、国家总体经济活跃程度或者总GDP等一些特征,而纵轴可能对应于人均GDP、每个人的幸福程度或者个人经济活跃程度等一些特征,这样就可以通过这个图了解国家的大致情况。
这就是降维如何把高维的数据降到二维或者三维,这样就能把它绘制出来,并更好地理解这些数据。
三:主成分分析(PCA---降维最常用算法)(1)对降维问题来说,目前最流行的的算法是叫做主成分分析法(PCA),这里将谈论PCA的公式描述问题(试着用公式来表述PCA用途)
(一)投影误差
假设有如图的数据集,想要将它从二维降到一维,可能会选择右图中的线:
通过选择的这条线,发现每个点到它们对应的直线上的投影点之间的距离是非常小的。所以,正式的说,PCA它会找一个低维平面(上图中是这条直线)然后将数据投影在上面,使点到投影点之间的距离的平方最小。(这些距离有时也称为投影误差)
在应用PCA之前,常规的做法是先进行均值归一化和特征规范化,使得特征x1、x2的均值为0,并且其数值在可比较的范围内。
对比上面右图,我们绘制另外一条可以进行数据投影的直线(粉色):
可以看出投射误差非常大。这就是为什么PCA会选择红色直线,而不是这条粉色直线。
(二)线性回归和PCA对比
因为讲述PCA的时候经常会画一条直线,看起来有点像线性回归,但事实上PCA不是线性回归,它们是两种不同的算法。线性回归要做的是用所以的x值来预测y,然而在PCA中,没有什么特殊的变量y是需要预测的。
主成分分析与线性回归是两种不同的算法。
主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。
线性回归的目的是预测结果,而主成分分析不作任何预测。
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。
(三) PCA定义
PCA做的就是如果想将数据从二维降到一维,要试着找一个向量(假设是向量u(1)∈Rn)投影后能够使最小化投影误差的方向。
这就是从二维数据降到一维的例子,更通常的情况是有N维数据,并且想将其降到K维,这种情况下,我们不只是想找单个向量来对数据进行投影,而是想寻找K个方向来对数据进行投影,来最小化投影误差。
正式的来说:要找出一组向量u(1),u(2),...,u(k),要做的是将这些数据投影到这K个向量展开的线性子空间上。
举个例子,如果有下图所示的三维点云:
我们要想将3维素数据投射到2维空间中,那么也就是要找出一对向量,这两个向量一起定义了一个二维平面,将数据投影到平面上,并且要求数据点投影到平面上的距离最小。
因此,PCA做的是它试图找出一条直线、一个平面或其他维的空间,然后对数据进行投影,以获得最小化平方投影、90度投影或正交投影的误差。
(四)PCA总结
1.PCA将n个特征降维到k个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的KL变换使用PCA做图像压缩。但PCA 要保证降维后,还要保证数据的特性损失最小。
2.PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。
3.PCA技术的一个很大的优点是,它是完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。
4.但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
四:主成分分析(PCA---降维最常用算法)(2)达到独自使用主成分分析算法,并且可以用PCA对自己的数据进行降维。
(一)数据预处理
在应用PCA之前首先是对数据的预处理(和监督学习类似):执行均值标准化,也可能根据数据也要进行特征缩放
1.均值标准化
我们需要计算出所有特征的均值μj,然后令每个特征的值减去该特征的均值,并将该值更新为该特征新的特征值 。这样,该特征的均值正好为0.
2.特征缩放(可选)
如果不同的特征有非常不相同的缩放,例如x_1房子大小和x_2卧室数量,这两个特征在数量级上是非常不同,因此我们需要缩放每个特征到一个相对的价值范围(我们还需要将其除以标准差σ2 )。
(二)计算协方差矩阵Σ及其特征向量
做完上面的数据预处理之后,接下来是PCA算法需要做的:
左边的图由二维降至一维:
PCA要做的是需要想出一个方法计算两个东西,一个是计算这些向量(二维),例如u(1),另一个是如何计算这些数字(一维),例如。
右边的图由三维降至二维:
PCA要做的是需要想出一个方法计算两个东西,一个是计算这种情况下的向量(三维),例如u(1)和u(2),另一个是计算这些向量(二维),例如
下面是求解过程:
想把n维数据降到k维,首选要做的是计算协方差(Σ---大写σ),然后计算协方差矩阵的特征向量,最终得到的是一个n*n的矩阵U:
这就是PCA算法,虽然没有给出数学上的证明,来证明u(1)和、u(2)、z还有其他向量等等,但是得出的过程就是选择了最小化的平方投影误差,PCA要做的是尝试找到一个面或线,把数据投影到这个面或线上,以便于最小化平方投影误差。
五:压缩重现在之前的学习中,我们一直把PCA作为压缩算法来讨论。
它可以把一个1000维的数据压缩成100维的特征向量,或者把一个三维的数据压缩成二维表示。
思考这样的一个问题:如果这是一个压缩算法,就应该有办法从这个压缩表示回到原来高维数据的一种近似表述,所以假设给定100维的z(i),怎么回到原来的表示x(i)(x(i)可能是1000维),接下来就来介绍如何去做。
在PCA算法中,可能有这样的样本:x(1),x(2),要取这些样本,然后把它们投影到这个一维面上,现在只需一个实数比如z(1)来表示这些点被投影到这个一维面上后的位置,如下图所示,所以给定一个点z(1),要怎么回到原来的二维空间?即:
所以如果要反过来求x的话,这个方程就是:xapprox=Ureduce*z.这里的Ureduce是一个n*k的向量,z是一个k*1的向量,把它们乘起来就得到了n*1维,所以xapprox是一个n维向量。
PCA的意图就是,如果平方投影误差不太大,这样xapprox就会很接近原先用来求z的x值了。用图来表示的话就是这个样子(如下图),返回去的这个过程得到的就是这些投影到直线上的点。
用原来的例子,从x(1)开始,然后得到z(1),如果把z(1)代到这个式子里,得到xapprox(1),它在R2空间里,继续做同样的步骤,下一点就是xapprox(2),所有这是一个对原始数据不错的近似。
以上就是如何从低维表示z回到未压缩的数据表示,得到一个原来数据x的近似,也把这个过程叫做原始数据的重构,这一过程就是通过压缩表示,重建原来的数据x。
所以给定一个未标注的数据集,现在知道如何应用PCA把高维数据特征x映射到低维的表示z,从这章节的学习中,也知道了如何把低维表示z映射回到原来的高维数据的一个近似表示。
六:主成分数量的选取(一)K值选取思想
在PCA算法中,将n维特征减少为某k维特征表示,这个数字k是PCA算法的一个参数,也被称为主成分个数。这里将探讨一般情况下如何考虑选择这个参数k。
为了选择k,即选择这个主成分的数字,PCA努力做到就是最小化投影误差平方的平均值,因此它试图最小化这个数量,它是原始数据x(i)和投影xapprox(i)之间的距离,这就是投影误差平方的平均值,同时将定义数据的总方差,就是这些样本x(i)的平方和的平均值,所以数据的总方差就是训练集里的所有样本的平均长度,这个说明了我的训练样本距离零向量的平均距离有多远或者说我的训练样本距离原点有多远。
当试图选择k,一个常见的经验方法是选择最小的值使得这两者之间的比值小于0.01。
换句话说,一种常见的方式来选择k是我们想让投影的均方误差,即x和其投影的平均距离除以数据的总方差,这也就是数据的波动程度,希望这个比例可以小于比如0.01或1%,这是另一种表述方式。大多数人选择k并不是像多数人谈论的那样直接进行选择,因为这个数无论是0.01或一些其他数值。另一种用PCA的语言来表述的方式是:99%的方差性会被保留,不必纠结这话是什么意思。
“99%的方差性会被保留”只是说左侧的这个量小于0.01,如果你正在使用PCA,想要告诉别人你保留了多少主成分,这样的表述比较好:我选择的k使得99%的方差被保留。这是需要了解的很有用的概念,它的意思其实就是投影的均方误差除以数据总方差不会超过1%。
(二)算法实现
1.下面是PCA算法选择k的过程:
如果k=1检查的结果不是小于0.01,将k的值取2,以此类推,直到结果验证正确,此时就可以确定选择的k值。
2.另一中选择k的方式如下:
还有一些更好的方式来选择,当我们在Octave中调用“svd”函数的时候,我们获得三个参数:[U, S, V] = svd(sigma)
其中S如下:
其中的S是一个nXn的矩阵,只有对角线上有值,而其它单元都是0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
也就是:
3.总结
相比于算法一:对于每选取一个K值后,都要进行一次计算。算法二中我们只需要计算一次,后面可以重复使用S矩阵。更加方便
七:应用PCA的建议将介绍如何使PCA加快学习算法的效率,并给出如何应用PCA算法的相关的建议。
(一)加速学习算法
假设有一个监督学习的问题,有训练集:
假设具有很高的维度,比如说是一个10000维的特征向量,在实际应用中,可能是一个计算机视觉的问题,有一些100*100的图片,就会有10000个像素点。
对于这种高维度的特征向量,运行学习算法时将变得非常慢,而幸运的是,用PCA算法,可以减少数据的维度,从而使得算法运行更加高效。可以按照以下步骤来做:
1. 第一步是运用主要成分分析将数据压缩至1000个特征
2. 然后对训练集运行学习算法。
3. 在预测时,采用之前学习而来的U
reduce
将输入的特征x转换成特征向量z,然后再进行预测
注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的U
reduce
。
这样得出了新的训练集,接着,可以把这个低维的训练集输入一个学习算法(可能是神经网络或者逻辑回归)。
注意:PCA所做的是定义一个从x到z的映射,这个映射只能通过在训练集上运行PCA来定义,具体地说,PCA学习的这个映射所做的就是计算一系列参数,进行特征缩放和均值归一化等等;在训练集上,找到所有的参数后,可以把这个映射用在交叉验证集或者测试集的其他样本中。
(二)PCA的应用
(1)首先可以进行压缩,可能需要它来减少存储数据所需的存储器或硬盘空间;
(2)使用PCA去加速学习算法;
以上两个应用中,为了选择K,经常会计算出方差保留的百分比(通常99%)。
(3)可视化应用。(一般选择k=2或3)
(三)PCA的误用
(1)尝试用PCA去防止过拟合,以下是不要误用的原因:
如果真担心过拟合问题,可以使用之前说到的正则化 方法来解决。
(2)有一些人在设计机器学习系统时,可能会写下这样的计划:
其实,在写下包含PCA的项目计划之前,应该思考这样的问题:如果直接去做而不使用PCA会怎么样?
在实现PCA之前,直接做你想做的事,首先考虑使用最原始的数据x(i),只有这么做不能达到目的的情况下,才考虑使用PCA和z(i)。
这就是PCA算法的介绍,PCA是非常常用的最强大的无监督学习算法之一,所以通过本章的学习,希望可以使用PCA去完成各种不同的目标。