吴恩达机器学习系列内容的学习目录 → \rightarrow →吴恩达机器学习系列内容汇总。
数据压缩不仅能对数据进行压缩,使得数据占用较少的内存或硬盘空间,还能让我们对学习算法进行加速。
假使我们要采用两种不同的仪器来测量一些东西的尺寸,其中一个仪器测量结果 x 1 x_{1} x1的单位是厘米,另一个仪器测量的结果 x 2 x_{2} x2是英寸,我们希望将测量的结果作为我们机器学习的特征,如下图所示。现在的问题的是,两种仪器对同一个东西测量的结果不完全相等(由于误差、精度等原因),但将两者都作为特征又有些重复,因而我们希望将这个二维的数据降至一维来减少这种冗余。
在许多机器学习问题中,如果我们能将数据可视化,便能寻找到一个更好的解决方案,降维可以帮助我们。
假设我们有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP、人均GDP、平均寿命等),如下表所示。
如果要将上面这个50维的数据直接进行可视化是不可能的,但使用降维的方法先将其降至2维,我们便可以将其可视化了。但这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。
主成分分析(PCA)是常用的降维算法。
在PCA中,我们要做的是找到一个低维平面,当我们将所有数据都投影到该平面上时,希望投影误差(Projection error)能尽可能地小。在应用PCA之前,常规的做法是先进性均值归一化和特征归一化,使得特征量均值为0,并且其数值在可比较的范围之内。
如下图所示的数据,其在红线所代表的向量上的投影误差总的来说要比绿线所代表的向量上的投影误差要小得多,效果更好。
在本例将2维降至1维的情况中,PCA要做的是去找到一个数据投影后能够最小化投影误差的方向向量。对于将 n 维降至 k 维的情况,PCA要做的是找到 k 个方向向量来对数据进行投影来最小化投影误差。
主成分分析与线性回归是两种不同的算法。如下图所示,左边的是线性回归的误差(垂直于横轴投影),右边是主成分分析的误差(垂直于方向向量投影)。
PCA将 n 个特征降维到 k 个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的KL变换使用PCA做图像压缩。但PCA要保证降维后,还要保证数据的特性损失最小。
PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果,同时最大程度的保持了原有数据的信息。
PCA技术的一个很大的优点是完全无参数限制。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。但这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
PCA 从 n 维减少到 k 维的步骤:
[U, S, V] = svd(Sigma);
。对于给定的 z ( i ) z^{(i)} z(i),怎么回到原来的表示 x ( i ) x^{(i)} x(i)?
总结: 将 n 维降维至 k 维: z ( i ) = U r e d u c e T ⋅ x ( i ) z^{(i)}=U_{reduce}^{T} \cdot x^{(i)} z(i)=UreduceT⋅x(i);
将 k 维重建至 n 维: x a p p r o x ≈ U r e d u c e ⋅ z x_{approx}\approx U_{reduce}\cdot z xapprox≈Ureduce⋅z。
投影的平均均方误差: 1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 \frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} - x_{approx}^{(i)} \right \|^{2} m1∑i=1m∥∥∥x(i)−xapprox(i)∥∥∥2
训练集的总方差: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} \right \|^{2} m1∑i=1m∥∥x(i)∥∥2,即训练样本距离远点的距离。
我们希望在平均均方误差与训练集的总方差的比例 1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \frac{\frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} - x_{approx}^{(i)} \right \|^{2}}{\frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} \right \|^{2}} m1∑i=1m∥x(i)∥2m1∑i=1m∥x(i)−xapprox(i)∥2尽可能小的情况下选择尽可能小的 k 值。如果我们希望这个比例小于1%,就意味着原本数据的偏差有99%都保留下来了,如果我们选择保留95%的偏差,便能非常显著地降低模型中特征的维度了。
我们可以先令 k =1,进行主成分分析,获得 U r e d u c e U_{reduce} Ureduce和 z z z,然后计算比例是否小于1%。如果不是的话再令 k = 2,如此类推,直到找到可以使得比例小于1%的最小 k 值(原因是各个特征之间通常情况存在某种相关性)。
还有一种更高效的方式选择 k,当我们在调用“svd”函数去使用[U, S, V] = svd(sigma)的时候可以获得三个参数。其中, S = [ s 11 0 ⋯ 0 0 s 22 ⋮ ⋮ ⋱ 0 0 ⋯ 0 s n n ] S=\begin{bmatrix} s_{11} & 0 & \cdots &0 \\ 0 &s_{22} & &\vdots \\ \vdots & & \ddots &0 \\ 0 & \cdots & 0& s_{nn} \end{bmatrix} S=⎣⎢⎢⎢⎢⎡s110⋮00s22⋯⋯⋱00⋮0snn⎦⎥⎥⎥⎥⎤,我们可以使用这个矩阵来计算平均均方误差与训练集的总方差的比例 1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 = 1 − ∑ i = 1 k s i i ∑ i = 1 n s i i ⩽ 0.01 \frac{\frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} - x_{approx}^{(i)} \right \|^{2}}{\frac{1}{m}\sum_{i = 1}^{m}\left \| x^{(i)} \right \|^{2}}=1-\frac{\sum_{i=1}^{k}s_{ii}}{\sum_{i=1}^{n}s_{ii}}\leqslant 0.01 m1∑i=1m∥x(i)∥2m1∑i=1m∥x(i)−xapprox(i)∥2=1−∑i=1nsii∑i=1ksii⩽0.01,即 ∑ i = 1 k s i i ∑ i = 1 n s i i ⩾ 0.99 \frac{\sum_{i=1}^{k}s_{ii}}{\sum_{i=1}^{n}s_{ii}}\geqslant 0.99 ∑i=1nsii∑i=1ksii⩾0.99。
采用PCA算法对监督学习算法进行加速:
假使我们正在针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000 个特征。但因为数据量大,会使得学习算法运行的非常慢。采用PCA算法可以降低数据的维数从而使得算法运行更加高速。
PCA算法的应用:
1. 压缩:减少存储数据所需的存储器或硬盘空间;加速学习算法。
2. 可视化。
PCA算法的错误使用:
一个常见的错误使用PCA算法的情况是,将其用于防止过拟合(减少了特征的数量)。减少数据维度来防止过拟合的方法不是解决过拟合问题的好方法,不如尝试正则化处理。原因在于主成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
另一个常见的错误是,默认地将主成分分析作为学习过程中的一部分,这虽然在很多时候都有效果,但最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主成分分析。