第八章——降维(Dimensionality Reduction)
机器学习问题可能包含成百上千的特征。特征数量过多,不仅使得训练很耗时,而且难以找到解决方案。这一问题被称为维数灾难(curse of dimensionality)。为简化问题,加速训练,就需要降维了。
降维会丢失一些信息(比如将图片压缩成jpeg格式会降低质量),所以尽管会提速,但可能使模型稍微变差。因此首先要使用原始数据进行训练。如果速度实在太慢,再考虑降维。
8.1 维数灾难(The Curse of Dimensionality)
我们生活在三维空间,连四维空间都无法直观理解,更别说更高维空间了(wiki有关四维空间的介绍,以及油管上的一个视频,将四维空间展开为三维空间)。高维空间和低维空间相比,还是用很大区别的。比如一个单位正方形,只有大概0.4%的部分是距离边界0.001以内的(这部分边缘的面积大概是$0.001 \times 1 \times 4 = 0.004$,占总体面积的0.4%)。但是在一个一万维的单位超立方体中,这一概率却变成了99.999999%,绝大多数点都在距离某一维度很近的地方。一个有趣的事实是,人类有许多不同的属性,你认识的所有人都可能是某一特征的极端分子(比如咖啡里的放糖量)。
还有一个更麻烦的区别:如果在单位正方形中任意选取两点,其距离平均大概是0.52(这道概率统计的习题,我已经不记得怎么求解了)。在单位立方体中这一距离是0.66。而在1000000维单位超立方体中,这一距离就增大到了408.25(大概$\sqrt{1000000/6}$)。这说明高维数据集很可能是相当稀疏的,样本实例间距离很大,预测是新的样本距离训练集样本的距离也很大,预测可信度远低于地位数据集。简单来说,高维数据集很容易过拟合。
理论上,维数灾难的一个解决方案是增加样本数量,从而使训练集达到足够的密度。可是这在实践中并不可行,因为其复杂度是指数级的。
8.2 主要降维方法(Main Approaches for Dimensionality Reduction)
8.2.1 投影(Projection)
如图8-2所示,可将三维数据集投影到合适的二维平面,
图8-2. 几乎位于同一平面的3D数据集
投影后的新数据集如图8-3所示。
图8-3. 投影和的2D数据集
但有时候,投影是不好使的,例如图8-4所示的蛋糕卷数据集,尽管该数据集也是近似位于一个二维平面的(该数据集正确的降维方式是将蛋糕卷展开的二维平面)。
8-4. Swiss roll数据集
8.2.2 流形学习(Manifold Learning)
上面的蛋糕卷数据集就是一个2D流形。简单来讲,2D流形是一个在更高维空间中扭曲的2D形状。 当然,2D流形可以推广到n维流形。
许多降维算法就是对数据集所处于的流形建模,这被称作流行学习。
8.3 主成分分析(PCA)
主成分分析(Principal Component Analysis)是目前最受欢迎的降维算法。该算法首先找到距离数据集最近的低维超平面,然后就数据集投射到该超平面。
8.3.1 保留方差(Preserving the Variance)
将数据集投影到低维超平面之前,首先要选择合适的超平面。如图8-7所示,左侧是一个二维数据集,以及三个超平面(一维超平面)。右侧是数据集在相应超平面做投影后得到的新数据集。
图8-7. 选择合适的子空间
很明显应该选择那条实心直线作为超平面,因为投影后新的数据集方差最大,损失的信息最少。此外,该超平面对应的新数据集,与原始数据集的欧氏距离最小。
8.3.2 主成分(Principal Components)
PCA可以识别出最大程度地保留训练数据集差异(variance)的坐标轴,也就是图8-7中的实线。然后找出第二个坐标轴,最大程度地保留剩下的差异,也就是图中与实线正交的虚线。用单位向量表示第$i$个坐标轴,这被称作第$i$个主成分。
可以使用奇异值分解(Singular Value Decomposition,SVD)得到主成分,$X = U \cdot \Sigma \cdot V^T$。
主成分矩阵:
\begin{align*}
V^T = \begin{pmatrix}
| &| & &| \\
c_1 &c_2 &\cdots &c_n \\
| &| & &|
\end{pmatrix}
\end{align*}
NumPy的svd() 函数可以进行奇异值分解:
X_centered = X - X.mean(axis=0)
U, s, V = np.linalg.svd(X_centered)
PCA假设数据集是以原点为中心的,只不过Scikit-Learn的PAC类会自动进行中心化。
8.3.3 投影到d维(Projecting Down to d Dimensions)
最佳超平面由前d个主成分向量组成,将训练集投影到该超平面即可,代码如下:
W2 = V.T[:, :2]
X2D = X_centered.dot(W2)
8.3.4 使用Scikit-Learn
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X2D = pca.fit_transform(X)
8.3.5 可解释方差比例(Explained Variance Ratio)
>>> print(pca.explained_variance_ratio_)
array([ 0.84248607, 0.14631839])
这说明第一个主成分承担了84.2%的差异,第二个主成分承担了14.6%的差异。
8.3.6 维数选择
与其武断地选择多杀维,不如选择足够保留大部分差异(比如95%)的维数。以下代码获取足以保留95%差异的代码:
pca = PCA()
pca.fit(X)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
然后设置n_components=d重新执行PCA:
pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X)
另一个选择是以维数为自变量,可释方差(explained variance)为因变量,画出函数图形:
8.3.7 PCA用于压缩
在MNIST数据集应用PCA,保留95%的差异,仅需150个特征,远小于原始的784个特征,这是一个不错的压缩率。压缩之后还可以解压缩到784维,但这并不能得到原始数据,只是跟选择数据很接地,毕竟压缩做投影的时候丢失了一些信息。
8.3.8 Incremental PCA
感觉类似于最小批梯度下降
8.3.9 随机PCA(Randomized PCA)
可以加速运算
8.4 核PCA(Kernel PCA)
核PCA就是将核技巧应用于PCA,代码如下:
from sklearn.decomposition import KernelPCA
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
X_reduced = rbf_pca.fit_transform(X)
图8-10. 使用不同核将蛋糕卷数据集投影到2维
8.4.1 核的选择与超参数的调整(Selecting a Kernel and Tuning Hyperparameters)
这有两种情况。
第一种情况,尽管kPCA是无监督算法,没有明显的衡量指标帮助我们调整参数。减少降维的下一步往往是监督学习,比如分类。这就可以选择使得分类效果最好的参数。
第二种情况,完全是无监督学习,这是可以选择使得重构误差(reconstruction error)最小的超参数。
8.5 局部线性嵌入(Locally Linear Embedding,LLE)
LLE是另一种强大的非线性降维(nonlinear dimensionality reduction,NLDR)技术。该算法并不像PCA那样依赖投影,而是首先寻找每一个训练两本与其k个近邻(closest neighbors,c.n.)的线性关系,然后找到数据集的一种低维表示,其能够将这些近邻关系最好地保持。该算法对于卷曲数据集表现很好,尤其是噪声不多的情况下。
from sklearn.manifold import LocallyLinearEmbedding
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
X_reduced = lle.fit_transform(X)
图8-12. 展开蛋糕卷数据集
如图8-12所示,蛋糕卷被展开了。然而,如果数据的范围过大,距离并不能良好的保持下来:蛋糕卷左侧被挤压,右侧被拉伸。
LLE工作方式如下:
首先,对于每一个训练样本$X^{(i)}$,识别出其$k$近邻,然后建立$X^{(i)}$与其$k$近邻的线性方程。
LLE第一步,局部线性关系模型:
然后,将训练集映射(这里是映射,也就是map,不是前面的投影projecting)到d维空间(d<n),并尽可能地保持局部关系。
LLE第二步,降维并保留局部关系:
8.6 其它的降维技术(Other Dimensionality Reduction Techniques)
- Multidimensional Scaling (MDS),保持样本距离降维。
- Isomap,在样本的近邻间创建图,降维时保持geodesic distances。
- t-Distributed Stochastic Neighbor Embedding (t-SNE),降维时保持相似样本接近,不相似样本远离。这在样本可视化时很有用,尤其是样本簇的可视化。
- Linear Discriminant Analysis (LDA),这实际上是一个分类算法,在训练的时候可以学习到最能区别类别的坐标轴,然后用这些坐标轴定义超平面并将样本映射于其上。其优势是可以尽可能地保持样本点分离,可以再应用分离算法(比如SVM)之前使用LDA。
图8-13. 不同算法将蛋卷数据集映射到2维
第八章——降维(Dimensionality Reduction)的更多相关文章
- Stanford机器学习笔记-10. 降维(Dimensionality Reduction)
10. Dimensionality Reduction Content 10. Dimensionality Reduction 10.1 Motivation 10.1.1 Motivation ...
- 海量数据挖掘MMDS week4: 推荐系统之数据降维Dimensionality Reduction
http://blog.csdn.net/pipisorry/article/details/49231919 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 数据降维(Dimensionality reduction)
数据降维(Dimensionality reduction) 应用范围 无监督学习 图片压缩(需要的时候在还原回来) 数据压缩 数据可视化 数据压缩(Data Compression) 将高维的数据转 ...
- [C9] 降维(Dimensionality Reduction)
降维(Dimensionality Reduction) 动机一:数据压缩(Motivation I : Data Compression) 数据压缩允许我们压缩数据,从而使用较少的计算机内存或磁盘空 ...
- 机器学习(十)-------- 降维(Dimensionality Reduction)
降维(Dimensionality Reduction) 降维的目的:1 数据压缩 这个是二维降一维 三维降二维就是落在一个平面上. 2 数据可视化 降维的算法只负责减少维数,新产生的特征的意义就必须 ...
- 机器学习课程-第8周-降维(Dimensionality Reduction)—主成分分析(PCA)
1. 动机一:数据压缩 第二种类型的 无监督学习问题,称为 降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快 ...
- 斯坦福第十四课:降维(Dimensionality Reduction)
14.1 动机一:数据压缩 14.2 动机二:数据可视化 14.3 主成分分析问题 14.4 主成分分析算法 14.5 选择主成分的数量 14.6 重建的压缩表示 14.7 主成分分析法 ...
- Ng第十四课:降维(Dimensionality Reduction)
14.1 动机一:数据压缩 14.2 动机二:数据可视化 14.3 主成分分析问题 14.4 主成分分析算法 14.5 选择主成分的数量 14.6 重建的压缩表示 14.7 主成分分析法 ...
- [UFLDL] Dimensionality Reduction
博客内容取材于:http://www.cnblogs.com/tornadomeet/archive/2012/06/24/2560261.html Deep learning:三十五(用NN实现数据 ...
随机推荐
- sql的having深入理解;group by只返回一组的一行,compute更好
Having where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行. having 子句的作用是 ...
- 第一个Polymer应用 - (2)创建你自己的元素
原文链接: Step 2: Your own element翻译日期: 2014年7月6日翻译人员: 铁锚通过上一节的学习和实践, 您已经完成了一个基本的应用程序结构(application stru ...
- C# 操作Excel数据透视表
一.概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行号.列标和页字段.当改变版面布置时,数据透视表也会按照新的 ...
- Mac Finder 里新建文本
Mac Finder 里新建文本 首先吐槽下 Mac 的文件管理 Finder 真的是太弱了,之前没感觉 Windows 的资源管理器多厉害,但是和 Mac 的比起来真是堪称神器啊,果然牛逼与否还的看 ...
- window配置mongodb集群(副本集)
参数解释: dbpath:数据存放目录 logpath:日志存放路径 pidfilepath:进程文件,有利于关闭服务 logappend:以追加的方式记录日志(boolean值) replSet:副 ...
- 2018 ACM-ICPC World Finals B.Comma Sprinkler
WF里面最简答一题,就是一个dfs就可以了,已经访问过的点可以不再访问 #include <algorithm> #include <cmath> #include <c ...
- Course3-Python文件I/O
1. 读取键盘输入 Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: 1). raw_input. raw_input([prompt]) 函数从标准输入读取一个行, ...
- 【基础】CSS实现多重边框的5种方式
简言 目前最优雅地实现多重边框的方案是利用CSS3 的 box-shadow属性,但如果要兼容老的浏览器,则需要选择其它的方案.本文简要地列举了几种多重边框的实现方案,大家可以根据项目实际及兼容性要求 ...
- 17.QT-事件处理分析、事件过滤器、拖放事件
Qt事件处理介绍 Qt平台会将系统产生的消息转换为Qt事件 Qt事件是一个QEvent的对象 Qt事件用来描述程序内部或外部发生的动作 任意的QObject对象都具备事件处理的能力 Qt常见的事件继承 ...
- LindDotNetCore~框架介绍及特色功能(有点springboot的意思)
LindDotNetCore模块介绍 大叔博客 LindDotNetCore相关模块介绍 [x] 全局都是依赖DI [x] 消息队列 [x] NoSql [x] Caching [x] 仓储 [x] ...