聚类分析1:层次聚类
聚類分析是一種數據歸約技術,旨在揭露一個數據集中觀測值的子集。它可以把大量的觀測值歸約為若干個類,而事先并不知道類別的個數與結構。 最常用的兩種聚類方法是層次聚類(hierarchical agglomerative clustering)和劃分聚類(partitioning clustering)。在層次聚類中,每一個觀測值自成一類,這些類每次兩兩合并,直到所有的類被聚成一類為止。在劃分聚類中,首先指定類的個數K,然后觀測值被隨機分成K類,再重新形成聚合的類。
對于層次聚類來說,最常用的算法是單聯動(single linkage)、全聯動(complete linkage )、平均聯動(average linkage) 、質心(centroid)和Ward方法。
| 聚類方法? | 兩類之間的距離定義 |
| 單聯動 | 一個類中的點和另一個類中的點的最小距離 |
| 全聯動 | 一個類中的點和另一個類中的點的最大距離 |
| 平均聯動 | 一個類中的點和另一個類中的點的平均距離(也稱作UPGMA,即非加權對組平均) |
| 質心 | 兩類中質心(變量均值向量)之間的距離。對單個的觀測值來說,質心就是變量的值 |
| Ward法 | 兩個類之間所有變量的方差分析的平方和 |
層次聚類方法可以用hclust()函數來實現,格式是hclust(d, method=),其中d是通過dist() 函 數 產 生 的 距 離 矩 陣 , 并 且 方 法 包 括 "single" 、 "complete" 、 "average" 、"centroid"和"ward"。
對于劃分聚類來說,最常用的算法是K均值(K-means)和圍繞中心點的劃分(PAM)。
聚類分析的一般步驟:
(1):選擇合適的變量。第一(并且可能是最重要的)步是選擇你感覺可能對識別和理解數據中不同觀測值分組有重要影響的變量。高級的聚類方法也不能彌補聚類變量選不好的問題。
(2):縮放數據。如果我們在分析中選擇的變量變化范圍很大,那么該變量對結果的影響也是最大的。這往往是不可取的,分析師往往在分析之前縮放數據。最常用的方法(scale函數)是將每個變量標準化為均值為0和標準差為1的變量。
(3):尋找異常點。?許多聚類方法對于異常值是十分敏感的。可以通過outliers包中的函數來篩選(和刪除)異常單變量離群點。?
(4):計算距離. 盡管不同的聚類算法差異很大,但是它們通常需要計算被聚類的實體之間的距離。兩個觀測值之間最常用的距離量度是歐幾里得距離 !
(5):?選擇聚類算法。層次聚類對于小樣本來說很實用(如150個觀測值或更少),而且這種情況下嵌套聚類更實用。劃分的方法能處理更大的數據量,但是需要事先確定聚類的個數。一旦選定了層次方法或劃分方法,就必須選擇一個特定的聚類算法。這里再次強調每個算法都有優點和缺點。可以嘗試多種算法來看看相應結果的穩健性。
(6):獲得一種或多種聚類方法。?
(7):確定類的數目。 常用的是在NbClust包中的NbClust()函數
(8):獲得最終的聚類解決方案。
(9):結果可視化
(10):解讀類
(11):驗證結果
計算距離:
查看在flexclust包中的營養數據集,它包括對27種肉、魚和禽的營養物質的測量。最初的幾個觀測值由下面的代碼給出:
?觀測值之間的距離越大,異質性越大。
例1:營養數據的平均聯動聚類
data(nutrient, package="flexclust") head(nutrient)energy protein fat calcium iron beef braised 340 20 28 9 2.6 hamburger 245 21 17 9 2.7 beef roast 420 15 39 7 2.0 beef steak 375 19 32 9 2.6 beef canned 180 22 10 17 3.7 chicken broiled 115 20 3 8 1.4 row.names(nutrient) <- tolower(row.names(nutrient)) nutrient.scaled <- scale(nutrient) # 什么情況下歸一化處理? #nutrient.scaled 是矩陣 d <- dist(nutrient.scaled) #注意:d是下三角矩陣;class(d):dist fit.average <- hclust(d, method="average") fit.average Call: hclust(d = d, method = "average")Cluster method : average Distance : euclidean Number of objects: 27 plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering")#hang=-1表示將觀測值標簽掛在0下面
?
樹狀圖應該從下往上讀,它展示了這些條目如何被結合成類。每個觀測值起初自成一類,然后相距最近的兩類(beef braised和smoked ham)合并。其次, pork roast和pork simmered合并,chicken canned和tuna canned合并。 再次, beef braised/smoked ham這一類和pork roast/pork simmered這一類合并(這個類目前包含四種食品)。合并繼續進行下去,直到所有的觀測值合并成一類。高度刻度代表了該高度類之間合并的判定值。對于平均聯動來說,標準是一類中的點和其他類中點的距離平均值。
NbClust包提供了眾多的指數來確定在一個聚類分析里類的最佳數目。不能保證這些指標得出的結果都一致。事實上,它們可能不一樣。但是結果可用來作為選擇聚類個數K值的一個參考。NbClust()函數的輸入包括需要做聚類的矩陣或是數據框,使用的距離測度和聚類方法,并考慮最小和最大聚類的個數來進行聚類。它返回每一個聚類指數,同時輸出建議聚類的最佳數目。下面的代碼清單使用該方法處理營養數據的平均聯動聚類。
?
這里,四個評判準則贊同聚類個數為2,四個判定準則贊同聚類個數為3 ,等等。可以試著用“投票”個數最多的聚類個數(2、 3、 5和15)并選擇其中一個使得解釋最有意義。 下面的代碼清單展示了五類聚類的方案:
?
當需要嵌套聚類和有意義的層次結構時,層次聚類或許特別有用。層次聚類難以應用到有數百甚至數千觀測值的大樣本中。不過劃分方法可以在大樣本情況下做得很好。?
?
?
轉載于:https://www.cnblogs.com/aloiswei/p/6054333.html
總結
以上是生活随笔為你收集整理的聚类分析1:层次聚类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何加入Dave英语学习小组
- 下一篇: 常用正则表达式 验证电子邮件网址邮政编码