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

目录

      • Python实现等距映射(ISOMAP)降维算法的博客
        • 引言
        • ISOMAP算法原理
        • ISOMAP的优势与局限
        • Python实现ISOMAP算法
          • 1. 创建ISOMAP类
          • 2. 在瑞士卷数据集上应用ISOMAP
          • 3. 结果分析
        • 总结
        • 运行结果

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 KernelPCAclass ISOMAP:def __init__(self, n_components=2, n_neighbors=5):"""初始化ISOMAP类:param n_components: 降维后的维度:param n_neighbors: 最近邻居数"""self.n_components = n_componentsself.n_neighbors = n_neighborsself.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_samplesB = -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算法时,需要根据具体数据集的特点进行调整和优化。

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NS2582 同步升压双节锂电池充电管理 IC

1 特性  最大 2A 输出同步开关型升压充电器  升压效率可高达 90% 以上  内置电池短路 / 涓流 / 恒流 / 恒压模式  0.5% 电池恒压模式电压精度  支持 LED 充电状态指示  支持充电电流外部可调  支持输入适配器 DPM 功能  外置 EN 使能…

探索Python的Excel力量:openpyxl库的奥秘

文章目录 探索Python的Excel力量:openpyxl库的奥秘背景:为什么选择openpyxl?库简介:openpyxl是什么?安装指南:如何安装openpyxl?快速上手:五个基本函数实战演练:三个应用…

Adobe Dreamweaver(DW)网页代码编辑器win/mac软件安装下载

一、Adobe DW软件概览 1.1 DW软件简介 Adobe Dreamweaver(简称DW)是一款功能强大的网页代码编辑器,由Adobe公司开发并维护。其全称为“Adobe Dreamweaver”,中文译为“梦想编织者”。DW集网页制作和管理网站于一身,支…

Ubuntu系统使用Docker部署中文版trilium并实现远程编辑笔记

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件,Trilium Notes的中文版如何在Linux环境使用docker本地部署…

代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

110. 平衡二叉树 第一想法:首先要明确平衡二叉树的定义?左右节点的高度差不超过1?不会概念感觉无法下手... 返回参数返回int,为了标记已经不是平衡二叉树,用-1作标记 int traversal(TreeNode* root){if(rootnullptr) return 0;…

量化需求的业务价值 常见6种方法

量化需求的业务价值可以帮助项目团队更好地理解需求的重要性,并据此做出明智的决策。如果没有明确的量化目标,团队难以做出基于数据的决策,可能导致项目方向模糊,资源分配不当,导致项目进度难以把控,延误交…

平安银行“平安财富杯”高尔夫青少年冠军赛盛大举行,各组冠军精彩角逐实力尽显

今年夏天,巴黎体育盛会聚集了全球目光,中国选手林希妤斩获女子高尔夫球铜牌,追平中国女子高尔夫球历史最佳奥运战绩,让球迷大呼过瘾。奥运会结束后,比赛的热情在中原大地继续上演。8月22日,2024年平安银行“…

Shopify/shopline等独立站paypal快速提现到国内银行卡

做shopify/shopline/shopyy/shoplazza独立站用得最多的收款方式为paypal。 下面介绍如何把paypal里面的资金提现到我们国内银行卡,收款工具是GeeWallet。 1、注册GeeWallet注册入口 2、打开链接,填入手机号或者邮箱,点击立即注册 3、在注册…

【软件使用-MEGA】报错及解决方法

报错1:Error: MEGA has detected duplicate taxa labels. (in line 370) **************************************************************************** ; Please note the following important messages: ; **********************************…

学习之数据库相关概念

数据库相关概念 主流的关系型数据库管理系统:

如何使用ssm实现基于jsp的快递管理系统的开发

TOC ssm226基于jsp的快递管理系统的开发jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规…

力扣刷题(复习版)

文章目录 题目:最大重复子字符串题解 题目: 面试题 16.07. 最大数值题解 题目: 最大字符串配对数目题解 题目: 字符串中第二大的数字题解 题目: 统计最大组的数目题解 题目: 删除每行中的最大值题解 总结 题…

Commons Lang库中,StringUtils.isBlank()和StringUtils.isEmpty()区别

在Apache Commons Lang库中,StringUtils.isBlank()和StringUtils.isEmpty()方法都是用来判断字符串是否为空或者空白的。它们的主要区别在于处理空格的方式上。 StringUtils.isEmpty(String str): 这个方法会返回true当字符串为null或者长度为0时。也就是说&#xf…

酸敏感多肽在药物递送方面的作用机制及其应用

摘要: 作为一类新型的递送载体,多肽具有丰富的生物活性、较低的免疫原性及良好的生物相容性,近年来利用多肽递送药物或基因的研究得到广泛关注。其中,具有酸敏感性的多肽,在肿瘤微环境或溶酶体的弱酸性条件下可以产生二级结构的改…

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range

【bug】可图文生图模型 KolorsPipeline IndexError: list index out of range 环境 linux diffusers 0.30.0问题详情 报错详情 from diffusers import KolorsPipelineTraceback (most recent call last):File "Kolors/demo.py", line 6, in <module>pi…

Circuitjs 利用标签(label)简化电路连线

在使用 circuitjs 绘制电路的过程中, 一旦电路变得复杂, 连线众多, 然后各种交叉就不可避免, 给人一种凌乱的感觉, 而某些跨越长距离的连线连接起来也特别麻烦, 后续如果要调整也特别繁琐. 为解决这些问题, 需要引入一种 虚拟连接 的方式, 简单讲就是在要连接的两头用同样的名…

Web-ssrfme

文章目录 环境分析攻击 环境 首先下载资源包&#xff0c;Ubuntu通过docker拉取环境。 docker-compose up -d分析 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);e…

Zombie Slayer(僵尸枪手第三人称射击模板)

特征: -3个独特的玩家。 -4个独特的僵尸。 -三种类型的武器。手枪、突击步枪和手榴弹。 -2个独特的地点。墓地。 -武器升级系统。 易于添加新武器、等级、敌人。 下载:​​Unity资源商店链接资源下载链接 效果图:

网络优化2|最小生成树|Kruskal|Prim|Matlab

最小生成树问题 树 连通图 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G中不含任何回路&#xff0c;则称G为树。 ∣ V ∣ 1 |V |1 ∣V∣1时称之为平凡树 生成树 G ( V , E ) G(V,E) G(V,E)&#xff0c;若G的一个生成子图是一棵树&#xff0c;则称之为G的一棵生成树&#…

Vue3+Ts封装input组件时遇到的问题

使用input事件监听输入框变化时&#xff0c;如果当前使用的输入法是中文&#xff0c;他也会触发input事件&#xff0c;正常来说&#xff0c;中文没有输入完毕是不用触发事件的。 控制台打印时发现&#xff1a; 那么我们应该怎么去规避这件事呢&#xff1f; 其实input还有几个事…