提交 98c0e055 编写于 作者: L loveSnowBest

Chapter 8翻译 without equation and figure

上级 798a560b
......@@ -255,8 +255,110 @@ X_reduced=rbf_pca.fit_transform(X)
<caption><i>图 8-10 使用不同核的kPCA将瑞士卷降到2维</i></caption>
### 选择一种核并调整超参数
由于kPCA是无监督学习算法,因此没有明显的性能指标可以帮助您选择最佳的核方法和超参数值。但是,降维通常是监督学习任务(例如分类)的准备步骤,因此您可以简单地使用网格搜索来选择可以让该任务达到最佳表现的核方法和超参数。例如,下面的代码创建了一个两步的pipeline,首先使用kPCA将维度降至两维,然后应用Logistic回归进行分类。然后它使用Grid SearchCV为kPCA找到最佳的核和gamma值,以便在最后获得最佳的分类准确性:
```Python
from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.pipeline import Pipeline
clf = Pipeline([
("kpca", KernelPCA(n_components=2)),
("log_reg", LogisticRegression())
])
param_grid = [{
"kpca__gamma": np.linspace(0.03, 0.05, 10),
"kpca__kernel": ["rbf", "sigmoid"]
}]
grid_search = GridSearchCV(clf, param_grid, cv=3)
grid_search.fit(X, y)
```
你可以通过调用`best_params_`变量来查看使模型效果最好的核和超参数:
```Python
>>> print(grid_search.best_params_)
{'kpca__gamma': 0.043333333333333335, 'kpca__kernel': 'rbf'}
```
另一种完全为非监督的方法,是选择产生最低重建误差的核和超参数。但是,重建并不像线性PCA那样容易。这里是原因:图8-11显示了原始瑞士卷3D数据集(左上角),并且使用RBF核应用kPCA后生成的二维数据集(右上角)。由于核技巧,这在数学上等同于使用特征映射φ将训练集映射到无限维特征空间(右下),然后使用线性PCA将变换的训练集投影到2D。请注意,如果我们可以在缩减空间中对给定实例实现反向线性PCA步骤,则重构点将位于特征空间中,而不是位于原始空间中(例如,如图中由x表示的那样)。由于特征空间是无限维的,我们不能找出重建点,因此我们无法计算真实的重建误差。幸运的是,可以在原始空间中找到一个贴近重建点的点。这被称为重建前图像(reconstruction pre-image)。一旦你有这个前图像,你就可以测量其与原始实例的平方距离。然后,您可以选择最小化重建前图像错误的核和超参数。
![]()
<caption><i>图 8-11 核PCA和重建前图像误差</i></caption>
您可能想知道如何进行这种重建。一种解决方案是训练一个监督回归模型,将预计实例作为训练集,并将原始实例作为训练目标。如果您设置了`fit_inverse_transform = True`,Scikit-Learn将自动执行此操作,代码如下所示:
```Python
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433,fit_inverse_transform=True)
X_reduced = rbf_pca.fit_transform(X)
X_preimage = rbf_pca.inverse_transform(X_reduced)
```
> 总结:默认条件下,`fit_inverse_transform = False`并且`KernelPCA`没有`inverse_tranfrom()`方法。这种方法仅仅当`fit_inverse_transform = True`的情况下才会创建。
你可以计算重建前图像误差:
```Python
>>> from sklearn.metrics import mean_squared_error >>> mean_squared_error(X, X_preimage) 32.786308795766132
```
现在你可以使用交叉验证的方格搜索来寻找可以最小化重建前图像误差的核方法和超参数。
### LLE
局部线性嵌入(Locally Linear Embedding)是另一种非常有效的非线性降维(NLDR)方法。这是一种流形学习技术,不依赖于像以前算法那样的投影。简而言之,LLE首先测量每个训练实例与其最近邻居(c.n.)之间的线性关系,然后寻找能最好地保留这些局部关系的训练集的低维表示(稍后会详细介绍) 。这使得它特别擅长展开扭曲的流形,尤其是在没有太多噪音的情况下。
例如,以下代码使用Scikit-Learn的`LocallyLinearEmbedding`类来展开瑞士卷。得到的二维数据集如图8-12所示。正如您所看到的,瑞士卷被完全展开,实例之间的距离保存得很好。但是,距离不能在较大范围内保留的很好:展开的瑞士卷的左侧被挤压,而右侧的部分被拉长。尽管如此,LLE在对流形建模方面做得非常好。
```Python
from sklearn.manifold import LocallyLinearEmbedding
lle=LocallyLinearEmbedding(n_components=2,n_neighbors=10)
X_reduced=lle.fit_transform(X)
```
![]()
<caption><i>图 8-12 使用LLE展开瑞士卷</i></caption>
这是LLE的工作原理:首先,对于每个训练实例 x<sup>( i )</sup>,该算法识别其最近的k个邻居(在前面的代码中k = 10中),然后尝试将 x<sup>( i )</sup>重构为这些邻居的线性函数。更特殊的,它假设如果 x <sup>( j )</sup>不是 x<sup>( i )</sup>的k个最近邻之一,就找到权重 w<sub>i , j</sub>从而使 x<sup>( i )</sup><b>aaaaa</b>之间的平方距离尽可能的小。因此,LLE的第一步是方程8-4中描述的约束优化问题,其中**W**是包含所有权重 w<sub>i,j</sub>的权重矩阵。第二个约束简单地对每个训练实例 **x**<sup>( i )</sup>的权重进行归一化。
<caption><i>公式 8-4 LLE 第一步:对局部关系进行线性建模</i></caption>
(Equation here)
在这步之后,权重矩阵 <b>W ooo</b>(包含权重 <b>wiiii</b>)对训练实例的线形关系进行编码。现在第二步是将训练实例投影到一个 d 维空间( d < n 中去同时尽可能的保留这些局部关系如果 **z**<sup>( i )</sup>**x**<sup>( i )</sup>在这个d维空间的图像,那么我们想要 **z**<sup>( i )</sup> aaaaaaaaaaa之间的平方距离尽可能的小。这个想法让我们提出了公式8-5中的非限制性优化问题。它看起来与第一步非常相似,但我们要做的不是保持实例固定并找到最佳权重,而是恰相反:保持权重不变,并在低维空间中找到实例图像的最佳位置。请注意,**Z**是包含所有 **z**<sup>( i )</sup>的矩阵。
<caption><i>公式 8-5 LLE第二步:保持关系的同时进行降维</i></caption>
(Equation Here)
Scikit-Learn的LLE实现具有如下的计算复杂度:查找k个最近邻为<i>O ( m log ( m ) n log ( k ) )</i>,优化权重为<i>O ( m n k<sup>3</sup></i>,建立低维表示为 <i>O ( d m <sup>2</sup></i>。不幸的是,在最后一项的 m <sup>2</sup>使得这个算法在处理大数据集的时候表现较差。
## 其他降维方法
还有很多其他的降维方法,Scikit-Learn支持其中的好几种。这里是其中最流行的:
- 多维缩放(MDS)在尝试保持实例之间距离的同时降低了维度(参见图8-13)
- Isomap通过将每个实例连接到最近的邻居来创建图形,然后在尝试保持实例之间的测地距离时降低维度。
- t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE)可以用于降低维​​度,同时试图保持相似的实例临近并将不相似的实例分开。它主要用于可视化,尤其是用于可视化高维空间中的实例(例如,可以将MNIST图像降维到2D可视化)。
- 线性判别分析(Linear Discriminant Analysis,LDA)实际上是一种分类算法,但在训练过程中,它会学习类之间最有区别的轴,然后使用这些轴来定义用于投影数据的超平面。LDA的好处是投影会尽可能地保持各个类之间距离,所以在运行另一种分类算法(如SVM分类器)之前,LDA是很好的降维技术。
![]()
<caption><i>图 8-13 使用不同的技术将瑞士卷降维至2D</i></caption>
## 练习
1. 减少数据集维度的主要动机是什么?主要缺点是什么?
2. 什么是维度爆炸?
3. 一旦对某数据集降维,我们可能恢复它吗?如果可以,怎样做才能恢复?如果不可以,为什么?
4. PCA可以用于降低一个高度非线性对数据集吗?
5. 假设你对一个1000维的数据集应用PCA,同时设置方差解释率为95%,你的最终数据集将会有多少维?
6. 在什么情况下你会使用普通的PCA,增量PCA,随机PCA和核PCA?
7. 你该如何评价你的降维算法在你数据集上的表现?
8. 将两个不同的降维算法串联使用有意义吗?
9. 加载MNIST数据集(在第3章中介绍),并将其分成一个训练集和一个测试集(将前60,000个实例用于训练,其余10,000个用于测试)。在数据集上训练一个随机森林分类器,并记录了花费多长时间,然后在测试集上评估模型。接下来,使用PCA降低数据集的维度,设置方差解释率为95%。在降维后的数据集上训练一个新的随机森林分类器,并查看需要多长时间。训练速度更快?接下来评估测试集上的分类器:它与以前的分类器比较起来如何?
10. 使用t-SNE将MNIST数据集缩减到二维,并使用Matplotlib绘制结果图。您可以使用10种不同颜色的散点图来表示每个图像的目标类别。或者,您可以在每个实例的位置写入彩色数字,甚至可以绘制数字图像本身的降维版本(如果绘制所有数字,则可视化可能会过于混乱,因此您应该绘制随机样本或只在周围没有其他实例被绘制的情况下绘制)。你将会得到一个分隔良好的的可视化数字集群。尝试使用其他降维算法,如PCA,LLE或MDS,并比较可视化结果。
练习答案请见附录A。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册