加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • MDS数据降维
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

R语言实战——特征提取与降维之多维尺度分析

10/23 09:40
731
阅读需 11 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

多维尺度分析(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$Speciesggplot(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创建动态报告和制作幻灯片等。

撰  稿  人:计旭

责任编辑:张淑谦

审  核  人:曹新宇

相关推荐

电子产业图谱