Isomap在Python中怎么实现

这篇文章主要讲解了“Isomap在Python中怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Isomap在Python中怎么实现”吧!

主成分分析是一种强大的方法,但它往往失败,因为它假设数据可以线性建模。PCA将新的特征表示为现有特征的线性组合,将每个特征乘以一个系数。

Isomap在Python中怎么实现

为了解决主成分分析的局限性,人们通过对具有不同结构的数据进行应用而产生了各种各样的技术。然而,流形学习寻求一种可以推广到所有数据结构的方法。

不同的数据结构指的是数据中不同的属性。例如,它可能是线性可分的,也可能是非常稀疏的。数据中的关系可以是相切的、平行的、包络的或正交的。PCA在非常特定的数据结构子集上工作得很好,因为它是在线性假设下工作的。

为了把事情放在上下文中,考虑300×300像素的头像。在完美的条件下,每个图像都会完美地居中,但实际上,还需要考虑许多额外的自由度,例如灯光或脸部倾斜。如果我们把一个头像当作90000维空间中的一个点,改变各种效果,比如倾斜头部或朝不同的方向看,会使它在空间中非线性移动,即使它是同一类的同一个物体。

Isomap在Python中怎么实现

这种数据经常出现在现实世界的数据集中。除此之外,当PCA呈现倾斜分布、极值时,PCA可能会变得很糟糕(参见非线性PCA以获得解决方案)。我们需要一种可推广的降维方法。

流形学习就是指这个任务。流形学习中有许多方法可能是以前见过的,例如t-SNE和局部线性嵌入(LLE)。有许多文章和论文深入到这些算法的技术和数学细节,但这篇文章将集中在一般的直觉和实现上。

注意,虽然有一些维度缩减的变体是有监督的(例如线性/二次判别分析),流形学习通常指的是无监督的降维,其中类别没有提供给算法(虽然可能存在)。

PCA试图创建几个线性超平面来表示维度,就像多元回归构造作为数据的估计,流形学习尝试学习流形,流形是多维空间中光滑的曲面。如下图所示,这些通常是通过对图像进行细微的变换而形成的。

Isomap在Python中怎么实现

然后,local linear patches可以提取与流形相切的部分。这些patches(补丁)通常有足够的数量,因此可以准确地表示流形。

这些流形不是由任何一个数学函数建模的,而是由几个小的线性补丁,所以这些线性邻域可以建模任何流形。虽然这可能不是明确的某些算法如何接近建模的流形,基本思想是非常相似的。

以下是流形学习算法的基本假设或方面:

  • 数据中存在着可以通过流形建模的非线性关系—曲面跨越多个维度,平滑,且不太“摇摆”(太复杂)。

  • 保持数据的多维形状并不重要。与其用特定的方向来“展开”或“投影”数据(如PCA)来保持数据的一般形状,不如执行更复杂的操作,如展开一个卷曲的条带或将球体从内向外翻转。

  • 流形建模的最佳方法是将曲面视为由几个邻域组成的曲面。如果每个数据点都设法保持与所有其他点之间的距离,而只保留与它相邻的点之间的距离,则可以在数据中保持几何关系。

通过研究分解这个螺旋状数据集之间的不同方法,可以很好地理解这个想法。左侧是一种更像PCA的方法,用于保存数据的形状,其中每个点彼此连接。然而,右边是一种只计算数据点邻域之间的距离的方法。

Isomap在Python中怎么实现

这种对邻域之外的点的相对忽视会导致有趣的结果。例如,考虑这个瑞士轧辊数据集,它被卷绕在三维空间中,并被简化为二维的条形图。在某些情况下,这种效果并不理想。然而,如果这条曲线是图像中摄像机倾斜或音频质量受到外部影响的结果,流形学习通过巧妙地解开这些复杂的非线性关系给我们带来了巨大的帮助。

Isomap在Python中怎么实现

在瑞士Roll数据集上,PCA甚至像Kernel-PCA这样的特殊变体都无法捕捉值的梯度。另一方面,流形学习算法局部线性嵌入(LLE)也能够做到。

Isomap在Python中怎么实现

让我们更详细地了解三种流行的流形学习算法:IsoMap、局部线性嵌入和t-SNE。

流形学习的最早探索之一是Isomap算法,即等距映射的缩写。Isomap寻求一种低维表示,以保持点之间的“距离”。距离是曲面距离的推广。因此,Isomap不是用毕达哥拉斯定理导出的距离公式来测量纯欧几里德距离,而是沿着发现的流形优化距离。

Isomap在Python中怎么实现

当在MNIST数据集上训练时,Isomap的性能优于PCA,显示了不同类型的数字的正确分割。某些数字组之间的接近和距离揭示了数据的结构。例如,距离较近的“5”和“3”(在左下角)看起来确实很相似。

