多維尺度分析(Multidimensional Scaling,MDS)是一種用于分析數(shù)據(jù)之間相似性和差異性的技術。它將多維空間的研究對象(樣本或變量)簡化到低維空間進行定位、分析和歸類,同時又保留對象間原始關系的數(shù)據(jù)分析方法,是一種利用低維空間去展示高維數(shù)據(jù)的一種數(shù)據(jù)降維、數(shù)據(jù)可視化方法。該方法僅僅需要樣本之間的相似性或者距離,即可對數(shù)據(jù)進行降維。
多維尺度分析起源于,當僅能獲取物體之間的距離時,如何利用距離去重構物體之間的歐幾里得坐標。多維尺度分析的基本目標是將原始數(shù)據(jù)“擬合”到一個低維坐標系中,使得由降維所引起的任何變形最小。多維尺度分析的方法很多,按照相似性數(shù)據(jù)測量測度不同可以分為:度量的MDS和非度量的MDS。
本文主要使用最常用的Classic MDS方法對數(shù)據(jù)進行多維尺度分析,并利用MDS進行數(shù)據(jù)降維可視化、利用距離矩陣重構樣本的空間坐標等,介紹如何在R語言中進行多維尺度分析。
MDS數(shù)據(jù)降維
利用數(shù)據(jù)集中的魚的信息數(shù)據(jù)(數(shù)據(jù)集下載地址可添加小編客服索?。?,利用多維尺度分析對其進行降維,并對降維后的數(shù)據(jù)進行可視化,程序如下所示:
## 導入數(shù)據(jù),同樣使用前面用過的魚的信息數(shù)據(jù)
fish <- read_csv("data/chap11/Fish.csv")
## 對數(shù)據(jù)進行標準化預處理
fish[,2:7]<- apply(fish[,2:7],2,scale)
## 計算樣本之間的距離
fish_dist <- dist(fish[,2:7],method = "euclidean")
## 針對距離進行MDS數(shù)據(jù)降維
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數(shù)據(jù)降維")
上面的程序中,讀取數(shù)據(jù)后,先對數(shù)據(jù)進行可標準化處理,然后使用dist()函數(shù)計算每個樣本之間的歐式距離,針對得到的距離矩陣fish_dist使用cmdscale()函數(shù)進行數(shù)據(jù)變換,將其降維到二維空間中(由參數(shù)k的取值控制),針對降維后的結(jié)果使用散點圖進行可視化,運行程序后可獲得如圖1所示的散點圖。
圖1.多維尺度變換可視化結(jié)果
計算樣本的空間位置
以上內(nèi)容是在知道數(shù)據(jù)樣本的特征后,計算樣本間的距離,然后通過距離矩陣計算每個樣本的空間分布。實際上,多維尺度變換很多時候不需要知道每個樣本的特征,只需要知道樣本之間的距離矩陣(相關性矩陣),即可對樣本點在空間中的分布情況進行重構。其通常用于在知道地點之間距離的情況下,計算出每個地點在空間中的分布情況。
表1給出了澳大利亞8個城市之間的距離矩陣,希望利用多維尺度變換找到每個城市在空間的位置,并和城市的真實位置進行對比。
表1.澳大利亞8個城市之間的距離(單位:km)
針對這樣的問題,首先導入要使用的數(shù)據(jù),程序如下:
library(maps)
library(leaflet)
## 讀取澳大利亞8個城市之間的距離數(shù)據(jù)
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
…
在上面的程序中,導入了需要使用的距離矩陣,為了將多維尺度變換得到的結(jié)果和城市之間的真實位置進行對比,先利用leaflet包可視化出每個城市在地圖上的位置分布,可視化程序如下所示,運行程序后可獲得各城市分布的地圖。
## 在地圖上可視化除8個城市的空間位置,和MDS的計算結(jié)果進行對比
citynames <- c("Adelaide", "Alice Springs", "Brisbane","Darwin",
"Hobart", "Melbourne", "Perth", "Sydney")
data(world.cities) # 提取所有城市的地圖數(shù)據(jù)
## 獲取幾個城市在城市數(shù)據(jù)中的數(shù)據(jù)
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()函數(shù)計算,同時將計算的結(jié)果進行可視化,需要注意的是,在可視化時,X軸和Y軸的坐標均適用計算值是負值(這是因為多維尺度變換的結(jié)果可能與實際的位置坐標相反)。運行下面的程序后可獲得圖3。
##根據(jù)距離計算城市在空間中的相對位置
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可以發(fā)現(xiàn),利用多維尺度變換計算得到的結(jié)果,與每個城市的真實空間分布很相似。
以上內(nèi)容節(jié)選自《R語言實戰(zhàn)——數(shù)據(jù)整理、可視化、建模與挖掘》作者:薛震 孫玉林
相關圖書
本書是一本數(shù)據(jù)科學的入門與提升教程,全書共5篇,按照由淺入深、循序漸進的方式介紹R語言的基本語法與實際應用,并結(jié)合現(xiàn)實數(shù)據(jù)進行實戰(zhàn)操作。內(nèi)容涵蓋R語言的安裝與運行、數(shù)據(jù)對象的創(chuàng)建與編程、R語言初級與高級繪圖、數(shù)據(jù)的管理與清洗、統(tǒng)計分析與數(shù)據(jù)降維、無監(jiān)督與有監(jiān)督學習、利用R Markdown創(chuàng)建動態(tài)報告和制作幻燈片等。
撰? 稿? 人:計旭
責任編輯:張淑謙
審? 核? 人:曹新宇