【ML】第八章 降维

   🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

许多机器学习问题涉及每个训练实例的数千甚至数百万个特征。正如我们将看到的,所有这些特性不仅使训练变得极其缓慢,而且还使找到好的解决方案变得更加困难。这个问题通常被称为维度灾难

幸运的是,在现实世界的问题中,通常可以大大减少特征的数量,将一个棘手的问题变成一个易于处理的问题。例如,考虑 MNIST 图像(在第 3 章中介绍):图像边界上的像素几乎总是白色的,因此您可以完全从训练集中删除这些像素而不会丢失太多信息。图 7-6证实了这些像素对于分类任务完全不重要。此外,两个相邻像素通常高度相关:如果将它们合并为单个像素(例如,通过取两个像素强度的平均值),您将不会丢失太多信息。

警告

降低维度确实会导致一些信息丢失(就像将图像压缩为 JPEG 会降低其质量一样),因此即使它会加快训练速度,它也可能会使您的系统性能稍差。它还使您的管道更加复杂,因此更难维护。所以,如果训练太慢,你应该先尝试用原始数据训练你的系统,然后再考虑使用降维。在某些情况下,降低训练数据的维度可能会过滤掉一些噪声和不必要的细节,从而提高性能,但一般不会;它只会加快训练速度。

除了从加快训练速度来看,降维对于数据可视化(或DataViz)也非常有用。将维度的数量减少到两个(或三个)可以绘制一个浓缩的视图图上的高维训练集,并且通常通过视觉检测模式(例如集群)来获得一些重要的见解。此外,DataViz 对于将您的结论传达给非数据科学家的人(尤其是将使用您的结果的决策者)至关重要。

在本章中,我们将讨论维度灾难并了解高维空间中发生的事情。然后,我们将考虑两种主要的降维方法(投影和流形学习),我们将介绍三种最流行的降维技术:PCA、Kernel PCA 和 LLE。

维度的诅咒

我们他们已经习惯了生活在三个维度1中,以至于当我们试图想象一个高维空间时,我们的直觉会失败。即使是基本的 4D 超立方体在我们的脑海中也难以想象(见图 8-1),更不用说在 1000 维空间中弯曲的 200 维椭圆体了。

图 8-1。点、线段、正方形、立方体和 tesseract(0D 到 4D 超立方体)2

事实证明,许多事物在高维空间中的行为非常不同。例如,如果你在一个单位正方形(一个 1 × 1 的正方形)中选择一个随机点,它只有大约 0.4% 的机会位于距离边界小于 0.001 的位置(换句话说,一个随机点在任何维度上都是“极端”的)。但在一万维单位的超立方体中,这个概率大于99.999999%。高维超立方体中的大多数点都非常靠近边界。3

这里有一个更麻烦的区别:如果你在一个单位正方形中随机选择两个点,这两个点之间的距离平均约为 0.52。如果您在一个单位 3D 立方体中选取两个随机点,则平均距离大约为 0.66。但是在 1,000,000 维超立方体中随机选取两个点呢?信不信由你,平均距离约为 408.25(大约1,000,0006)!这是违反直觉的:当它们都位于同一个单位超立方体内时,两点怎么可能相距如此之远?好吧,在高维度上只有足够的空间。因此,高维数据集存在非常稀疏的风险:大多数训练实例可能彼此相距很远。这也意味着一个新实例可能会远离任何训练实例,使得预测的可靠性远低于低维,因为它们将基于更大的外推。简而言之,训练集的维度越多,过拟合的风险就越大。

理论上,解决维度灾难的一种方法是增加训练集的大小以达到足够的训练实例密度。不幸的是,在实践中,达到给定密度所需的训练实例数量随着维度的数量呈指数增长。只有 100 个特征(比 MNIST 问题中的要少得多),您需要比可观察宇宙中的原子更多的训练实例,以便训练实例平均在 0.1 范围内,假设它们在所有维度上均匀分布.

降维的主要方法

我们深入研究具体的降维算法,让我们来看看两种主要的降维方法:投影和流形学习。

投影

