【数据降维-第4篇】多维尺度变换(MDS)快速理解,及MATLAB实现

2023-10-08 20:59

本文主要是介绍【数据降维-第4篇】多维尺度变换(MDS)快速理解,及MATLAB实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这篇是继PCA和KPCA、t-SNE三种降维方法后的第4篇。

在大数据时代,我们不断面临高维度数据的挑战。为了更好地理解这些数据,MDS算法应运而生。本文将详细介绍MDS算法的原理、步骤及其应用场景,帮助你深入了解这个强大的降维工具。

一、关于MDS算法

多维尺度变换(Multidimensional Scaling,简称MDS)算法是一种数据降维和可视化方法,最早起源于心理学领域,它能够将高维度数据转换到低维度空间(如二维或三维),在保持数据点间距离关系的同时,让我们能够直观地观察和分析数据。在20世纪50年代至60年代,研究人员开始尝试使用MDS来解决心理学实验中的数据分析问题,主要用于分析个体之间的相似性和差异性。随着研究的深入和方法的完善,MDS逐渐被广泛应用于社会科学、生物学、信息科学等多个领域。

MDS算法的核心思想是使用距离矩阵来表示数据点之间的相似性或关联性。在实际问题中,我们可能需要分析不同类型的数据,通过将这些数据转换为距离矩阵,我们可以利用MDS算法来挖掘数据中的结构信息和潜在关系。

MDS算法通过将高维数据降维到二维或三维空间,使得数据的可视化分析变得更加直观。此外,在降维过程中,MDS尽量保持数据点之间的距离关系,从而有助于挖掘数据中的真实结构。

降维打击·来自https://www.zcool.com.cn/work/ZMzc1MjcwNjQ=.html

二、MDS的原理是什么?

在MDS算法中,降维映射的原理是通过保持原始空间中数据点之间的相对距离来将数据从高维空间映射到低维空间。为了便于理解,我们将降维映射过程分为以下几个步骤:

  1. 构建距离矩阵:首先,我们需要计算原始空间中数据点之间的距离。常用的距离度量方法包括欧几里得距离、Minkowski距离等。通过计算每对数据点之间的距离,我们可以构建一个距离矩阵。
  2. 中心化距离矩阵:为了进一步处理距离矩阵,我们需要对其进行中心化处理,使得数据点相对于原点对称。中心化矩阵的计算方法是:I - (1/n) *i*i^T,其中I是单位矩阵,n是数据点的数量,i是一个全1的n维向量,i^T代表对该向量转置。
  3. 计算内积矩阵:通过中心化距离矩阵,我们可以计算内积矩阵B。内积矩阵表示数据点之间的内积关系,可以用于进一步分析数据的结构。内积矩阵B可以通过中心化矩阵H和距离矩阵D的平方形式计算得到:B = -1/2 * H * D^2 * H
  4. 计算特征值和特征向量:在得到内积矩阵B后,我们需要计算其特征值和特征向量。特征值表示数据的主要变化方向,特征向量表示对应方向上的大小。我们将选取最大的k个特征值及其对应的特征向量,作为降维后的k维空间的基。
  5. 计算降维后的坐标:将原始数据投影到选定的k维基上,我们可以得到降维后的坐标。具体计算方法为:新坐标 = 特征向量矩阵 * 特征值矩阵的平方根。这样,我们就得到了降维后的数据表示。

虽然步骤看起来有点复杂,但是实际实现还是很简单的,下面距离说明一下,大家就很容易明白了。

三、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.0   4.69  3.74  2.45  3.32
B   4.69  0.0   6.56  3.32  6.56
C   3.74  6.56  0.0   5.29  2.45
D   2.45  3.32  5.29  0.0   5.29
E   3.32  6.56  2.45  5.29  0.0

步骤3:中心化距离矩阵

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

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 |1 = | 1 || 1 || 1 || 1 || 1 |1 * 1^T = | 1 1 1 1 1 || 1 1 1 1 1 || 1 1 1 1 1 || 1 1 1 1 1 || 1 1 1 1 1 |H = I - (1/5) * 1 * 1^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.02 |
| 21.98 0.00 43.03 11.02 43.03 |
| 13.99 43.03 0.00 28.00 6.00 |
| 6.00 11.02 28.00 0.00 28.00 |
| 11.02 43.03 6.00 28.00 0.00 |

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

B = -1/2 * 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.42 |
| 1.12 	5.21 	-6.07 	6.12 	-6.37 |
| 0.11 	-9.29 	6.42 	-6.37 	9.13 |

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

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

特征值:λ1 ≈ 32.32,λ2 ≈ 6.39
特征向量(对应λ1):v1 ≈ (-0.02 0.63 -0.48 0.36 -0.49)
特征向量(对应λ2):v2 ≈ (-0.53 0.59 0.33 -0.50 0.10)

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

步骤6:计算降维后的坐标

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

V = 
|-0.02 	-0.53 |
|0.63 	0.59 |
|-0.48 	0.33 |
|0.36 	-0.50 |
|-0.49 	0.10 |Λ^(1/2) = | √32.32   0    ||   0     √6.39 |

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

新坐标 ≈
|-0.11 	-1.33 |
|3.60 	1.50 |
|-2.76 	0.84 |
|2.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)

至此,我们已经将原始高维空间中的水果口味距离通过MDS算法映射到了二维空间。在这个二维空间中,我们可以观察到水果之间的相对距离关系,从而更容易地分析和理解它们之间的口味差异。

四、MDS算法的优缺点

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

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

五、案例:降维、聚类与分类

举一个PCA中介绍过的例子。

这里介绍一下鸢尾花数据集,鸢尾花在机器学习里是常客之一。数据集由具有150个实例组成,其特征数据包括四个:萼片长、萼片宽、花瓣长、花瓣宽。数据集中一共包括三种鸢尾花,分别叫做Setosa、Versicolor、Virginica,就像下图:

也就是说这组数据的维度是150*4,数据是有标签的。(有标签是指每个实例我们都知道它对应的类别)

此时我们进行MDS降维,将四维数据降为二维,并使用不同颜色标注各个类别的鸢尾花,可以得到如下分布情况:

欧几里得距离

上图中构建距离矩阵时,使用的欧几里得距离,我们还可以尝试一下其他距离度量方法,比如马氏距离'mahalanobis':

马氏距离

City block 距离:

City block 距离

chebychev距离:

chebychev距离

correlation距离:

correlation距离

此外还有很多其他距离度量方法,这里就不一一列举了。

尽管MDS算法的初衷是降维而非聚类,不过由于MDS降维后的数据常常会用做机器学习的输入数据,在数据降维的同时查看降维后数据的分布情况,对于模式识别/分类任务的中间状态确定还是十分有益的,再直白些说,这些图片放在论文里丰富一下内容也是极好的。
在这种应用场景下,数据降维的最主要目的其实还是解决数据特征过于庞大的问题,这个例子中特征只有4个,所以还不太明显。很多时候我们面对的是几十上百乃至更多的特征维度,这些特征中包含着大量冗余信息,使得计算任务变得非常繁重,调参的难度和会大大增加。此时加入一步数据降维就是十分有必要的了。

六、MATLAB的MDS降维快速实现

MDS算法在MATLAB中有官方函数,名字叫做mdscale,熟悉编程的同学可以直接调用。

但是在运用mdscale函数实现降维时,还是有很多坑的,笔者替大家踩过了。并把MDS降维以及可视化的功能进行了封装。它可以实现:

1.指定输出的维度。也就是降维之后的维度,当然这个数不能大于输入数据的特征维度。

options.NumDimensions = 3;  %降维后的数据维度

2.绘制特征分布图。在降维维度为2或者3时,可以绘制特征分布图,当然你也可以选择设置不画图,图个清静。

figflag = 'on';  %是否画图,'on'为画图,'off'为不画,只有NumDimensions为2或者3时起作用,3以上无法画图

3.指定距离度量方法

options.Distance = 'euclidean'; %距离量度方法选择,可选:'euclidean' (default) | %'seuclidean' | 'cityblock' | 'chebychev' | 'minkowski' |%'mahalanobis' | 'cosine' | 'correlation' | 'spearman' | %'hamming' | 'jaccard'
% 具体描述见:https://ww2.mathworks.cn/help/stats/pdist.html?s_tid=doc_ta#mw_39296772-30a1-45f3-a296-653c38875df7

设置好这些配置参数后,只需要调用下边这行代码:

mdsVal = kMDS(Fea,options,species,figflag); %mdsVal为降维后的数据矩阵

就可以绘制出这样一张图:

如果要绘制三维图,把options.NumDimensions设置成3就好了。绘制出来是这样:

不过上述是知道标签值species的情况,如果不知道标签值,设置species=[]就行了,此时画出来的分布图是单一颜色的。

上述代码秉承了本专栏一向的易用属性,功能全部集中在kMDS函数里了,这个函数更详细的介绍如下:

mdsVal = kMDS(Fea,options,species,figflag); %mdsVal为降维后的数据矩阵
%% 执行数据的MDS降维
% 可以实现2维、3维以及更高维度的降维,只有二维和三维可以画图
% 输入:
% Fea:待降维数据,R*Q的矩阵,R为批次数,Q为特征维度,例如特征维度为8的共100组数,tempFea的维度应为100*8。输入该变量时一定要注意行列方向是否正确,如不正确需要转置
% options:一些与MDS降维有关的设置,使用结构体方式赋值,比如 options.Distance = 'euclidean' ,具体包括:
%              -Distance:距离量度方法选择,可选:'euclidean' (default) | 'seuclidean' | 'cityblock' | 'chebychev' | 'minkowski' | 'mahalanobis' | 'cosine' | 'correlation' | 'spearman' | 'hamming' | 'jaccard'
%                         具体描述见:https://ww2.mathworks.cn/help/stats/pdist.html?s_tid=doc_ta#mw_39296772-30a1-45f3-a296-653c38875df7
%              -NumDimensions:降维后的数据维度,默认为2
% species:分组变量,可以是数组、数值向量、字符数组、字符串数组等,但是需要注意此变量维度需要与Fea的组数一致。该变量可以不赋值,调用时对应位置写为[]即可
%          例如species可以是[1,1,1,2,2,2,3,3,3]这样的数组,代表了Fea前3行数据为第1组,4-6行数据为第2组,7-9行数据为第三组。
%          关于此species变量更多信息,可以查看下述链接中的"Grouping variable":
%          https://ww2.mathworks.cn/help/stats/gscatter.html?s_tid=doc_ta#d124e492252
% 
% figflag:是否画图,'on'为画图,'off'为不画,只有NumDimensions为2或者3时起作用,3以上无法画图

需要上边这个函数文件以及测试代码的同学,可以在下边获取:

MDS降维算法 | 工具箱文档 (khsci.com)

这篇关于【数据降维-第4篇】多维尺度变换(MDS)快速理解,及MATLAB实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象