多尺度变换(Multidimensional Scaling ,MDS)详解

2024-04-02 12:44

本文主要是介绍多尺度变换(Multidimensional Scaling ,MDS)详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本思想

        MDS(Multidimensional Scaling ,MDS多维尺度变换)是一种经典的降维算法,其基本思想是通过保持数据点之间的距离关系,将高维数据映射到低维空间中。

具体来说,MDS算法的基本步骤如下:

1、构建距离矩阵:首先,我们需要计算原始空间中数据点之间的距离。常用的距离度量方法包括欧几里得距离、Minkowski距离等。通过计算每对数据点之间的距离,我们可以构建一个距离矩阵。
2、中心化距离矩阵:为了进一步处理距离矩阵,我们需要对其进行中心化处理,使得数据点相对于原点对称。
3、计算内积矩阵:通过中心化距离矩阵,我们可以计算内积矩阵B。内积矩阵表示数据点之间的内积关系,可以用于进一步分析数据的结构。
4、计算特征值和特征向量:在得到内积矩阵B后,我们需要计算其特征值和特征向量。特征值表示数据的主要变化方向,特征向量表示对应方向上的大小。我们将选取最大的k个特征值及其对应的特征向量,作为降维后的k维空间的基。
5、计算降维后的坐标:将原始数据投影到选定的k维基上,我们可以得到降维后的坐标。

      通过上述介绍,可以知道,MDS可以将原始数据维度下降到任意维度。

二、MDS算法示例

       让我们用一个关于水果口味的例子来说明MDS算法的原理。

      假设有5种水果:苹果(A)、香蕉(B)、橙子(C)、葡萄(D)和菠萝(E)。我们对这些水果进行了甜度(Sweetness)、酸度(Sourness)和多汁程度(Juiciness)的评分。评分数据如下:

A:(6,4,5)
B:(8,1,3)
C:(5,7,6)
D:(7,3,4)
E:(4,6,8)

我们希望通过MDS算法将这些三维评分数据降维到二维空间,以便更直观地分析水果之间的口味关系。

步骤1:计算距离

我们可以使用欧氏距离(也可以用其他距离计算方法)来计算水果之间的距离。计算结果如下:

A-B: 4.69
A-C: 3.74
A-D: 2.45
A-E: 3.32
B-C: 6.56
B-D: 3.32
B-E: 6.56
C-D: 5.29
C-E: 2.45
D-E: 5.29

步骤2:构建距离矩阵

将计算出的距离整合成一个距离矩阵D

    A      B     C     D      E
A   0.00  4.69  3.74  2.45  3.32B   4.69  0.00  6.56  3.32  6.56C   3.74  6.56  0.00  5.29  2.45D   2.45  3.32  5.29  0.00  5.29E   3.32  6.56  2.45  5.29  0.00

步骤3:中心化距离矩阵

我们需要计算中心化矩阵H。数据点的数量n为5。因此,我们可以得到:

I=[1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1]
L=[11111]
H=I-(1/5)*L*L^T
=[0.8  -0.2  -0.2  -0.2  -0.2-0.2 0.8   -0.2  -0.2  -0.2-0.2 -0.2  0.8   -0.2  -0.2-0.2 -0.2  -0.2  0.8  -0.2-0.2 -0.2  -0.2  -0.2  0.8]

步骤4:计算内积矩阵

接下来,我们需要计算内积矩阵B。首先,我们需要计算距离矩阵D的平方:

D.^2=[0.00  21.98  13.99  6.00  11.0221.98 0.00   43.03  11.02 43.0313.99 43.03  0.00   28.00 6.006.00  11.02  28.00  0.00  28.0011.02 43.03  6.00   28.00 0.00]

然后,我们用中心化矩阵H和距离矩阵D的平方计算内积矩阵B:

B=-0.5*H*D.^2*H=[2.12  -2.27  -1.07  1.12  0.11-2.27 15.33  -8.99  5.21  -9.29-1.07 -8.99  9.72  -6.07  6.421.12  5.21   -6.07  6.12  -6.370.11  -9.29  6.42   -6.37  9.13]

步骤5:计算特征值和特征向量

我们需要计算内积矩阵B的特征值和特征向量。我们得到了如下特征值和特征向量:

特征值:lamda1=32.32  lamda2=6.39
特征值lamda1对应的特征向量V1=[-0.02 0.63 -0.48 0.36 -0.49]
特征值lamda2对应的特征向量V2=[-0.53 0.59 0.33 -0.50 0.10]

我们选取最大的两个特征值λ1和λ2,以及对应的特征向量v1和v2,作为降维后的二维空间的基。

步骤6:计算降维后坐标

我们将原始数据投影到选定的二维基上,计算新坐标。首先,构建特征向量矩阵V和特征值矩阵Λ的平方根:

V=[-0.02  -0.530.63   0.59-0.48  0.330.36   -0.50-0.49  0.10]
对角矩阵A^0.5=[sqrt(32.32)      00        sqrt(6.39)]

然后,我们计算降维后的坐标:新坐标 = A * A^(1/2)

新坐标=[-0.11   -1.333.60    1.50-2.76   0.842.02   -1.26-2.76   0.25]

最后,我们得到了降维后的二维坐标:

苹果(A):(-0.11, -1.33 )
香蕉(B):(3.60, 1.50)
橙子(C):(-2.76, 0.84 )
葡萄(D):(2.02, -1.26 )
菠萝(E):(0.36, 2.89)

三、基于MATLAB的MDS示例代码

MATLAB中自带降维函数cmdscale,实现代码如下:

clc;
clear;
data=[0.0,4.69,3.74,2.45,3.32;4.69,0.0,6.56,3.32,6.56;3.74,6.56,0.0,5.29,2.45;2.45,3.32,5.29,0.0,5.29;3.32,6.56,2.45,5.29,0.0];
Y=cmdscale(data);

如果将数据降维为2维,则取前2列,结果如下:

如果按照上述原理,编写程序,代码如下:

D=[0.0,4.69,3.74,2.45,3.32;4.69,0.0,6.56,3.32,6.56;3.74,6.56,0.0,5.29,2.45;2.45,3.32,5.29,0.0,5.29;3.32,6.56,2.45,5.29,0.0];I=[1,0,0,0,0;0,1,0,0,0;0,0,1,0,0;0,0,0,1,0;0,0,0,0,1];
L=[1;1;1;1;1];
L*L';
H=I-(0.2)*L*L';
D2=D.^2;
B=-0.5*H*D.^2*H;
[v,d]=eig(B);
lamda1=d(1,1);
lamda2=d(2,2);
duijiaojuzhen=[sqrt(lamda1),0;0,sqrt(lamda2)];
V=[v(:,1),v(:,2)];
zuobiao=V*duijiaojuzhen

四、总结

下面是一个关于MDS算法优缺点的表格:

MDS的优点MDS的缺点
计算相对比较容易而且不需要提供先验知识。当数据量较大时,运算时间可能较长。
在降维过程中尽量保持数据点之间的距离关系,有助于挖掘数据中的结构信息,适用于各种类型的数据,如距离、相似性、关联性等。各个维度的地位相同,无法区分不同维度的重要性。

参考博客:【数据降维-第4篇】多维尺度变换(MDS)快速理解,及MATLAB实现 - 知乎

这篇关于多尺度变换(Multidimensional Scaling ,MDS)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870013

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab