首页 > 编程语言 >Python实现等距映射(ISOMAP)降维算法

Python实现等距映射(ISOMAP)降维算法

时间:2024-08-29 20:22:13浏览次数:7  
标签:Python self 降维 算法 samples 数据 ISOMAP

目录

Python实现等距映射(ISOMAP)降维算法的博客

引言

在高维数据处理中,降维是一种常用的技术,它通过减少数据的维度来降低计算复杂度,同时保留数据的主要特征。在许多情况下,数据可能存在于一个非线性流形中,因此线性降维技术(如PCA)可能不足以捕捉数据的非线性结构。等距映射(Isometric Mapping,简称ISOMAP)是一种能够保留数据全局几何结构的非线性降维算法。在这篇博客中,我们将详细介绍ISOMAP算法的原理,并使用Python实现ISOMAP算法,展示其在实际场景中的应用。

ISOMAP算法原理

ISOMAP是一种基于流形学习的非线性降维算法,它将高维数据中的距离映射到低维空间中,保留点之间的全局几何结构。ISOMAP算法结合了经典多维尺度分析(MDS)和最短路径算法,通过以下几个步骤实现降维:

  1. 构建k近邻图
    对于每个数据点,找到其最近的k个邻居,并在这些点之间建立边。边的权重通常是点与点之间的欧氏距离。通过这个步骤,ISOMAP将高维数据中的点连接成一个图。

  2. 计算最短路径
    使用最短路径算法(如Dijkstra算法或Floyd-Warshall算法)计算图中每对点之间的最短路径距离。这样可以估计高维空间中任意两点之间的“等距”距离,这比简单的欧氏距离更能反映数据的全局几何结构。

  3. 多维尺度分析(MDS)
    将前一步计算的最短路径距离作为输入,应用经典MDS算法,找到在低维空间中能最好地保持这些距离的点。MDS的目标是通过最小化低维空间中点之间的距离与高维空间中最短路径距离的差异来找到低维表示。

ISOMAP的优势与局限

ISOMAP算法的主要优势在于它能够保留数据的全局几何结构,而不仅仅是局部的线性关系。通过考虑全局的最短路径距离,ISOMAP能够更好地捕捉非线性流形的结构,从而在降维后保留数据的重要特征。

然而,ISOMAP也有一些局限性。例如,它对噪声和稀疏数据敏感,最短路径算法可能会受到图中不连通部分的影响。此外,选择合适的近邻数k对于ISOMAP的效果至关重要,如果k值选择不当,可能会导致降维结果不佳。

Python实现ISOMAP算法

接下来,我们将使用Python实现ISOMAP算法,并将其封装到一个面向对象的类中。

1. 创建ISOMAP类
import numpy as np
from sklearn.neighbors import NearestNeighbors
from scipy.sparse.csgraph import shortest_path
from sklearn.decomposition import KernelPCA

class ISOMAP:
    def __init__(self, n_components=2, n_neighbors=5):
        """
        初始化ISOMAP类
        :param n_components: 降维后的维度
        :param n_neighbors: 最近邻居数
        """
        self.n_components = n_components
        self.n_neighbors = n_neighbors
        self.embedding_ = None  # 降维后的数据
        self.dist_matrix_ = None  # 最短路径距离矩阵

    def fit(self, X):
        """
        训练ISOMAP模型
        :param X: 训练数据
        """
        n_samples = X.shape[0]

        # Step 1: 构建k近邻图
        knn = NearestNeighbors(n_neighbors=self.n_neighbors)
        knn.fit(X)
        distances, indices = knn.kneighbors(X)
        graph = np.full((n_samples, n_samples), np.inf)
        for i in range(n_samples):
            graph[i, indices[i]] = distances[i]
            graph[indices[i], i] = distances[i]

        # Step 2: 计算最短路径距离
        self.dist_matrix_ = shortest_path(graph, method='D', directed=False)

        # Step 3: 应用MDS进行降维
        self.embedding_ = self._mds(self.dist_matrix_)

    def _mds(self, dist_matrix):
        """
        使用MDS算法进行降维
        :param dist_matrix: 最短路径距离矩阵
        :return: 降维后的数据
        """
        n_samples = dist_matrix.shape[0]
        H = np.eye(n_samples) - np.ones((n_samples, n_samples)) / n_samples
        B = -0.5 * H.dot(dist_matrix**2).dot(H)
        eigvals, eigvecs = np.linalg.eigh(B)
        sorted_indices = np.argsort(eigvals)[::-1]
        eigvals = eigvals[sorted_indices]
        eigvecs = eigvecs[:, sorted_indices]
        return eigvecs[:, :self.n_components] * np.sqrt(eigvals[:self.n_components])

    def fit_transform(self, X):
        """
        训练ISOMAP模型并返回降维后的数据
        :param X: 输入数据矩阵
        :return: 降维后的数据
        """
        self.fit(X)
        return self.embedding_
2. 在瑞士卷数据集上应用ISOMAP

