当前位置: 首页 > article >正文

多维尺度变换(MDS)实战指南:从原理到Python实现

1. 多维尺度变换MDS是什么多维尺度变换Multidimensional Scaling简称MDS是一种经典的降维算法它的核心思想是通过保持数据点之间的距离关系将高维数据映射到低维空间。想象一下你有一张世界地图上面标注了各个城市之间的实际距离。现在你需要把这张地图压缩成一个小尺寸的图片同时还要尽量保持城市之间的相对位置关系不变——这就是MDS在做的事情。MDS特别适合处理那些我们只知道物体之间远近关系但不知道具体坐标的数据。比如在心理学研究中我们可能知道受试者对不同刺激的相似度评分但不知道这些刺激在心理空间中的具体位置。MDS就能帮我们把这些隐含的结构可视化出来。在实际应用中MDS有两大主要用途一是数据可视化把高维数据降到2D或3D方便我们观察二是作为预处理步骤为其他机器学习算法准备数据。相比PCA等线性降维方法MDS的优势在于它能处理各种类型的距离或相似度数据不要求原始数据必须是数值型的坐标点。2. MDS算法原理详解2.1 距离矩阵的构建MDS的第一步是构建距离矩阵。假设我们有5个城市知道每两个城市之间的公路里程。这个里程表就是一个距离矩阵。在数学上距离矩阵D是一个n×n的对称矩阵n是数据点数量对角线元素为0因为自己到自己的距离为0。常用的距离度量包括欧氏距离最直观的直线距离曼哈顿距离网格状路径的距离总和余弦相似度衡量两个向量的夹角选择哪种距离取决于具体问题。比如在文本分析中余弦相似度可能更合适而在空间数据分析中欧氏距离更自然。2.2 中心化与内积矩阵有了距离矩阵后我们需要进行中心化处理。这一步的数学操作看起来有点复杂但目的很简单把数据居中就像把散点图的坐标系原点移到所有点的中心位置一样。中心化矩阵H的计算公式是H I - (1/n) * 11^T其中I是单位矩阵1是全1的列向量。然后我们通过一个巧妙的数学转换把距离矩阵D转换为内积矩阵BB -0.5 * H * D² * H这个内积矩阵包含了数据点之间的所有角度关系信息是后续步骤的基础。2.3 特征分解与降维坐标计算接下来对内积矩阵B进行特征分解得到特征值和特征向量。特征值的大小告诉我们每个维度的重要性特征向量则给出了新坐标轴的方向。选择前k个最大的特征值及其对应的特征向量k是我们想要的降维后的维度然后计算新坐标新坐标 特征向量矩阵 × 特征值对角矩阵的平方根这样得到的k维坐标就是我们的降维结果它尽可能地保留了原始数据点之间的距离关系。3. Python实现MDS全流程3.1 准备环境和数据我们先安装必要的库pip install numpy matplotlib scikit-learn让我们用Python从头实现一个MDS算法。首先导入需要的库import numpy as np from numpy.linalg import eig import matplotlib.pyplot as plt假设我们有一组三维数据点可以想象成不同水果在甜度、酸度、多汁度三个维度上的评分# 5种水果的三维特征甜度、酸度、多汁度 fruits np.array([ [6, 4, 5], # 苹果 [8, 1, 3], # 香蕉 [5, 7, 6], # 橙子 [7, 3, 4], # 葡萄 [4, 6, 8] # 菠萝 ]) labels [Apple, Banana, Orange, Grape, Pineapple]3.2 计算距离矩阵我们先计算所有点对之间的欧氏距离def calculate_distance_matrix(data): n data.shape[0] distance_matrix np.zeros((n, n)) for i in range(n): for j in range(n): distance_matrix[i, j] np.sqrt(np.sum((data[i] - data[j])**2)) return distance_matrix D calculate_distance_matrix(fruits) print(距离矩阵:\n, D)3.3 实现MDS核心算法现在实现MDS的核心计算步骤def mds(D, k2): n D.shape[0] # 1. 中心化矩阵 H np.eye(n) - np.ones((n, n)) / n # 2. 计算内积矩阵 D_squared D ** 2 B -0.5 * H D_squared H # 3. 特征分解 eigenvalues, eigenvectors eig(B) # 4. 选择前k个最大的特征值和特征向量 top_k_indices np.argsort(eigenvalues)[::-1][:k] selected_eigenvalues eigenvalues[top_k_indices] selected_eigenvectors eigenvectors[:, top_k_indices] # 5. 计算新坐标 coordinates selected_eigenvectors np.diag(np.sqrt(selected_eigenvalues)) return coordinates.real # 确保返回实数部分3.4 可视化结果让我们把降维后的结果画出来coordinates mds(D) plt.figure(figsize(8, 6)) plt.scatter(coordinates[:, 0], coordinates[:, 1], cred, s100) for i, label in enumerate(labels): plt.annotate(label, (coordinates[i, 0], coordinates[i, 1]), fontsize12) plt.title(MDS Visualization of Fruits, fontsize14) plt.xlabel(Dimension 1, fontsize12) plt.ylabel(Dimension 2, fontsize12) plt.grid(True) plt.show()4. 实战案例商品相似度分析4.1 电商应用场景假设你经营一家电商平台有10种商品记录了用户在这些商品之间的浏览切换频率。频率越高表示用户认为这两种商品越相似。现在你想把这些商品在二维平面上可视化看看哪些商品在用户心智中是接近的。首先我们模拟一个浏览切换频率矩阵这里用随机数据代替实际数据np.random.seed(42) n_products 10 product_names [fProduct {i1} for i in range(n_products)] # 生成对称的相似度矩阵 similarity np.random.rand(n_products, n_products) similarity (similarity similarity.T) / 2 np.fill_diagonal(similarity, 1) # 将相似度转换为距离相似度越高距离越小 distance_matrix 1 - similarity4.2 使用scikit-learn的MDS实现虽然我们上面自己实现了MDS但在实际项目中可以直接使用scikit-learn提供的实现from sklearn.manifold import MDS mds MDS(n_components2, dissimilarityprecomputed, random_state42) product_coords mds.fit_transform(distance_matrix) # 可视化 plt.figure(figsize(10, 8)) plt.scatter(product_coords[:, 0], product_coords[:, 1], cblue, s150) for i, name in enumerate(product_names): plt.annotate(name, (product_coords[i, 0], product_coords[i, 1]), fontsize10) plt.title(Product Similarity Visualization with MDS, fontsize14) plt.xlabel(Dimension 1, fontsize12) plt.ylabel(Dimension 2, fontsize12) plt.grid(True) plt.show()4.3 结果分析与业务应用从可视化结果中我们可以看到哪些商品聚集在一起这表示用户在浏览时经常在这些商品之间切换认为它们具有相似性或可替代性。这些洞察可以帮助我们优化商品分类和导航结构设计更有效的捆绑销售策略避免在推荐系统中推荐过于相似的商品发现潜在的市场细分机会5. MDS的常见问题与调优技巧5.1 距离度量的选择MDS的效果很大程度上取决于距离度量的选择。对于非数值型数据如文本、分类变量我们需要设计合适的距离或相似度度量。例如文本数据可以使用余弦相似度、Jaccard相似度分类变量可以使用汉明距离、Jaccard距离序数变量可以使用排名相关系数5.2 维度的确定选择降维后的维度k是一个重要问题。一个实用的方法是绘制特征值的碎石图Scree Plot寻找拐点# 接前面的MDS实现代码 eigenvalues, _ eig(B) sorted_evals np.sort(eigenvalues)[::-1] plt.figure(figsize(8, 5)) plt.plot(range(1, len(sorted_evals)1), sorted_evals, bo-) plt.xlabel(Principal Component, fontsize12) plt.ylabel(Eigenvalue, fontsize12) plt.title(Scree Plot, fontsize14) plt.grid(True) plt.show()通常选择拐点之后的维度作为k值因为这些维度解释的方差已经很小了。5.3 处理大规模数据当数据量很大时比如上万个样本传统的MDS会因为O(n³)的计算复杂度变得很慢。这时可以考虑使用Landmark MDS只对部分样本计算完整MDS然后推断其余点采用随机SVD等近似算法加速特征分解使用GPU加速的实现5.4 与其他降维方法的比较MDS与PCA都是线性降维方法但有几个关键区别PCA需要原始数据坐标MDS只需要距离矩阵PCA最大化方差MDS保持距离关系PCA的结果是唯一确定的MDS的结果可能有旋转对称性对于非线性结构的数据可以考虑t-SNE或UMAP等现代降维方法它们在保持局部结构方面表现更好。