大多数现实世界的问题,训练实例并没有在所有维度上均匀分布。许多特征几乎是恒定的,而其他特征则高度相关(如前面针对 MNIST 所讨论的)。因此,所有训练实例都位于(或接近)一个高维空间的低维子空间。这听起来很抽象,所以让我们看一个例子。在图 8-2中,您可以看到由圆圈表示的 3D 数据集。

图 8-2。靠近 2D 子空间的 3D 数据集

请注意,所有训练实例都靠近一个平面:这是高维 (3D) 空间的低维 (2D) 子空间。如果我们将每个训练实例垂直投影到这个子空间上(由连接实例到平面的短线表示),我们将得到如图 8-3所示的新二维数据集。达达!我们刚刚将数据集的维度从 3D 减少到 2D。请注意,轴对应于新特征1和2(平面上投影的坐标)。

图 8-3。投影后的新二维数据集

然而,投影并不总是降维的最佳方法。在许多情况下,子空间可能会扭曲和转动,例如在图 8-4中表示的著名的瑞士卷玩具数据集中。

图 8-4。瑞士卷数据集

简单地投影到平面上(例如,通过放下3 )会将瑞士卷的不同层挤压在一起,如图 8-5左侧所示。你真正想要的是展开瑞士卷来获得图 8-5右侧的二维数据集。

图 8-5。通过投影到平面上(左)与展开瑞士卷(右)进行挤压

流形学习

瑞士卷是二维流形的一个例子。简而言之,二维流形是可以在更高维空间中弯曲和扭曲的二维形状。更一般地,一个d维流形是一个局部类似于一个d维超平面的n维空间(其中d < n )的一部分。在瑞士卷的情况下,d = 2 和n = 3:它在局部类似于 2D 平面,但它是在三维中滚动的。

许多降维算法通过对训练实例所在的流形建模来工作。这称为流形学习。它依赖于基于流形假设,也称为流形假设,它认为大多数现实世界的高维数据集都接近于低维流形。这个假设经常被经验地观察到。

再次考虑 MNIST 数据集:所有手写数字图像都有一些相似之处。它们由连接的线组成,边框是白色的,它们或多或少居中。如果你随机生成图像,其中只有极小部分看起来像手写数字。换句话说,如果您尝试创建数字图像,您可以使用的自由度大大低于允许您生成任何您想要的图像时的自由度。这些约束倾向于将数据集压缩到低维流形中。

流形假设通常伴随着另一个隐含的假设:如果在流形的低维空间中表达,手头的任务(例如,分类或回归)会更简单。例如,在图 8-6的第一行中,瑞士卷分为两类:在 3D 空间(左侧)中,决策边界相当复杂,但在 2D 展开的流形空间中(右侧) ),决策边界是一条直线。

然而,这种隐含的假设并不总是成立。例如,在图 8-6的底行,决策边界位于1 = 5。这个决策边界在原始 3D 空间(垂直平面)中看起来很简单,但在展开的流形中看起来更复杂(四个独立线段的集合)。

简而言之,在训练模型之前降低训练集的维数通常会加快训练速度,但不一定总能带来更好或更简单的解决方案;这一切都取决于数据集。

希望您现在对什么是维数诅咒以及降维算法如何对抗它有一个很好的了解,尤其是当流形假设成立时。本章的其余部分将介绍一些最流行的算法。

图 8-6。较低维度的决策边界可能并不总是更简单

主成分分析(PCA)

主成分分析(PCA)是目前最流行的降维算法。首先,它识别离数据最近的超平面,然后将数据投影到其上,如图 8-2 所示

保留方差

您可以将训练集投影到较低维的超平面上,您首先需要选择正确的超平面。例如,一个简单的 2D 数据集在图 8-7的左侧表示,以及三个不同的轴(即 1D 超平面)。右侧是数据集投影到每个轴上的结果。如您所见,投影到实线上保留了最大方差,而投影到虚线上保留了非常少的方差,投影到虚线上保留了中等量的方差。

图 8-7。选择要投影的子空间

