多维尺度分析(Multidimensional Scaling,MDS)是一种用于分析数据之间相似性和差异性的技术。它将多维空间的研究对象(样本或变量)简化到低维空间进行定位、分析和归类,同时又保留对象间原始关系的数据分析方法,是一种利用低维空间去展示高维数据的一种数据降维、数据可视化方法。该方法仅仅需要样本之间的相似性或者距离,即可对数据进行降维。
多维尺度分析起源于,当仅能获取物体之间的距离时,如何利用距离去重构物体之间的欧几里得坐标。多维尺度分析的基本目标是将原始数据“拟合”到一个低维坐标系中,使得由降维所引起的任何变形最小。多维尺度分析的方法很多,按照相似性数据测量测度不同可以分为:度量的MDS和非度量的MDS。
本文主要使用最常用的Classic MDS方法对数据进行多维尺度分析,并利用MDS进行数据降维可视化、利用距离矩阵重构样本的空间坐标等,介绍如何在R语言中进行多维尺度分析。
MDS数据降维
利用数据集中的鱼的信息数据(数据集下载地址可添加小编客服索取),利用多维尺度分析对其进行降维,并对降维后的数据进行可视化,程序如下所示:
## 导入数据,同样使用前面用过的鱼的信息数据
fish <- read_csv("data/chap11/Fish.csv")
## 对数据进行标准化预处理
fish[,2:7]<- apply(fish[,2:7],2,scale)
## 计算样本之间的距离
fish_dist <- dist(fish[,2:7],method = "euclidean")
## 针对距离进行MDS数据降维
fish_cmd <- cmdscale(fish_dist,k = 2)
## 可视化样本降维后的分布情况
fish_cmd <- as.data.frame(fish_cmd)
fish_cmd$Species <- fish$Species
ggplot(fish_cmd,aes(x = V1,y = V2))+
geom_point(aes(colour = Species,shape = Species))+
scale_shape_manual(values=c(15,16,17,9,3,4,8))+
labs(x = "D1",y = "D2",title = "MDS数据降维")
上面的程序中,读取数据后,先对数据进行可标准化处理,然后使用dist()函数计算每个样本之间的欧式距离,针对得到的距离矩阵fish_dist使用cmdscale()函数进行数据变换,将其降维到二维空间中(由参数k的取值控制),针对降维后的结果使用散点图进行可视化,运行程序后可获得如图1所示的散点图。
图1.多维尺度变换可视化结果
计算样本的空间位置
以上内容是在知道数据样本的特征后,计算样本间的距离,然后通过距离矩阵计算每个样本的空间分布。实际上,多维尺度变换很多时候不需要知道每个样本的特征,只需要知道样本之间的距离矩阵(相关性矩阵),即可对样本点在空间中的分布情况进行重构。其通常用于在知道地点之间距离的情况下,计算出每个地点在空间中的分布情况。
表1给出了澳大利亚8个城市之间的距离矩阵,希望利用多维尺度变换找到每个城市在空间的位置,并和城市的真实位置进行对比。
表1.澳大利亚8个城市之间的距离(单位:km)
针对这样的问题,首先导入要使用的数据,程序如下:
library(maps)
library(leaflet)
## 读取澳大利亚8个城市之间的距离数据
citydist <- read.csv("data/chap11/dist_Aus.csv")
row.names(citydist) <- citydist[,1]
citydist <- citydist[,-1]
citydist
## Adelaide AliceSprings Brisbane Darwin Hobart Melbourne Perth
## Adelaide 0 1328 1600 2616 1161 653 2130
## AliceSprings 1328 0 1962 1289 2463 1889 1991
…
在上面的程序中,导入了需要使用的距离矩阵,为了将多维尺度变换得到的结果和城市之间的真实位置进行对比,先利用leaflet包可视化出每个城市在地图上的位置分布,可视化程序如下所示,运行程序后可获得各城市分布的地图。
## 在地图上可视化除8个城市的空间位置,和MDS的计算结果进行对比
citynames <- c("Adelaide", "Alice Springs", "Brisbane","Darwin",
"Hobart", "Melbourne", "Perth", "Sydney")
data(world.cities) # 提取所有城市的地图数据
## 获取几个城市在城市数据中的数据
citydf <- world.cities[world.cities$name %in% citynames,]
citydf <- citydf[citydf$country.etc == "Australia",]
## 在地图上可视化城市所在位置
leaflet(data = citydf,width = 700, height = 500) %>%addTiles() %>%
setView(lng = mean(citydf$long),lat = mean(citydf$lat),zoom = 4)%>%
addCircleMarkers(lat = ~lat, lng = ~long, label = ~name,radius = 5,
color = "red", fillOpacity = 0.6,stroke = FALSE,
labelOptions = labelOptions(noHide = TRUE))
下面利用城市之间的距离矩阵,计算每个城市在二维空间中的位置,同样使用cmdscale()函数计算,同时将计算的结果进行可视化,需要注意的是,在可视化时,X轴和Y轴的坐标均适用计算值是负值(这是因为多维尺度变换的结果可能与实际的位置坐标相反)。运行下面的程序后可获得图3。
##根据距离计算城市在空间中的相对位置
citycmd <- cmdscale(citydist, eig = FALSE, k = 2)
## 获取每个城市在空间中的坐标
citypos <- as.data.frame(citycmd)
colnames(citypos) <- c("X","Y")
citypos$name <- citynames
## 在二维空间中可视化除城市的分布
ggplot(citypos,aes(x = -X,y = -Y))+geom_point(colour = "red")+
geom_text(aes(x = -X+100,y = -Y+100,label = name))+
ggtitle("城市之间的空间位置")+coord_equal()
图2.利用多维尺度变换计算得到的空间分布
由图2可以发现,利用多维尺度变换计算得到的结果,与每个城市的真实空间分布很相似。
以上内容节选自《R语言实战——数据整理、可视化、建模与挖掘》作者:薛震 孙玉林
相关图书
本书是一本数据科学的入门与提升教程,全书共5篇,按照由浅入深、循序渐进的方式介绍R语言的基本语法与实际应用,并结合现实数据进行实战操作。内容涵盖R语言的安装与运行、数据对象的创建与编程、R语言初级与高级绘图、数据的管理与清洗、统计分析与数据降维、无监督与有监督学习、利用R Markdown创建动态报告和制作幻灯片等。
撰 稿 人:计旭
责任编辑:张淑谦
审 核 人:曹新宇