为了展示ISOMAP算法的效果,我们将使用瑞士卷数据集进行降维。瑞士卷数据集是一种三维的非线性数据结构,传统的PCA方法难以有效地对其降维,而ISOMAP能够较好地捕捉其非线性结构。

from sklearn.datasets import make_swiss_roll
import matplotlib.pyplot as plt

# 生成瑞士卷数据集
X, color = make_swiss_roll(n_samples=1000, noise=0.2)

# 使用ISOMAP进行降维
isomap = ISOMAP(n_components=2, n_neighbors=10)
X_isomap = isomap.fit_transform(X)

# 绘制降维前后的数据分布
fig = plt.figure(figsize=(12, 6))

ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral)
ax.set_title("Original 3D data")

ax = fig.add_subplot(122)
ax.scatter(X_isomap[:, 0], X_isomap[:, 1], c=color, cmap=plt.cm.Spectral)
ax.set_title("2D embedding by ISOMAP")

plt.show()
3. 结果分析

通过在瑞士卷数据集上的实验,我们可以看到ISOMAP算法能够成功地将数据从三维映射到二维,同时保留了数据的全局几何结构。与PCA相比,ISOMAP在降维后能够更好地保留数据的曲面结构,显示出它在处理非线性数据时的优势。

总结

等距映射(ISOMAP)是一种有效的非线性降维方法,它通过构建k近邻图和计算最短路径距离来保留数据的全局几何结构。ISOMAP结合了多维尺度分析(MDS)和最短路径算法,能够在降维过程中保留数据的非线性结构,使得降维后的数据分布更为紧凑和清晰。

在本文中,我们详细介绍了ISOMAP算法的原理,并通过Python实现了ISOMAP算法的面向对象版本。通过在瑞士卷数据集上的实验,验证了ISOMAP的有效性。ISOMAP适用于各种高维和非线性数据的降维需求,是数据预处理和特征提取的重要工具。

在实践中,ISOMAP的表现受到近邻数k的选择、数据的噪声以及图的连通性的影响。因此,在应用ISOMAP算法时,需要根据具体数据集的特点进行调整和优化。

运行结果

在这里插入图片描述

标签:Python,self,降维,算法,samples,数据,ISOMAP
From: https://blog.csdn.net/qq_42568323/article/details/141600166

相关文章

  • python基础(11文件读取)
    python系列文章目录python基础(01变量&数据类型&运算符)python基础(02序列共性)python基础(03列表和元组)python基础(04字符串&字典)python基础(05集合set)python基础(06控制语句)python基础(07函数)python基础(08类和对象)python基础(09闭包&装饰器)python基础(10异常处理)文章......
  • 计算机毕业设计选题推荐-在线音乐网站-音乐专辑商城-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 计算机毕业设计选题推荐-中药材进存销管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 基于python+flask框架的物资捐赠管理平台的管理和实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在自然灾害频发、社会公益需求日益增长的背景下,物资捐赠作为快速响应社会需求、传递爱心的重要方式,其高效管理和透明化运作显得尤为重要。......
  • 基于python+flask框架的旅游景点票务管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,越来越多的游客选择前往各地旅游景点观光游览,这极大地促进了旅游市场的繁荣。然而,传统的票务管理方式往往存在排队购......
  • 用python创建文件夹并授予权限(windows和linux通用)
    因为是对路径进行操作,所以使用os模块importos创建文件夹,使用os.mkdir#directory_path='要创建路径的完整路径'new_directory='D:\\test'#以windows为例,在D盘创建一个test的文件夹os.mkdir(new_directory)给文件夹授权,使用os.chmod#这里给刚创建的文件夹777的......
  • python解释器[源代码层面]
    1PyDictObject在c++中STL中的map是基于RB-tree平衡二元树实现,搜索的时间复杂度为O(log2n)Python中PyDictObject是基于散列表(散列函数)实现,搜索时间最优为O(1)1.1散列列表问题:散列冲突:多个元素计算得到相同的哈希值解决方法:(1)开链法(2)开放地址法:二次探测法(python......
  • python读取配置文件&&简单封装 公共配置文件 config
    之前有做过把爬虫数据写到数据库中的练习,这次想把数据库信息抽离到一个ini配置文件中,这样做的好处在于可以在配置文件中添加多个数据库,方便切换(另外配置文件也可以添加诸如邮箱、url等信息)1.configparser模块python使用自带的configparser模块用来读取配置文件,配置文......
  • 分享4大主流 Python IDE,助力你高效编写Python代码
    Python作为一门简洁易学、功能强大的编程语言,在各个领域都展现出了强大的魅力。而选择一款合适的IDE,则是提高Python开发效率的关键。本文将带你深入了解4大主流PythonIDE:PyCharm、Spyder、JupyterNotebook、VSCode,帮助你找到最适合自己的开发利器。PyCharm:专业开发......
  • python Pandas合并(单元格、sheet、excel )
    如果你对Python感兴趣的话,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!安装Pandas和openpyxl首先,确保已经安装了Pandas和openpyxl。可以通过pip安装:pip install pandas openpyxl创建DataFrameimportpandasaspd#创建DataFramed......