选择保留最大方差的轴似乎是合理的,因为它很可能比其他预测丢失更少的信息。证明这种选择的另一种方法是,它是最小化原始数据集与其在该轴上的投影之间的均方距离的轴。这是PCA背后相当简单的想法。4

主成分

主成分分析标识在训练集中占最大方差量的轴。在图 8-7中,它是实线。它还找到了与第一个轴正交的第二个轴,它占剩余方差的最大量。在这个 2D 示例中,没有选择:它是虚线。如果它是一个更高维的数据集,PCA 还会找到与之前的两个轴正交的第三个轴,以及第四个、第五个等等——与数据集中的维数一样多的轴。

i个轴称为数据的第i个 主成分(PC)。在图 8-7,第一个 PC 是向量c1所在的轴,第二个 PC 是向量c2所在的轴。在图 8-2中,前两个 PC 是平面上两个箭头所在的正交轴,第三个 PC 是与该平面正交的轴。

笔记

对于每个主成分,PCA 找到一个指向 PC 方向的以零为中心的单位向量。由于两个相对的单位向量位于同一轴上,PCA 返回的单位向量的方向并不稳定:如果稍微扰动训练集并再次运行 PCA,单位向量可能指向与原始向量相反的方向。但是,它们通常仍将位于相同的轴上。在某些情况下,一对单位向量甚至可以旋转或交换(如果沿这两个轴的方差接近),但它们定义的平面通常保持不变。

那么如何找到训练集的主要成分呢?幸运的是,有一个标准的矩阵分解称为奇异值分解(SVD) 的技术可以将训练集矩阵X分解为三个矩阵Σ ⊺的矩阵乘法,其中V包含定义我们正在寻找的所有主成分的单位向量,如方程式所示8-1

公式 8-1。主成分矩阵

下面的 Python代码使用 NumPy 的svd()函数获取训练集的所有主成分,然后提取定义前两个 PC 的两个单位向量:

X_centered = X - X.mean(axis=0)
U, s, Vt = np.linalg.svd(X_centered)
c1 = Vt.T[:, 0]
c2 = Vt.T[:, 1]

警告

PCA 假设数据集以原点为中心。正如我们将看到的,Scikit-Learn 的 PCA类负责为您集中数据。如果您自己实现 PCA(如前面的示例),或者如果您使用其他库,请不要忘记先将数据居中。

向下投影到 d 尺寸

一次您已经确定了所有主成分,您可以通过将数据集投影到由前d个主成分定义的超平面上,将数据集的维数降低到d维。选择此超平面可确保投影将保留尽可能多的方差。例如,在图 8-2中,3D 数据集被投影到由前两个主成分定义的 2D 平面,保留了数据集的大部分方差。因此,2D 投影看起来非常像原始的 3D 数据集。

要将训练集投影到超平面上并获得维度为d的缩减数据集d -proj,请计算训练集矩阵X与矩阵d的矩阵乘法,该矩阵定义为包含V的前d列的矩阵,如如公式 8-2所示。

公式 8-2。将训练集投影到d

 以下 Python 代码将训练集投影到由前两个主要组件定义的平面上:

W2 = Vt.T[:, :2]
X2D = X_centered.dot(W2)

你有它!你现在知道如何降维了将任何数据集缩小到任意数量的维度,同时保留尽可能多的方差。

使用 Scikit-Learn

Scikit-Learn 的PCA课程就像我们在本章前面所做的那样,使用 SVD 分解来实现 PCA。以下代码应用 PCA 将数据集的维度减少到二维(请注意,它会自动处理数据居中):

from sklearn.decomposition import PCA

pca = PCA(n_components = 2)
X2D = pca.fit_transform(X)

PCA在将变换器拟合到数据集之后,它的components_属性保持d的转置(例如,定义第一个主成分的单位向量等于pca.components_.T[:, 0])。

解释方差比

其他有用的信息是每个主成分的解释方差比,可通过explained_variance_ratio_变量获得。该比率表示位于每个主成分上的数据集方差的比例。例如,让我们看一下图 8-2中表示的 3D 数据集的前两个分量的解释方差比:

>>> pca.explained_variance_ratio_
array([0.84248607, 0.14631839])