下面是Isomap在Python中的实现。由于MNIST是一个非常大的数据集,所以你可能只想在前100个训练示例中使用.fit_transform(X[:100])训练Isomap。

from sklearn.datasets import load_digits #mnist
from sklearn.manifold import Isomap
X, _ = load_digits(return_X_y=True) #加载数据

embedding = Isomap(n_components=2) #结果数据有2个维度,即“成分”
X_transformed = embedding.fit_transform(X) #拟合模型及变换

局部线性嵌入使用各种切线线性面片(如上图所示)来建模流形。它可以被认为是对每个邻域进行局部PCA,生成一个线性超平面,然后全局比较结果以找到最佳的非线性嵌入。LLE的目标是以扭曲的方式“展开”或“解包”数据的结构,因此LLE通常会在中心具有更高密度。

Isomap在Python中怎么实现

注意,LLE在MNIST数据集上的性能相对较差。这很可能是因为MNIST数据集由多个流形组成,而LLE被设计用于处理更简单的数据集(如Swiss Roll)。它将一个函数表示为几个小的线性函数的策略可能无法很好地处理大型复杂的数据集结构。

假设数据集(X)已经加载,LLE的实现如下所示。

from sklearn.manifold import LocallyLinearEmbedding
embedding = LocallyLinearEmbedding(n_components=2) #2维
X_transformed = embedding.fit_transform(X)

t-SNE是高维可视化中最流行的选择之一,是t分布随机邻居嵌入的代表。该算法将原始空间中的关系转化为t分布,即小样本和相对未知标准差的正态分布。这使得t-SNE对流形学习中常见的局部结构非常敏感。由于它具有许多优点,因此被认为是一种可行的可视化方法。优点如下:

  • 它能够在多个尺度上揭示数据的结构。

  • 它揭示了存在于多个流形和簇中的数据

  • 在中心聚集点的趋势较小。

Isomap和LLE是展开单个、连续、低维流形的最佳工具。另一方面,t-SNE关注数据的局部结构,试图聚集局部,而不是试图“展开”。这使得t-SNE在用多个流形去拟合高维数据方面占据了上风。它使用梯度下降法训练,并试图最小化分布之间的熵。从这个意义上讲,它几乎就像一个简化的、无监督的神经网络。

t-SNE非常强大,Isomap和LLE尝试展开数据,而t-SNE尝试聚集数据。对于像MNIST这样的高维多流形数据集,旋转和移位导致非线性关系,t-SNE的性能甚至比LDA更好,LDA还需要标签信息。

Isomap在Python中怎么实现

然而,t-SNE也有一些缺点:

  • t-SNE在计算上非常昂贵(比较上面图表中的运行时)。对于一百万个样本数据集,它可能需要几个小时,而PCA可以在几秒钟或几分钟内完成。

  • 该算法利用随机性(随机性)选取种子,如果种子放置不当,会增加算法的运行时间,降低性能。

  • 全局结构没有被显式地保留(即更强调聚类而不是展示全局结构)。然而,在sklearn的实现中,这个问题可以通过使用PCA初始化点来解决,PCA是专门为保持全局结构而构建的。

t-SNE也可在sklearn中实现:

from sklearn.manifold import TSNE
embedding = TSNE(n_components=2) ##2维
X_transformed = embedding.fit_transform(X)

t-SNE的作者Laurens van der Maaten说,当t-SNE结果不好时,应考虑以下几点:

作为健全性检查,尝试对数据运行PCA以将其减少到二维。如果这也给出了糟糕的结果,那么也许你的数据在一开始就没有很好的结构。如果PCA很好,但t-SNE不行,我很肯定你做错了什么。

他为什么这么说?流形学习不是PCA的另一种变体,而是一种泛化。在PCA中表现良好的东西几乎可以保证在t-SNE或其他流形学习技术中表现良好,因为它们是泛化。

就像一个苹果也是一个水果(泛化)的对象一样,如果某个事物不能产生与它的泛化相似的结果,那么通常就是错误的。另一方面,如果这两种方法都失败了,数据很可能很难建模。

关键点
  • 由于PCA是线性的,所以不能对非线性关系进行建模。

  • 非线性关系常常出现在数据集中,因为像光照或倾斜可以在欧几里德空间中非线性移动同一类的数据点。

  • 流形学习试图将PCA推广到各种数据集结构上进行降维,其主要思想是流形或连续曲面的建模应保持局部距离优先于全局距离。

  • Isomap试图保持流形曲面测量的距离,即不是在欧几里德空间的距离。

  • 局部线性嵌入可以看作是将流形表示为若干个线性块,其中PCA在其中执行。

  • t-SNE采用了更多的“聚类”方法,而不是“展开”方法,但仍然像其他流形学习算法一样,通过使用概率和t分布来优先保持局部距离。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注