提交 23510129 编写于 作者: L loveSnowBest

降维翻译25%(without img)

上级 43386542
# 第8章 降维
很多机器学习的问题都会涉及到有着几千甚至数百万维的特征的训练实例。这不仅让训练过程变得非常缓慢,同时还很难找到一个很好的解,我们接下来就会遇到这种情况。这种问题通常被称为维数灾难(curse of dimentionality)。
幸运的是,在现实生活中我们经常可以极大的降低特征维度,将一个十分棘手的问题转变成一个可以较为容易解决的问题。例如,对于MNIST图片集(第3章中提到):图片四周边缘部分的像素几乎总是白的,因此你完全可以将这些像素从你的训练集中扔掉而不会丢失太多信息。图7-6向我们证实了这些像素的确对我们的分类任务是完全不重要的。同时,两个相邻的像素往往是高度相关的:如果你想要将他们合并成一个像素(比如取这两个像素点的平均值)你并不会丢失很多信息。
> 警告:降维肯定会丢失一些信息(这就好比将一个图片压缩成JPEG的格式会降低图像的质量),因此即使这种方法可以加快训练的速度,同时也会让你的系统表现的稍微差一点。降维会让你的工作流水线更复杂因而更难维护。所有你应该先尝试使用原始的数据来训练,如果训练速度太慢的话再考虑使用降维。在某些情况下,降低训练集数据的维度可能会筛选掉一些噪音和不必要的细节,这可能会让你的结果比降维之前更好(这种情况通常不会发生;它只会加快你训练的速度)。
降维除了可以加快训练速度外,在数据可视化方面(或者DataViz)也十分有用。降低特征维度到2(或者3)维从而可以在图中画出一个高维度的训练集,让我们可以通过视觉直观的发现一些非常重要的信息,比如聚类。
在这一章里,我们将会讨论维数灾难问题并且了解<b>在高维空间的数据</b>。然后,我们将会展示两种主要的降维方法:映射(projection)和流形学习(Manifold Learning),同时我们还会介绍三种流行的降维技术:主成分分析(PCA),核主成分分析(Kernel PCA)和局部线性嵌入(LLE)。
## 维数灾难
我们已经习惯生活在一个三维的世界里,以至于当我们尝试想象更高维的空间时,我们的直觉不管用了。即使是一个基本的4D超正方体也很难在我们的脑中想象出来(见图8-1),更不用说一个200维的椭球弯曲在一个1000维的空间里了。
![](Figure 8-1)
<caption><i>图8-1 点,线,方形,立方体和超正方体(0D到4D超正方体)</i></caption>
这表明很多物体在高维空间表现的十分不同。比如,如果你在一个正方形单元中随机取一个点(一个1×1的正方形),那么随机选的点离所有边界大于0.001(靠近中间位置)的概率为0.4%(1 - 0.998<sup>2</sup>)(换句话说,一个随机产生的点不大可能严格落在摸一个<b>维度上</b>。但是在一个1,0000维单元的超正方体(一个1×1×...×1的立方体,有10,000个1),这种可能性超过了99.999999%。在高维超正方体中,大多数点都分布在边界处。
**APPENDIX HERE**
还有一个更麻烦的区别:如果你在一个平方单位中随机选取两个点,那么这两个点之间的距离平均约为0.52。如果您在单位3D立方体中选取两个随机点,平均距离将大致为0.66。但是,在一个1,000,000维超立方体中随机抽取两点呢?那么,平均距离,信不信由你,大概为408.25(大致
√1,000,000 / 6)!<b>!!!!!根号</b>这非常违反直觉:当它们都位于同一单元超立方体内时,两点是怎么距离这么远的?这一事实意味着高维数据集有很大风险分布的非常稀疏:大多数训练实例可能彼此远离。当然,这也意味着一个新实例可能远离任何训练实例,这使得预测的可靠性远低于我们处理较低维度数据的预测,因为它们将基于更大的推测(extrapolations)。简而言之,训练集的维度越高,过拟合的风险就越大。
理论上来说,维数爆炸的一个解决方案是增加训练集的大小从而达到拥有足够密度的训练集。不幸的是,在实践中,达到给定密度所需的训练实例的数量随着维度的数量呈指数增长。如果只有100个特征(比MNIST问题要少得多)并且假设它们均匀分布在所有维度上,<b>那么如果想要各个临近的训练实例之间的距离在0.1以内</b>,您需要比宇宙中的原子还要多的训练实例。
## 降维的主要方法
在我们深入研究具体的降维算法之前,我们来看看降低维度的两种主要方法:投影和流形学习。
### 投影(Projection)
在大多数现实生活的问题中,训练实例并不是在所有维度上均匀分布的。许多特征几乎是常数,而其他特征则高度相关(如前面讨论的MNIST)。结果,所有训练实例实际上位于(或接近)高维空间的低维子空间内。这听起来有些抽象,所以我们不妨来看一个例子。在图8-2中,您可以看到由圆圈表示的3D数据集。
![]()
<caption><i>图8-2 一个分布接近于2D子空间的3D数据集</i></caption>
注意到所有训练实例的分布都贴近一个平面:这是高维(3D)空间的较低维(2D)子空间。现在,如果我们将每个训练实例垂直投影到这个子空间上(就像将短线连接到平面的点所表示的那样),我们就可以得到如图8-3所示的新2D数据集。铛铛铛!我们刚刚将数据集的维度从3D降低到了2D。请注意,坐标轴对应于新的特征z<sub>1</sub>和z<sub>2</sub>(平面上投影的坐标)。
![]()
<caption><i>一个经过投影后的新的2D数据集</i></caption>
但是,投影并不总是降维的最佳方法。在很多情况下,子空间可能会扭曲和转动,比如图8-4所示的着名瑞士滚动玩具数据集。
![]()
<caption><i>瑞士滚动数玩具数据集</i></caption>
简单地将数据集投射到一个平面上(例如,直接丢弃x<sub>3</sub>)会将瑞士卷的不同层叠在一起,如图8-5左侧所示。但是,你真正想要的是展开瑞士卷所获取到的类似图8-5右侧的2D数据集。
![]()
<caption><i>图8-5 投射到平面的压缩(左)vs 展开瑞士卷(右)</i></caption>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册