此输出告诉您,数据集的 84.2% 的方差位于第一台 PC 上,而 14.6% 位于第二台 PC 上。这为第三台 PC 留下了不到 1.2% 的空间,因此可以合理地假设第三台 PC 可能携带的信息很少。

选择正确的维数

反而与任意选择要减少到的维数相比,选择加起来足够大的方差部分(例如,95%)的维数更为简单。当然,除非您正在降低数据可视化的维度——在这种情况下,您需要将维度降低到 2 或 3。

以下代码在不降低维数的情况下执行 PCA,然后计算保留 95% 的训练集方差所需的最小维数:

pca = PCA()
pca.fit(X_train)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1

然后,您可以再次设置n_components=d并运行 PCA。但是有一个更好的选择:您可以设置n_components为 0.0 到 1.0 之间的浮点数,而不是指定要保留的主成分的数量,表示您希望保留的方差比率:

pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X_train)

另一种选择是将解释方差绘制为维数的函数(简单绘制cumsum见图 8-8)。曲线中通常会有一个弯头,解释的方差在此停止快速增长。在这种情况下,您可以看到将维度减少到大约 100 个维度不会损失太多解释方差。

图 8-8。将方差解释为维数的函数

用于压缩的 PCA

降维,训练集占用更少的空间。例如,尝试将 PCA 应用于 MNIST 数据集,同时保留 95% 的方差。您应该会发现每个实例将有超过 150 个特征,而不是原来的 784 个特征。因此,虽然保留了大部分方差,但数据集现在不到其原始大小的 20%!这是一个合理的压缩比,您可以看到这种尺寸减小如何极大地加快分类算法(例如 SVM 分类器)的速度。

也可以通过应用 PCA 投影的逆变换,将减少的数据集解压缩回 784 维。这不会给您返回原始数据,因为投影丢失了一些信息(在丢弃的 5% 方差内),但它可能会接近原始数据。原始数据和重建数据(压缩然后解压缩)之间的均方距离为称为重构误差

以下代码将 MNIST 数据集压缩到 154 维,然后使用该inverse_transform()方法将其解压缩回 784 维:

pca = PCA(n_components = 154)
X_reduced = pca.fit_transform(X_train)
X_recovered = pca.inverse_transform(X_reduced)

图 8-9显示了原始训练集(左侧)的几个数字,以及压缩和解压缩后的相应数字。您可以看到有轻微的图像质量损失,但数字仍然大部分完好无损。

图 8-9。MNIST 压缩,保留 95% 的方差

逆变换公式如公式 8-3所示。

公式 8-3。PCA逆变换,回到原来的维数

随机 PCA

 如果您将超参数设置svd_solver"randomized", Scikit-Learn使用称为Randomized PCA的随机算法,可以快速找到前d个主成分的近似值。它的计算复杂度是O ( m × 2 ) + O ( 3 ),而不是完全 SVD 方法的O ( m × 2 ) + O ( 3 ),所以当d为比n小得多:

rnd_pca = PCA(n_components=154, svd_solver="randomized")
X_reduced = rnd_pca.fit_transform(X_train)

默认情况下,svd_solver实际设置为:如果mn大于 500 并且d小于mn"auto"的 80%,则Scikit-Learn 自动使用随机 PCA 算法,否则它使用完整的 SVD 方法。如果你想强制 Scikit-Learn要使用完整的 SVD,您可以svd_solver将超参数设置为"full".

增量 PCA

前面的 PCA 实现的问题是它们需要整个训练集适合内存才能运行算法。幸运的是,已经开发了增量 PCA (IPCA) 算法。它们允许您将训练集拆分为小批量,并一次提供一个小批量的 IPCA 算法。这对于大型训练集和在线应用 PCA(即,在新实例到达时即时)很有用。

以下代码将 MNIST 数据集拆分为 100 个小批量(使用 NumPy 的array_split()函数)并将它们提供给Scikit-Learn 的第5IncrementalPCA类将 MNIST 数据集的维度降低到 154 维(就像以前一样)。请注意,您必须使用每个小批量调用该方法,而不是使用整个训练集调用该方法:partial_fit()fit()