相关文章:

多维尺度变换(MDS)实战指南:从原理到Python实现

1. 多维尺度变换(MDS)是什么? 多维尺度变换(Multidimensional Scaling,简称MDS)是一种经典的降维算法,它的核心思想是通过保持数据点之间的距离关系,将高维数据映射到低维空间。想象…...

解决CLI工具接入DeepSeek API流式传输失败的实战指南

最近在对接DeepSeek的API时,遇到了一个挺典型的问题:用CLI工具调用API进行流式传输时,经常中途失败,返回的错误信息又比较模糊,调试起来很头疼。特别是在处理长文本生成或者需要连续对话的场景下,这个问题直…...

智慧农业篇(一):一套大棚监控系统的架构与实战

2018年一个朋友找到我,想开发 一套完整的农业种植的智能控制监测系统,主要针对的是蔬菜大棚的智能控制;基本思路就是:给出一套让农民“坐在家里种地”的物联网方案。我们当时涉足智慧农业的初心就是:让数据替人跑腿&am…...

# React 发散创新:从状态管理到组件化架构的极致实践在前端开发领域,React

React 发散创新:从状态管理到组件化架构的极致实践 在前端开发领域,React 已经成为构建现代 Web 应用的事实标准。但你是否曾思考过——如何让 React 不只是“写页面”,而是真正成为驱动业务逻辑的核心引擎? 本文将带你突破常规思…...

