ng-ml-003 中的14_XIV._Dimensionality_Reduction
一、数据压缩
其实维度约间就是为了将一个样本在维度很高的情况下省略很多不需要的特征,使得能够以很少的特征数量来表示一个样本的表征,但是却也需要保存精度,其中最出名的要数PCA了,
这里是举例将多个样本从原有的2维降低到1维的情况。这样原来的数据是x,就成了在特征空间1维的z表示的数据了。这叫做映射。
这是从3D降到2Dde过程,就是将原有的在三维空间中表示的样本映射到2维的平面中。
二、数据的可视化
当我们能够将数据进行可视化的时候,就能够更加的直观的观察数据,使得我们对数据的操作更加的高效,也容易优化我们的算法。
但是假设如上图所示 ,当样本的维度是50或者更高,我们就没法直接画出来,因为我们只能画出3维的图像,所以为了更好的直观的观察数据,数据的降为就很自然的被我们所提起。
如何将上面的样本的维度约间到如上图所示的2维的情况,这就是接下来要做的工作。
三、数据压缩的工具-PCA
如上图所示,PCA就是主成份分析,就是如何将原始数据映射到PCA空间中,上图的例子是将2维的数据映射到一维的空间中,而直观的来说,我们选择的一维应该就是图中红色部分。而绿色的点就是样本投影到一维空间的点,这时候原始点和投影点之间的距离就叫做“投影误差”,所以PCA的目标就是让这个投影误差最小,(就是保留数据的最大方差方向,将最小的方差一一剔除)(**在将数据进行PCA处理之前需要进行去均值化,就是特征缩放,这样才能使得每个特征都能有相似的贡献度,不然就是不公平了***)
上图中,中间的粉红色是很坏的一维投影,因为可以看出原始点投影到粉红色的蓝色线最长,这说明这次的一维投影是失去了原始点方差最大的部分,而保留了方差较小的方向。不但不利于后续的分类,也损失了原始数据中的巨大的信息。
上图就是之前所说的3维降维到2维的一个示意图。具体原理和上面所述一样
在有些时候我们以为PCA就是线性回归,其实不是的,上图可以看出,左边的是线性回归,是使得在y轴上误差最小,而PCA是使得在红线的投影的距离最小,两者是不同的算法
首先需要对数据进行预处理,这里首先就是进行去均值化,当需要除以某个值使得每个特征的范围都相同时,比如手写部分的Sj,多半是最大值减去最小值,也有是这个特征的所有样本的方差,使之成为方差单位化。
在经过上面的预处理之后就是下面的部分:
先求整个样本的协方差矩阵,然后求这个矩阵的特征向量和特征值,在这其中一个特征向量的方向就是之前的方差的方向,特征值越大,方差就越大,也就是说越能表现数据的信息。svd的返回值是经过排序的,所以想降维到几维,就用前k个特征向量作为新的映射空间坐标系。
这里的z就是降维后的值,这就是降维的过程(sigma = 1/m * X' * X ;)
上面就是pca的过程和部分代码。
上面首先说明了pca的目标函数就是为了使得pca空间中的样本点和原始空间中的样本点的欧式距离最小,而且下面给出了所有样本的变化,当满足目标函数除以总的变化的时候如果小于0.01,那么就说数据的99%都被保留下来了。
其实这种方法比较低效,而且计算量大
上面的左边就是通过定义出发获得的如何对k进性选取,而右边就是直接的从特征值出发来进行得到精度的多少,而且计算简单。
四,重构pca的数据
上图左边是2维的原始数据,而右边是经过pca的重构后的数据,从pca空间中的数据去恢复到原始的数据(因为这里pca的维度选择肯定不是k==n,所以是有损转换,那么重构后和原始数据也是有差异的),所以可以从两个对比图发现在第二个图中,另一个方向上的变化消失了,因为都在一条线上,(即左边的原始点与近似点之间蓝色距离没有了)。
五、pca的应用
假设原始数据是图片和这个图片的标签,而这个图片是100×100的,有可能说这才多大,但是当将每个像素点都视为这个样本的特征的时候,就当作有10000维度的特征,这就大了,不利于训练,而且当中肯定有些冗余信息是不需要的,这时候可以通过pca降维到1000维度,而且失真很小。
这里的意思就是先通过训练数据进性整体的pca降维,但是那个转换矩阵u需要保留下来,这个就是在训练数据中的映射转换矩阵了,就是通过这个矩阵将原始数据映射到pca空间中的,为了都能够在同一个pca空间中表示数据,所以在后面的验证集合和测试集合中,不需要在计算协方差矩阵的特征向量矩阵了,用的就是训练数据得到的特征向量矩阵(当然预处理还是需要的,那是将数据缩放到同一个范围)
在数据压缩上的好处是加速学习和节省内存,而在可视化上,因为只能表达2维或者3维的数据,所以没法表达4维的数据
但是如果说用pca来防止过拟合,这是个糟糕的想法,可以通过在目标函数上增加正则化项来达到目的,而不是通过pca降维来达到目的。
因为pca的工作原理是有损的压缩数据的信息,所以他只是将一些微不足道的特征给丢弃掉,而正则化项是通过尽可能的稀疏化模型的参数来防止过拟合,这可是保留了所有数据的信息的,
上图中的是对pca的正常的ML的过程,但是在使用这个的时候需要考虑:如果没使用pca 这个算法会怎样,只有当试过原始的数据后,如果不能达到自己的要求,那就试一试(这里也必须是用来加速用的,比如因为维度过大而导致机器无法训练的问题)
所以,pca也不是万能的。