from sklearn.decomposition import IncrementalPCA

n_batches = 100
inc_pca = IncrementalPCA(n_components=154)
for X_batch in np.array_split(X_train, n_batches):
    inc_pca.partial_fit(X_batch)

X_reduced = inc_pca.transform(X_train)

或者,您可以使用NumPy 的memmap类,它允许您操作存储在磁盘上的二进制文件中的大型数组,就好像它完全在内存中一样;该类仅在需要时将其需要的数据加载到内存中。由于IncrementalPCA该类在任何给定时间仅使用数组的一小部分,因此内存使用情况仍然受到控制。这使得调用通常的fit()方法成为可能,如您在以下代码中所见:

X_mm = np.memmap(filename, dtype="float32", mode="readonly", shape=(m, n))

batch_size = m // n_batches
inc_pca = IncrementalPCA(n_components=154, batch_size=batch_size)
inc_pca.fit(X_mm)

内核 PCA

第 5 章中,我们讨论了核技巧,一种将实例隐式映射到非常高维的数学技术空间(称为特征空间),使用支持向量机实现非线性分类和回归。回想一下,高维特征空间中的线性决策边界对应于复杂的非线性原始空间中的决策边界。

事实证明,同样的技巧可以应用于 PCA,从而可以执行复杂的非线性投影以降低维度。这称为内核 PCA (kPCA)6它通常擅长在投影后保留实例集群,有时甚至可以展开靠近扭曲流形的数据集。

以下代码使用 Scikit-Learn 的KernelPCA类通过 RBF 内核执行 kPCA(有关 RBF 内核和其他内核的更多详细信息,请参见第 5 章):

from sklearn.decomposition import KernelPCA

rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.04)
X_reduced = rbf_pca.fit_transform(X)

图 8-10PCA显示了瑞士卷,使用线性内核(相当于简单地使用类)、RBF 内核和 sigmoid 内核将其简化为二维。

                        图 8-10。使用具有各种内核的 kPCA 将瑞士卷减少到 2D

选择内核和调整超参数

由于 kPCA 是一种无监督学习算法,因此没有明显的性能指标可以帮助您选择最佳内核和超参数值。也就是说,降维通常是监督学习任务(例如分类)的准备步骤,因此您可以使用网格搜索来选择能够在该任务中获得最佳性能的内核和超参数。以下代码创建了一个两步流水线,首先使用 kPCA 将维度减少到二维,然后应用逻辑回归进行分类。然后它用于为 kPCAGridSearchCV找到最佳内核和gamma值,以便在管道末端获得最佳分类精度:

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_变量获得最佳内核和超参数:

>>> print(grid_search.best_params_)
{'kpca__gamma': 0.043333333333333335, 'kpca__kernel': 'rbf'}

另一种方法,这次完全无监督,是选择产生最低重构误差的内核和超参数。请注意,重建不像线性 PCA 那样容易。这就是为什么。图 8-11显示了原始瑞士卷 3D 数据集(左上)和使用 RBF 内核应用 kPCA 后生成的 2D 数据集(右上)。非常感谢核技巧,这种变换在数学上等价于使用特征图φ 将训练集映射到无限维特征空间(右下),然后使用线性 PCA 将变换后的训练集投影到 2D。

请注意,如果我们可以在缩减空间中为给定实例反转线性 PCA 步骤,则重建点将位于特征空间中,而不是在原始空间中(例如,如图中用 X 表示的那个)。由于特征空间是无限维的,我们无法计算重构点,因此我们无法计算真实的重构误差。幸运的是,可以在原始空间中找到一个映射到重建点附近的点。这一点称为重建原像。一旦你有了这个原像,你就可以测量它到原始实例的平方距离。然后,您可以选择最小化此重建图像前误差的内核和超参数。

图 8-11。内核 PCA 和重建原像误差

