这篇是继PCA和KPCA、t-SNE三种降维方法后的第4篇。
在大数据时代,我们不断面临高维度数据的挑战。为了更好地理解这些数据,MDS算法应运而生。本文将详细介绍MDS算法的原理、步骤及其应用场景,帮助你深入了解这个强大的降维工具。
多维尺度变换(Multidimensional Scaling,简称MDS)算法是一种数据降维和可视化方法,最早起源于心理学领域,它能够将高维度数据转换到低维度空间(如二维或三维),在保持数据点间距离关系的同时,让我们能够直观地观察和分析数据。在20世纪50年代至60年代,研究人员开始尝试使用MDS来解决心理学实验中的数据分析问题,主要用于分析个体之间的相似性和差异性。随着研究的深入和方法的完善,MDS逐渐被广泛应用于社会科学、生物学、信息科学等多个领域。
MDS算法的核心思想是使用距离矩阵来表示数据点之间的相似性或关联性。在实际问题中,我们可能需要分析不同类型的数据,通过将这些数据转换为距离矩阵,我们可以利用MDS算法来挖掘数据中的结构信息和潜在关系。
MDS算法通过将高维数据降维到二维或三维空间,使得数据的可视化分析变得更加直观。此外,在降维过程中,MDS尽量保持数据点之间的距离关系,从而有助于挖掘数据中的真实结构。
降维打击·来自https://www.zcool.com.cn/work/ZMzc1MjcwNjQ=.html
在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的缺点 |
---|---|
计算相对比较容易而且不需要提供先验知识。 | 当数据量较大时,运算时间可能较长。 |
在降维过程中尽量保持数据点之间的距离关系,有助于挖掘数据中的结构信息,适用于各种类型的数据,如距离、相似性、关联性等。 | 各个维度的地位相同,无法区分不同维度的重要性。 |
举一个PCA中介绍过的例子。
这里介绍一下鸢尾花数据集,鸢尾花在机器学习里是常客之一。数据集由具有150个实例组成,其特征数据包括四个:萼片长、萼片宽、花瓣长、花瓣宽。数据集中一共包括三种鸢尾花,分别叫做Setosa、Versicolor、Virginica,就像下图:
也就是说这组数据的维度是150*4,数据是有标签的。(有标签是指每个实例我们都知道它对应的类别)
此时我们进行MDS降维,将四维数据降为二维,并使用不同颜色标注各个类别的鸢尾花,可以得到如下分布情况:
欧几里得距离
上图中构建距离矩阵时,使用的欧几里得距离,我们还可以尝试一下其他距离度量方法,比如马氏距离'mahalanobis':
马氏距离
City block 距离:
City block 距离
chebychev距离:
chebychev距离
correlation距离:
correlation距离
此外还有很多其他距离度量方法,这里就不一一列举了。
尽管MDS算法的初衷是降维而非聚类,不过由于MDS降维后的数据常常会用做机器学习的输入数据,在数据降维的同时查看降维后数据的分布情况,对于模式识别/分类任务的中间状态确定还是十分有益的,再直白些说,这些图片放在论文里丰富一下内容也是极好的。
在这种应用场景下,数据降维的最主要目的其实还是解决数据特征过于庞大的问题,这个例子中特征只有4个,所以还不太明显。很多时候我们面对的是几十上百乃至更多的特征维度,这些特征中包含着大量冗余信息,使得计算任务变得非常繁重,调参的难度和会大大增加。此时加入一步数据降维就是十分有必要的了。
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)