PyLink 实战技巧:从基础连接到高级调试

1. PyLink入门:从零搭建调试环境 第一次接触PyLink时,我也被各种专业术语弄得晕头转向。后来才发现,只要掌握几个关键步骤,就能快速搭建起嵌入式调试环境。PyLink本质上是个Python库,它像翻译官一样,把我们…...

XUnity.AutoTranslator:Unity游戏自动翻译解决方案

XUnity.AutoTranslator:Unity游戏自动翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专业的Unity游戏自动翻译插件,能够实时将游戏文本转…...

大数据核心知识全解(零基础到Hadoop专家路线)【20260324】001篇

文章目录 大数据核心知识全解(零基础到Hadoop专家路线) 一、为什么会出现大数据?(本质原因) 1. 数据来源爆炸 2. 传统技术扛不住 3. 需求倒逼 二、CNCF 是什么?(云原生核心组织) 它和大数据的关系 三、为什么 Hadoop 会流行?(3个核心原因) 1. 它解决了当时最痛的问题…...

Windows 10/11 上 Docker 部署 Milvus 与 Attu 图形化界面全攻略

1. Windows 系统准备与 Docker 安装 在 Windows 10/11 上部署 Milvus 之前,需要确保系统环境满足基本要求。我实测发现,Windows 家庭版默认不支持 Hyper-V,需要先升级到专业版或企业版。检查系统版本的方法很简单:右键点击"此…...

专科ENSP毕设实战:基于eNSP的校园网高可用架构设计与配置避坑指南

最近在帮几个专科的学弟学妹看他们的eNSP毕业设计,发现大家普遍卡在几个地方:拓扑画得挺漂亮,但一配置就各种不通;协议背得滚瓜烂熟,但实际命令敲下去就报错;最后答辩演示时,一拔线整个网络就瘫…...

颈肩痛分急性和慢性,对症缓解才有效

颈肩痛并非单一症状,根据发病时间和诱因,可分为急性颈肩痛和慢性颈肩痛,两者的缓解和治疗方式差异显著,找对方法才能快速摆脱疼痛困扰。急性颈肩痛多由外伤、运动不当、落枕等引起,疼痛剧烈且突然发作,常伴…...

从原理到实践:Matlab相机标定参数详解与坐标变换全流程

1. 相机标定基础概念与Matlab工具箱实战 刚接触相机标定的朋友可能觉得那些参数看着就头疼,其实拆解开来并不复杂。我最早做机器人视觉项目时,也是被各种矩阵绕得晕头转向,直到自己动手标定了十几台工业相机才摸清门道。相机标定的本质就是建…...

一键解决中文文献管理痛点:茉莉花插件让Zotero效率提升90%的完整指南

一键解决中文文献管理痛点:茉莉花插件让Zotero效率提升90%的完整指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum …...

3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍

3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍 【免费下载链接】win-capture-audio An OBS plugin that allows capture of independant application audio streams on Windows, in a similar fashion to OBSs game capture and Discords applicat…...

Linux原生B站客户端:突破平台限制的深度体验指南

Linux原生B站客户端:突破平台限制的深度体验指南 【免费下载链接】bilibili-linux 基于哔哩哔哩官方客户端移植的Linux版本 支持漫游 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-linux 对于Linux用户来说,在开源生态中寻找优质的视频…...

多智能体概述

一、多智能体概述 多智能体系统通过协调多个专职智能体或组件来完成复杂流程。并非所有复杂任务都需要多智能体——单个智能体配合合适的工具与提示词往往就够用。我们何时采用多智能体模式更有价值,以及 AgentScope 支持哪些模式? 1、为什么要用多智能体…...

ChatTTS 量化模型实战:从模型压缩到推理效率提升

最近在部署 ChatTTS 模型时,遇到了一个很实际的问题:模型虽然效果不错,但体积大、推理慢,在资源受限的边缘设备上跑起来非常吃力。显存动不动就占好几个G,生成一段语音的等待时间也让人着急。为了解决这个问题&#xf…...

大疆上云API Demo停更了,我们手里的老项目该怎么办?(附迁移思路与安全加固建议)

