層次聚類中,起初每個實例或觀測值屬於一類,聚類就是每一次把兩類聚成新的一類,直到全部的類聚成單個類爲止,算法以下算法
a、定義每一個觀測值(行或單元)爲一類函數
b、計算每類和其餘各種的距離flex
c、把距離最短的兩類合併成一類,這樣類的個數就減小一個spa
d、重複步驟(b)和(c)。直到包含全部觀測值的類合併成單個的類爲止code
在層次聚類中,主要的區別是它們對類的定義不一樣(步驟(b)),五種常見的聚類方法的定義和其中兩類之間的距離定義it
聚類方法 | 兩類之間的距離定義 |
單聯動 | 一個類中的點和另外一個類中的點的最小距離 |
全聯動 | 一個類中的點和另外一個類中的點的最大距離 |
平均聯動 | 一個類中的點與另外一個類中的點的平均距離(也稱做UPGMA,非加權對組平均) |
質心 | 兩類中質心(變量均值向量)之間的距離。對單個的觀測值來講,質心就是變量的值 |
Ward法 | 兩個類之間全部變量的方差分析的平方和 |
單聯動聚類方法:傾向於發現細長的、雪茄型的類,它也一般展現一種鏈式的現象,即不類似的觀測值分到一類中,由於它們和它們的中間值很相像table
全聯動聚類方法:傾向與發現大體相等的直徑緊湊類,對異常值很敏感變量
平均聯動:提供了以上兩種方法的折中,相對來講,它不像鏈式,並且對異常值沒有那麼敏感,傾向與把方差小的類聚合方法
Ward法:傾向與把少許觀測值的類聚合到一塊兒,而且傾向與產生與觀測值個數大體相等的類,它對異常值也是敏感的im
質心法:一種很受歡迎的方法,由於其中類距離的定義比較簡單,易於理解,相比其餘方法,它對異常值不是很敏感,可是它可能不如平均聯動法或Ward方法表現的很好
層次聚類的方法可用 hclust()函數來實現,格式是
hclust(d ,method=)
d:是經過 dist()函數產生的矩陣
method:方法有「single」單聯動,「complete」全聯動,「average」平均聯動,「centroid」質心,「ward 」Ward法
例
查看flexclust包中的養分數據集
> data(nutrient,package = "flexclust") #導入數據 > row.names(nutrient) <- tolower(row.names(nutrient)) #將變量的名字由大寫改成小寫 > nutrient.scaled <- scale(nutrient) #將數據標準化爲均值爲0,方差爲1 > d <- dist(nutrient.scaled) #利用dist()函數計算矩陣或數據框中全部行(觀測值)之間的距離 > fit.average <- hclust(d,method = "average") #層次聚類中的平均聯動 > plot(fit.average,hang=-1, cex=0.8 ,main = "Average Linkage Clustering") #hang = -1 設置標籤的位置:將觀測值的標籤移動到水平軸下面(讓它們掛在0下面)
a、高度刻度表明了該高度類之間合併的斷定值,對於平均聯動來講,標準是一類中的點和其餘類中的點的距離平均值
b、圖提供了27種了食物之間的類似性/異質性的層次分析視圖,如tuna canned 和chicken canned類似,可是都和 clams canned有很大的不一樣
若是最終目標是這些食品分配到類(但願有意義的)較少,那麼須要額外的分析選擇聚類的適當個數