R語言多元分析系列之五 聚類分析(完)

2022-08-05 14:29:45 字數 2556 閱讀 8205

聚類分析(cluster analysis)是根據“物以類聚”的道理,對樣品或指標進行分類的一種多元統計分析方法,它是在沒有先驗知識的情況下,對樣本按各自的特性來進行合理的分類。

聚類分析被應用於很多方面,在商業上,聚類分析被用來發現不同的客戶群,並且通過購買模式刻畫不同的客戶群的特徵;在生物上,聚類分析被用來動植物分類和對基因進行分類,獲取對種群固有結構的認識;在因特網應用上,聚類分析被用來在網上進行文件歸類來修復資訊。

聚類分析有兩種主要計算方法,分別是凝聚層次聚類(agglomerative hierarchical method)和k均值聚類(k-means)。

一、層次聚類

層次聚類又稱為系統聚類,首先要定義樣本之間的距離關係,距離較近的歸為一類,較遠的則屬於不同的類。可用於定義“距離”的統計量包括了歐氏距離(euclidean)、馬氏距離(manhattan)、 兩項距離(binary)、明氏距離(minkowski)。還包括相關係數和夾角餘弦。

層次聚類首先將每個樣本單獨作為一類,然後將不同類之間距離最近的進行合併,合併後重新計算類間距離。這個過程一直持續到將所有樣本歸為一類為止。在計算類間距離時則有六種不同的方法,分別是最短距離法、最長距離法、類平均法、重心法、中間距離法、離差平方和法。

下面我們用iris資料集來進行聚類分析,在r語言中所用到的函式為hclust。首先提取iris資料中的4個數值變數,然後計算其歐氏距離矩陣。然後將矩陣繪製熱圖,從圖中可以看到顏色越深表示樣本間距離越近,大致上可以區分出三到四個區塊,其樣本之間比較接近。

data

=iris

[,-5

]

dist.e=

dist

(data

,method=

'euclidean'

)

heatmap

(as.matrix

(dist.e)

,labrow = f, labcol = f)

然後使用hclust函式建立聚類模型,結果存在model1變數中,其中ward引數是將類間距離計算方法設定為離差平方和法。使用plot(model1)可以繪製出聚類樹圖。如果我們希望將類別設為3類,可以使用cutree函式提取每個樣本所屬的類別。

model1=hclust

(dist.e,method='ward'

)

result=cutree

(model1,k=3

)

為了顯示聚類的效果,我們可以結合多維標度和聚類的結果。先將資料用mds進行降維,然後以不同的的形狀表示原本的分類,用不同的顏色來表示聚類的結果。可以看到setose品種聚類很成功,但有一些virginica品種的花被錯誤和virginica品種聚類到一起。

mds=cmdscale

(dist.e,k=2

,eig=t)

x = mds$points[,1

]

y = mds$points[,2

]

library

(ggplot2

)

p=ggplot

(data.frame

(x,y)

,aes(x,y)

)

p+geom_point(size=3

,alpha=0.8

,

aes(colour=factor

(result)

,

shape=iris

$species)

)

二、k均值聚類k均值聚類又稱為動態聚類,它的計算方法較為簡單,也不需要輸入距離矩陣。首先要指定聚類的分類個數n,隨機取n個樣本作為初始類的中心,計算各樣本與類中心的距離並進行歸類,所有樣本劃分完成後重新計算類中心,重複這個過程直到類中心不再變化。

在r中使用kmeans函式進行k均值聚類,centers引數用來設定分類個數,nstart引數用來設定取隨機初始中心的次數,其預設值為1,但取較多的次數可以改善聚類效果。model2$cluster可以用來提取每個樣本所屬的類別。

model2=kmeans

(data

,centers=3

,nstart=10

)

使用k均值聚類時需要注意,只有在類的平均值被定義的情況下才能使用,還要求事先給出分類個數。一種方法是先用層次聚類以決定個數,再用k均值聚類加以改進。或者以 輪廓係數 來判斷分類個數。改善聚類的方法還包括對原始資料進行變換,如對資料進行降維後再實施聚類。

cluster擴充套件包中也有許多函式可用於聚類分析,如agnes函式可用於凝聚層次聚類,diana可用於劃分層次聚類,pam可用於k均值聚類,fanny用於模糊聚類。