Isomap在Python中怎么实现

发布时间:2021-12-27 13:48:39 作者:iii
来源:亿速云 阅读:418

这篇文章主要讲解了“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的方法,用于保存数据的形状,其中每个点彼此连接。然而,右边是一种只计算数据点邻域之间的距离的方法。

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也可在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或其他流形学习技术中表现良好,因为它们是泛化。

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

关键点

感谢各位的阅读,以上就是“Isomap在Python中怎么实现”的内容了,经过本文的学习后,相信大家对Isomap在Python中怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 在python中实现随机选择
  2. 怎么在Python中实现ORM编程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:基于NA公链Nirvana的应用和NAC公链社区共识探究公链的示例分析

下一篇:C语言怎么绘制圣诞水晶球

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》