您可能想知道如何执行此重建。一种解决方案是训练一个有监督的回归模型,将投影实例作为训练集,将原始实例作为目标。Scikit-学习如果设置 会自动执行此操作fit_inverse_transform=True,如以下代码所示:7

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=FalseKernelPCA没有inverse_transform()方法。此方法仅在您设置时创建fit_inverse_transform=True

然后,您可以计算重建原像误差:

>>> from sklearn.metrics import mean_squared_error
>>> mean_squared_error(X, X_preimage)
32.786308795766132

现在,您可以使用带有交叉验证的网格搜索来找到最小化此错误的内核和超参数。

LLE

局部线性嵌入(LLE) 8另一种强大的非线性降维(NLDR)技术。它是一种不依赖于投影的流形学习技术,就像以前的算法一样。简而言之,LLE 的工作原理是首先测量每个训练实例与其最近邻居 (cn) 的线性关系,然后寻找训练集的低维表示,其中这些局部关系最好保留(稍后会详细介绍)。这种方法使其特别擅长展开扭曲的流形,尤其是在没有太多噪音的情况下。

以下代码使用LocallyLinearEmbedding展开瑞士卷的 Scikit-Learn课程:

from sklearn.manifold import LocallyLinearEmbedding

lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10)
X_reduced = lle.fit_transform(X)

生成的二维数据集如图 8-12所示。如您所见,瑞士卷完全展开,实例之间的距离在局部保存得很好。然而,距离并没有在更大的范围内保留:展开的瑞士卷的左侧部分被拉伸,而右侧部分被挤压。尽管如此,LLE 在对流形建模方面做得相当不错。

图 8-12。使用 LLE 展开的瑞士卷

以下是 LLE 的工作原理:对于每个训练实例i ),算法识别其k个最近邻居(在前面的代码中k = 10),然后尝试将i )重构为这些邻居的线性函数。更具体地说,它找到权重i,j使得i )和∑j=1mwi,jx(j)尽可能小,假设i,j = 0 如果j )不是i )的k个最近邻居之一。因此,LLE 的第一步是方程 8-4中描述的约束优化问题,其中W是包含所有权重i,j的权重矩阵。第二个约束只是对每个训练实例i )的权重进行归一化。

公式 8-4。LLE 第一步:对局部关系进行线性建模

 这一步之后,权重矩阵W^(包含权重w^i,j) 对训练实例之间的局部线性关系进行编码。第二步是将训练实例映射到d维空间(其中d < n),同时尽可能保留这些局部关系。如果i )是i )在这个d维空间中的图像,那么我们想要i )和∑j=1mw^i,jz(j)尽可能小。这个想法导致了公式 8-5中描述的无约束优化问题。它看起来与第一步非常相似,但不是保持实例固定并找到最佳权重,而是相反:保持权重固定并找到实例图像在低维空间中的最佳位置。注意Z是包含所有i )的矩阵。

公式 8-5。LLE 第二步:在保留关系的同时降低维度

Scikit-Learn 的 LLE 实现具有以下计算复杂度:O ( m log( m ) n log( k ))用于找到k个最近邻居,O ( mnk 3 ) 用于优化权重,以及O ( dm 2 ) 用于构建低维表示。不幸的是,最后一项中的2使该算法无法很好地扩展到非常大的数据集。

其他降维技术

那里还有许多其他的降维技术,其中一些是在 Scikit-Learn 中可用。以下是一些最受欢迎的:

随机投影

作为顾名思义,使用随机线性投影将数据投影到低维空间。这听起来可能很疯狂,但事实证明,这种随机投影实际上很可能很好地保持距离,正如 William B. Johnson 和 Joram Lindenstrauss 在一个著名的引理中所证明的那样。降维的质量取决于实例的数量和目标维度,但令人惊讶的是不取决于初始维度。查看sklearn.random_projection包的文档以获取更多详细信息。

多维缩放 (MDS)

减少维度,同时试图保持实例之间的距离。

等值图

创建通过将每个实例连接到其最近的邻居,然后在尝试保持实例之间的测地线距离9的同时降低维数。

t-分布随机邻域嵌入 (t-SNE)

降低维度同时试图保持相似的实例靠近和不同的实例分开。它主要用于可视化,特别是在高维空间中可视化实例集群(例如,在 2D 中可视化 MNIST 图像)。

