聚類分析(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為了顯示聚類的效果,我們可以結合多維標度和聚類的結果。先將資料用mds進行降維,然後以不同的的形狀表示原本的分類,用不同的顏色來表示聚類的結果。可以看到setose品種聚類很成功,但有一些virginica品種的花被錯誤和virginica品種聚類到一起。(model1,k=3
)
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使用k均值聚類時需要注意,只有在類的平均值被定義的情況下才能使用,還要求事先給出分類個數。一種方法是先用層次聚類以決定個數,再用k均值聚類加以改進。或者以 輪廓係數 來判斷分類個數。改善聚類的方法還包括對原始資料進行變換,如對資料進行降維後再實施聚類。(data
,centers=3
,nstart=10
)
cluster擴充套件包中也有許多函式可用於聚類分析,如agnes函式可用於凝聚層次聚類,diana可用於劃分層次聚類,pam可用於k均值聚類,fanny用於模糊聚類。