1. 程式人生 > >基於R語言的聚類分析(k-means,層次聚類)

基於R語言的聚類分析(k-means,層次聚類)

今天給大家展示基於R語言的聚類,在此之前呢,首先談談聚類分析,以及常見的聚類模型,說起聚類我們都知道,就是按照一定的相似性度量方式,把接近的一些個體聚在一起。這裡主要是相似性度量,不同的資料型別,我們需要用不同的度量方式。除此之外,聚類的思想也很重要,要是按照聚類思想來說,主要有這麼幾大類,第一大類是基於分割的聚類,比如k-means,以及按照這個思路進行了簡單擴充套件的幾個聚類,如k-median等。第二大類呢,就是層次聚類,它其實是把個體之間的關係進行了一個層次展示,具體聚為幾類,由人為進行設定。第三大類呢,就是基於密度的聚類,這裡不要講基於密度的聚類和基於概率密度分佈的聚類相混淆,這其實是一樣的,比如混合模型,就是基於概率分佈的聚類,而DBSCAN就是基於密度的聚類,實際上,這裡密度是指一指區域性密度,而不是概率密度分佈。那麼第四大類呢,就是基於概率密度分佈的聚類,這一類聚類方法主要是假設資料來自某個概率分佈,或者是某幾個概率分佈的組合,進而進行引數估計,確定分佈的樣子,再反過來看看,樣本點屬於哪一類。那麼第五大類呢,是矩陣的分解(Nonnegative Matrix Factorizations ),這一大類其實和之前的幾類明顯不同,比如SVD分解,或者其他的分解其實在文字挖掘或者推薦演算法裡邊都屬於聚類。最後一大類就是譜聚類了。下面我們用R語言進行一下計算。

#要是沒有這個包的話,首先需要安裝一下
#install.packages("factoextra")
#載入包
library(factoextra)
# 載入資料
data("USArrests") 
# 資料進行標準化
df <- scale(USArrests) 
# 檢視資料的前五行
head(df, n = 5)
               Murder   Assault   UrbanPop         Rape
Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska     0.50786248 1.1068225
-1.2117642 2.484202941 Arizona 0.07163341 1.4788032 0.9989801 1.042878388 Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 California 0.27826823 1.2628144 1.7589234 2.067820292 #確定最佳聚類數目 fviz_nbclust(df, kmeans, method = "wss") + geom_vline(xintercept = 4, linetype = 2)

最佳聚類數目

#可以發現聚為四類最合適,當然這個沒有絕對的,從指標上看,選擇坡度變化不明顯的點最為最佳聚類數目。
#設定隨機數種子,保證實驗的可重複進行 set.seed(123) #利用k-mean是進行聚類 km_result <- kmeans(df, 4, nstart = 24) #檢視聚類的一些結果 print(km_result) #提取類標籤並且與原始資料進行合併 dd <- cbind(USArrests, cluster = km.res$cluster) head(dd) Murder Assault UrbanPop Rape cluster Alabama 13.2 236 58 21.2 4 Alaska 10.0 263 48 44.5 3 Arizona 8.1 294 80 31.0 3 Arkansas 8.8 190 50 19.5 4 California 9.0 276 91 40.6 3 Colorado 7.9 204 78 38.7 3 #檢視每一類的數目 table(dd$cluster) 1 2 3 4 13 16 13 8 #進行視覺化展示 fviz_cluster(km_result, data = df, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal() )

結果如下:
聚類效果圖
一般來說,能夠對資料聚類後進行視覺化展示的也就是二維,三維資料,如果維度很高的話,一種方法是t-SNE方法,這種方法是按照流型的方法進行視覺化,用的比較多。另一種的話,就是利用降維方法,比如主成分分析等,進行降維後視覺化展示。

下面我們進行層次聚類

#先求樣本之間兩兩相似性
result <- dist(df, method = "euclidean")
#產生層次結構
result_hc <- hclust(d = result, method = "ward.D2")
#進行初步展示
fviz_dend(result_hc, cex = 0.6)

結果如下:
層次結構圖

根據這個圖,我們可以方便的確定聚為幾類比較合適,比如我們聚為四類,並且進行視覺化展示

fviz_dend(result_hc, k = 4, 
          cex = 0.5, 
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, 
          rect = TRUE          
)

效果如下:
層次聚類效果圖

好,今天就到這,明天繼續展示其它幾類聚類方法,以及圖的製作。