线性判别分析 (LDA)

一种分类算法,但在训练期间,它会学习类别之间最具区分性的轴,然后这些轴可用于定义将数据投影到其上的超平面。这种方法的好处是投影将使类尽可能地分开,因此 LDA 是一种在运行另一种分类算法(如 SVM 分类器)之前降低维度的好技术。

图 8-13显示了其中一些技术的结果。

图 8-13。使用各种技术将 Swill 滚动减少到 2D

练习

  1. 降低数据集维度的主要动机是什么?主要缺点是什么?

  2. 什么是维度的诅咒?

  3. 一旦数据集的维数减少了,是否可以反转操作?如果是这样,怎么做?如果不是,为什么?

  4. 可以使用 PCA 来降低高度非线性数据集的维数吗?

  5. 假设您对 1,000 维数据集执行 PCA,将解释方差比设置为 95%。生成的数据集将有多少维?

  6. 在什么情况下您会使用普通 PCA、增量 PCA、随机 PCA 或内核 PCA?

  7. 您如何评估数据集上的降维算法的性能?

  8. 链接两种不同的降维算法是否有意义?

  9. 加载 MNIST 数据集(在第 3 章中介绍)并将其拆分为训练集和测试集(将前 60,000 个实例用于训练,其余 10,000 个用于测试)。在数据集上训练随机森林分类器并计算所需时间,然后在测试集上评估生成的模型。接下来,使用 PCA 降低数据集的维数,解释方差比为 95%。在减少的数据集上训练一个新的随机森林分类器,看看它需要多长时间。训练速度更快吗?接下来,在测试集上评估分类器。它与之前的分类器相比如何?

  10. 使用 t-SNE 将 MNIST 数据集缩减为二维并使用 Matplotlib 绘制结果。您可以使用 10 种不同颜色的散点图来表示每个图像的目标类。或者,您可以将散点图中的每个点替换为相应实例的类(从 0 到 9 的数字),甚至绘制数字图像本身的缩小版本(如果绘制所有数字,可视化将过于混乱,因此,您应该绘制一个随机样本或仅在近距离未绘制其他实例的情况下绘制一个实例)。您应该得到一个很好的可视化效果,其中包含良好分离的数字簇。尝试使用其他降维算法,例如 PCA、LLE 或 MDS,并比较生成的可视化效果。

附录 A中提供了这些练习的解决方案。

1好吧,如果您计算时间,则为四个维度,如果您是弦理论家,则更多。

2在https://homl.info/30观看投影到 3D 空间的旋转 tesseract 。图片来自维基百科用户 NerdBoy1392(知识共享 BY-SA 3.0)。转载自https://en.wikipedia.org/wiki/Tesseract

3有趣的事实:如果您考虑足够的维度,您认识的任何人都可能在至少一个维度上是极端主义者(例如,他们在咖啡中放了多少糖)。

4卡尔·皮尔森(Karl Pearson),“关于最接近空间点系统的线和平面” ,伦敦、爱丁堡和都柏林哲学杂志和科学杂志2,第 2 期。11(1901):559-572,https ://homl.info/pca 。

5Scikit-Learn 使用了 David A. Ross 等人在“Incremental Learning for Robust Visual Tracking”中描述的算法,国际计算机视觉杂志77,第 3 期。1-3 (2008): 125-141。

6Bernhard Schölkopf 等人,“内核主成分分析”,计算机科学讲义1327(柏林:施普林格,1997):583–588。

7如果设置,Scikit-Learn 将使用 Gokhan H. Bakır 等人, “Learning to Find Pre-Images”第 16 届神经信息处理系统国际会议论文集(2004 年fit_inverse_transform=True)中描述的算法(基于 Kernel Ridge 回归)):449–456。

8Sam T. Roweis 和 Lawrence K. Saul,“局部线性嵌入的非线性降维”,《科学》 290 期,第 1 期。5500(2000):2323–2326。

9图中两个节点之间的测地线距离是这些节点之间最短路径上的节点数。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值