大疆上云API停更后:老项目的风险评估与迁移实战指南 当官方宣布停止维护某个关键组件时,技术团队面临的不仅是代码层面的挑战,更是对系统全生命周期管理能力的考验。最近大疆上云API Demo的停更公告,让许多依赖该接口的无人机应用…...

Excel动态甘特图制作指南:利用条件格式实现进度可视化

1. 为什么需要动态甘特图 项目管理中最让人头疼的就是进度跟踪。传统的静态表格需要手动更新颜色标注,每次进度变化都得重新调整,费时费力还容易出错。我在带团队做软件版本迭代时,就经常遇到这样的困扰:明明任务进度已经更新了&a…...

实现网页动态交互:Live2D模型嵌入与换装功能详解

1. Live2D技术入门:从零开始认识动态模型 第一次接触Live2D时,我被它流畅的动画效果惊艳到了。这种技术能在二维平面上呈现出近乎三维的立体感,让静态角色"活"起来。Live2D最初确实是为游戏开发的,但现在越来越多地被用…...

别再死记硬背了!用一次完整的网页访问,帮你彻底搞懂HCIA/HCIP里的TCP/IP和OSI模型

从输入网址到页面加载:用真实场景拆解TCP/IP与OSI模型 想象一下这个场景:你在浏览器地址栏输入"www.baidu.com",按下回车键,不到一秒就看到了熟悉的搜索页面。这看似简单的操作背后,隐藏着一场精密的网络协议…...

【day63】

以前有个孩子,他分分钟都在碎碎念。不过,他的念头之间是有因果关系的。他会在本子里记录每一个念头,并用箭头画出这个念头的来源于之前的哪一个念头。翻开这个本子,你一定会被互相穿梭的箭头给搅晕,现在他希望你用程序…...

超好看的Win10音量控制工具Eartrumpet

链接:https://pan.quark.cn/s/48beeba09372Eartrumpe是一款非常好用的系统音量控制工具,可以针对不同的应用进行音量控制,让你同时播放多个音频,在打游戏的时候可以调小游戏声音播放音乐,有需要的朋友欢迎下载使用&…...

CentOS 8下openLDAP服务器搭建避坑指南:从第三方仓库到phpLDAPadmin配置

CentOS 8企业级openLDAP部署实战:从仓库选择到安全加固全解析 在当今企业IT架构中,目录服务作为身份认证和资源管理的核心组件,其重要性不言而喻。而openLDAP作为开源目录服务的标杆解决方案,凭借其轻量高效、跨平台兼容的特性&am…...

终极GitHub加速指南:3分钟让你的下载速度飙升100倍

终极GitHub加速指南:3分钟让你的下载速度飙升100倍 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub GitHub作为全球最大…...

企业IT必看:教员工用小米手机配置Exchange邮箱的完整指南(含服务器参数详解)

企业IT标准化指南:小米手机Exchange邮箱配置与服务器参数解析 在移动办公成为标配的今天,企业邮箱的稳定接入直接关系到团队协作效率。根据2023年企业通信工具调研报告,超过67%的中大型企业仍在使用Exchange作为核心邮件系统,而员…...

Magisk Root技术实践指南:从决策评估到风险管控的完整解决方案

Magisk Root技术实践指南:从决策评估到风险管控的完整解决方案 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk 一、决策评估:场景化应用与技术选型 1.1 设备Root需求分析矩阵 在…...

RK3568 Android12长按电源键无反应?三步搞定关机菜单恢复

RK3568 Android12电源键功能失效排查与深度修复指南 在RK3568平台上进行Android12系统定制时,电源键功能异常是开发者常遇到的典型问题。不同于简单的功能缺失,这背后涉及系统级行为配置、手势交互逻辑和硬件抽象层的多层级适配。本文将带您从现象溯源到…...

如何3分钟搞定本地语音转文字:TMSpeech终极高效方案

如何3分钟搞定本地语音转文字:TMSpeech终极高效方案 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录手忙脚乱?为视频字幕制作头疼不已?TMSpeech——你的本地实时语…...

MobaXterm远程免密登录疑难杂症全解析:从pk.pub到authorized_keys的避坑指南

1. 密钥文件格式的坑:从pk.pub到ppk的生死局 第一次用MobaXterm配置SSH免密登录时,我对着那个死活弹不出警告的"pk.pub"文件发了半小时呆。后来才发现Windows这个老狐狸默认隐藏了文件扩展名,我的"pk.pub"其实是个披着羊…...

告别重启:深入解析NVML驱动/库版本不匹配的根源与动态修复

1. 当NVML罢工时:理解"Driver/library version mismatch"的本质 那天深夜,我正在调试一个CUDA计算任务,突然发现nvidia-smi命令返回了令人心碎的报错:"Failed to initialize NVML: Driver/library version mismatc…...