日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聚类分析1:层次聚类

發布時間:2024/1/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聚类分析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種肉、魚和禽的營養物質的測量。最初的幾個觀測值由下面的代碼給出:
  

data(nutrient, package="flexclust") head(nutrient, 4)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 d <- dist(nutrient) #dist(x, method=),這里的x表示輸入數據,并且默認為歐幾里得距離。函數默認返回一個下三角矩陣 as.matrix(d)[1:4,1:4]#as.matrix()函數可使用標準括號符號得到距離BEEF BRAISED HAMBURGER BEEF ROAST BEEF STEAK BEEF BRAISED 0.00000 95.6400 80.93429 35.24202 HAMBURGER 95.64000 0.0000 176.49218 130.87784 BEEF ROAST 80.93429 176.4922 0.00000 45.76418 BEEF STEAK 35.24202 130.8778 45.76418 0.00000

?觀測值之間的距離越大,異質性越大。

  例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 braisedsmoked ham)合并。其次, pork roastpork simmered合并,chicken cannedtuna canned合并。 再次, beef braised/smoked ham這一類和pork roast/pork simmered這一類合并(這個類目前包含四種食品)。合并繼續進行下去,直到所有的觀測值合并成一類。高度刻度代表了該高度類之間合并的判定值。對于平均聯動來說,標準是一類中的點和其他類中點的距離平均值。
  NbClust包提供了眾多的指數來確定在一個聚類分析里類的最佳數目。不能保證這些指標得出的結果都一致。事實上,它們可能不一樣。但是結果可用來作為選擇聚類個數K值的一個參考。NbClust()函數的輸入包括需要做聚類的矩陣或是數據框,使用的距離測度和聚類方法,并考慮最小和最大聚類的個數來進行聚類。它返回每一個聚類指數,同時輸出建議聚類的最佳數目。下面的代碼清單使用該方法處理營養數據的平均聯動聚類。
  

library(NbClust) nc <- NbClust(nutrient.scaled, distance="euclidean", min.nc=2, max.nc=15, method="average") table(nc$Best.n[1,])0 1 2 3 4 5 9 10 13 14 15 2 1 4 4 2 4 1 1 2 1 4 barplot(table(nc$Best.n[1,]), xlab="Numer of Clusters", ylab="Number of Criteria",main="Number of Clusters Chosen by 26 Criteria")

?  

  這里,四個評判準則贊同聚類個數為2,四個判定準則贊同聚類個數為3 ,等等。可以試著用“投票”個數最多的聚類個數(23515)并選擇其中一個使得解釋最有意義。 下面的代碼清單展示了五類聚類的方案:
  

clusters <- cutree(fit.average, k=5) #cutree()函數用來把樹狀圖分成五類,clusters為每個樣本所在類別 table(clusters) clusters1 2 3 4 5 7 16 1 2 1 #aggregate()函數用來獲取每類的中位數,結果有原始度量和標準度量兩種形式。 aggregate(nutrient, by=list(cluster=clusters), median) cluster energy protein fat calcium iron 1 1 340.0 19 29 9 2.50 2 2 170.0 20 8 13 1.45 3 3 160.0 26 5 14 5.90 4 4 57.5 9 1 78 5.70 5 5 180.0 22 9 367 2.50 aggregate(as.data.frame(nutrient.scaled), by=list(cluster=clusters), median)cluster energy protein fat calcium iron 1 1 1.3101024 0.0000000 1.3785620 -0.4480464 0.08110456 2 2 -0.3696099 0.2352002 -0.4869384 -0.3967868 -0.63743114 3 3 -0.4684165 1.6464016 -0.7534384 -0.3839719 2.40779157 4 4 -1.4811842 -2.3520023 -1.1087718 0.4361807 2.27092763 5 5 -0.2708033 0.7056007 -0.3981050 4.1396825 0.08110456 plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering\n5 Cluster Solution") rect.hclust(fit.average, k=5)#rect.hclust()函數用來疊加五類的解決方案

?

  當需要嵌套聚類和有意義的層次結構時,層次聚類或許特別有用。層次聚類難以應用到有數百甚至數千觀測值的大樣本中。不過劃分方法可以在大樣本情況下做得很好。?
  

?

  
  

?

轉載于:https://www.cnblogs.com/aloiswei/p/6054333.html

總結

以上是生活随笔為你收集整理的聚类分析1:层次聚类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。