機器學習之確定最佳聚類數目的10種方法

2020-12-11 雷鋒網

雷鋒網(公眾號:雷鋒網) AI科技評論按,本文作者貝爾塔,原文載於知乎專欄數據分析與可視化,雷鋒網 AI科技評論獲其授權發布。

在聚類分析的時候確定最佳聚類數目是一個很重要的問題,比如kmeans函數就要你提供聚類數目這個參數,總不能兩眼一抹黑亂填一個吧。之前也被這個問題困擾過,看了很多博客,大多泛泛帶過。今天把看到的這麼多方法進行匯總以及代碼實現並儘量弄清每個方法的原理。
數據集選用比較出名的wine數據集進行分析

library(gclus)
data(wine)
head(wine)

Loading required package: cluster

因為我們要找一個數據集進行聚類分析,所以不需要第一列的種類標籤信息,因此去掉第一列。
同時注意到每一列的值差別很大,從1到100多都有,這樣會造成誤差,所以需要歸一化,用scale函數

dataset <- wine[,-1] #去除分類標籤
dataset <- scale(dataset)

去掉標籤之後就可以開始對數據集進行聚類分析了,下面就一一介紹各種確定最佳聚類數目的方法

判定方法

1.mclust包

mclust包是聚類分析非常強大的一個包,也是上課時老師給我們介紹的一個包,每次導入時有一種科技感 :) 幫助文檔非常詳盡,可以進行聚類、分類、密度分析
Mclust包方法有點「暴力」,聚類數目自定義,比如我選取的從1到20,然後一共14種模型,每一種模型都計算聚類數目從1到20的BIC值,最終確定最佳聚類數目,這種方法的思想很直接了當,但是弊端也就顯然易見了——時間複雜度太高,效率低。

library(mclust)
m_clust <- Mclust(as.matrix(dataset), G=1:20) #聚類數目從1一直試到20
summary(m_clust)

Gaussian finite mixture model fitted by EM algorithm


Mclust EVE (ellipsoidal, equal volume and orientation) model with 3 components:


log.likelihood   n  df       BIC       ICL
      -3032.45 178 156 -6873.257 -6873.549


Clustering table:
1  2  3

63 51 64
可見該函數已經把數據集聚類為3種類型了。數目分別為63、51、64。再畫出14個指標隨著聚類數目變化的走勢圖

plot(m_clust, "BIC")

下表是這些模型的意義

它們應該分別代表著相關性(完全正負相關——對角線、稍強正負相關——橢圓、無關——圓)等參數的改變對應的模型,研究清楚這些又是非常複雜的問題了,先按下表,知道BIC值越大則說明所選取的變量集合擬合效果越好。上圖中除了兩個模型一直遞增,其他的12模型數基本上都是在聚類數目為3的時候達到峰值,所以該算法由此得出最佳聚類數目為3的結論。
mclust包還可以用於分類、密度估計等,這個包值得好好把玩。

注意:此BIC並不是貝葉斯信息準則!!!

最近上課老師講金融模型時提到了BIC值,說BIC值越小模型效果越好,頓時想起這裡是在圖中BIC極大值為最佳聚類數目,然後和老師探討了這個問題,之前這裡誤導大家了,Mclust包裡面的BIC並不是貝葉斯信息準則。

1.維基上的貝葉斯信息準則定義

與log(likelihood)成反比,極大似然估計是值越大越好,那麼BIC值確實是越小模型效果越好

2.Mclust包中的BIC定義[3]

這是Mclust包裡面作者定義的「BIC值」,此BIC非彼BIC,這裡是作者自己定義的BIC,可以看到,這裡的BIC與極大似然估計是成正比的,所以這裡是BIC值越大越好,與貝葉斯信息準則值越小模型越好的結論並不衝突

2.Nbclust包

Nbclust包是我在《R語言實戰》上看到的一個包,思想和mclust包比較相近,也是定義了幾十個評估指標,然後聚類數目從2遍歷到15(自己設定),然後通過這些指標看分別在聚類數為多少時達到最優,最後選擇指標支持數最多的聚類數目就是最佳聚類數目。

library(NbClust)
set.seed(1234) #因為method選擇的是kmeans,所以如果不設定種子,每次跑得結果可能不同
nb_clust <- NbClust(dataset,  distance = "euclidean",
       min.nc=2, max.nc=15, method = "kmeans",
       index = "alllong", alphaBeale = 0.1)

*** : The Hubert index is a graphical method of determining the number of clusters.
               In the plot of Hubert index, we seek a significant knee that corresponds to a
               significant increase of the value of the measure i.e the significant peak in Hubert
               index second differences plot.

*** : The D index is a graphical method of determining the number of clusters.
               In the plot of D index, we seek a significant knee (the significant peak in Dindex
               second differences plot) that corresponds to a significant increase of the value of
               the measure.

*******************************************************************
* Among all indices:                                                
* 5 proposed 2 as the best number of clusters
* 16 proposed 3 as the best number of clusters
* 1 proposed 10 as the best number of clusters
* 1 proposed 12 as the best number of clusters
* 1 proposed 14 as the best number of clusters
* 3 proposed 15 as the best number of clusters

                  ***** Conclusion *****                            

* According to the majority rule, the best number of clusters is  3

*******************************************************************

barplot(table(nb_clust$Best.nc[1,]),xlab = "聚類數",ylab = "支持指標數")

可以看到有16個指標支持最佳聚類數目為3,5個指標支持聚類數為2,所以該方法推薦的最佳聚類數目為3.

3. 組內平方誤差和——拐點圖

想必之前動輒幾十個指標,這裡就用一個最簡單的指標——sum of squared error (SSE)組內平方誤差和來確定最佳聚類數目。這個方法也是出於《R語言實戰》,自定義的一個求組內誤差平方和的函數。

wssplot <- function(data, nc=15, seed=1234){
   wss <- (nrow(data)-1)*sum(apply(data,2,var))
   for (i in 2:nc){
       set.seed(seed)
       wss[i] <- sum(kmeans(data, centers=i)$withinss)
       }
   plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")}

wssplot(dataset)

隨著聚類數目增多,每一個類別中數量越來越少,距離越來越近,因此WSS值肯定是隨著聚類數目增多而減少的,所以關注的是斜率的變化,但WWS減少得很緩慢時,就認為進一步增大聚類數效果也並不能增強,存在得這個「肘點」就是最佳聚類數目,從一類到三類下降得很快,之後下降得很慢,所以最佳聚類個數選為三

另外也有現成的包(factoextra)可以調用

library(factoextra)
library(ggplot2)
set.seed(1234)
fviz_nbclust(dataset, kmeans, method = "wss") +
   geom_vline(xintercept = 3, linetype = 2)

Loading required package: ggplot2


選定為3類為最佳聚類數目
用該包下的fviz_cluster函數可視化一下聚類結果

km.res <- kmeans(dataset,3)
fviz_cluster(km.res, data = dataset)

4. PAM(Partitioning Around Medoids) 圍繞中心點的分割算法

k-means算法取得是均值,那麼對於異常點其實對其的影響非常大,很可能這種孤立的點就聚為一類,一個改進的方法就是PAM算法,也叫k-medoids clustering
首先通過fpc包中的pamk函數得到最佳聚類數目

library(fpc)
pamk.best <- pamk(dataset)
pamk.best$nc

3

pamk函數不需要提供聚類數目,也會直接自動計算出最佳聚類數,這裡也得到為3
得到聚類數提供給cluster包下的pam函數並進行可視化

library(cluster)
clusplot(pam(dataset, pamk.best$nc))

5.Calinsky criterion

這個評估標準定義[5]如下:
其中,k是聚類數,N是樣本數,SSw是我們之前提到過的組內平方和誤差, SSb是組與組之間的平方和誤差,SSw越小,SSb越大聚類效果越好,所以Calinsky criterion值一般來說是越大,聚類效果越好

library(vegan)
ca_clust <- cascadeKM(dataset, 1, 10, iter = 1000)
ca_clust$results

可以看到該函數把組內平方和誤差和Calinsky都計算出來了,可以看到calinski在聚類數為3時達到最大值。

calinski.best <- as.numeric(which.max(ca_clust$results[2,]))
calinski.best

3

畫圖出來觀察一下

plot(fit, sortg = TRUE, grpmts.plot = TRUE)


注意到那個紅點就是對應的最大值,自帶的繪圖橫軸縱軸取的可能不符合我們的直覺,把數據取出來自己單獨畫一下

calinski<-as.data.frame(ca_clust$results[2,])
calinski$cluster <- c(1:10)
library(ggplot2)
ggplot(calinski,aes(x = calinski[,2], y = calinski[,1]))+geom_line()

Warning message:
"Removed 1 rows containing missing values (geom_path)."


這個看上去直觀多了。這就很清晰的可以看到在聚類數目為3時,calinski指標達到了最大值,所以最佳數目為3

6.Affinity propagation (AP) clustering

這個本質上是類似kmeans或者層次聚類一樣,是一種聚類方法,因為不需要像kmeans一樣提供聚類數,會自動算出最佳聚類數,因此也放到這裡作為一種計算最佳聚類數目的方法。
AP算法的基本思想是將全部樣本看作網絡的節點,然後通過網絡中各條邊的消息傳遞計算出各樣本的聚類中心。聚類過程中,共有兩種消息在各節點間傳遞,分別是吸引度( responsibility)和歸屬度(availability) 。AP算法通過迭代過程不斷更新每一個點的吸引度和歸屬度值,直到產生m個高質量的Exemplar(類似於質心),同時將其餘的數據點分配到相應的聚類中[7]

library(apcluster)
ap_clust <- apcluster(negDistMat(r=2), dataset)
length(ap_clust@clusters)

15

該聚類方法推薦的最佳聚類數目為15,再用熱力圖可視化一下

heatmap(ap_clust)

選x或者y方向看(對稱),可以數出來「葉子節點」一共15個

7. 輪廓係數Average silhouette method

輪廓係數是類的密集與分散程度的評價指標。

a(i)是測量組內的相似度,b(i)是測量組間的相似度,s(i)範圍從-1到1,值越大說明組內吻合越高,組間距離越遠——也就是說,輪廓係數值越大,聚類效果越好[9]

require(cluster)
library(factoextra)
fviz_nbclust(dataset, kmeans, method = "silhouette")


可以看到也是在聚類數為3時輪廓係數達到了峰值,所以最佳聚類數為3

8. Gap Statistic

之前我們提到了WSSE組內平方和誤差,該種方法是通過找「肘點」來找到最佳聚類數,肘點的選擇並不是那麼清晰,因此史丹福大學的Robert等教授提出了Gap Statistic方法,定義的Gap值為[9]

取對數的原因是因為Wk的值可能很大
通過這個式子來找出Wk跌落最快的點,Gap最大值對應的k值就是最佳聚類數

library(cluster)
set.seed(123)
gap_clust <- clusGap(dataset, kmeans, 10, B = 500, verbose = interactive())
gap_clust

Clustering Gap statistic ["clusGap"] from call:
clusGap(x = dataset, FUNcluster = kmeans, K.max = 10, B = 500,     verbose = interactive())
B=500 simulated reference sets, k = 1..10; spaceH0="scaledPCA"
--> Number of clusters (method 'firstSEmax', SE.factor=1): 3
         logW   E.logW       gap     SE.sim
[1,] 5.377557 5.863690 0.4861333 0.01273873
[2,] 5.203502 5.758276 0.5547745 0.01420766
[3,] 5.066921 5.697322 0.6304006 0.01278909
[4,] 5.023936 5.651618 0.6276814 0.01243239
[5,] 4.993720 5.615174 0.6214536 0.01251765
[6,] 4.962933 5.584564 0.6216311 0.01165595
[7,] 4.943241 5.556310 0.6130690 0.01181831
[8,] 4.915582 5.531834 0.6162518 0.01139207
[9,] 4.881449 5.508514 0.6270646 0.01169532
[10,] 4.855837 5.487005 0.6311683 0.01198264

library(factoextra)
fviz_gap_stat(gap_clust)

可以看到也是在聚類數為3的時候gap值取到了最大值,所以最佳聚類數為3

9.層次聚類

層次聚類是通過可視化然後人為去判斷大致聚為幾類,很明顯在共同父節點的一顆子樹可以被聚類為一個類

h_dist <- dist(as.matrix(dataset))
h_clust<-hclust(h_dist)
plot(h_clust, hang = -1, labels = FALSE)
rect.hclust(h_clust,3)

10.clustergram

最後一種算法是Tal Galili[10]大牛自己定義的一種聚類可視化的展示,繪製隨著聚類數目的增加,所有成員是如何分配到各個類別的。該代碼沒有被製作成R包,可以去Galili介紹頁面)裡面的github地址找到原始碼跑一遍然後就可以用這個函數了,因為原始碼有點長我就不放博客裡面了,直接放出運行代碼的截圖。

clustergram(dataset, k.range = 2:8, line.width = 0.004)

Loading required package: colorspace
Loading required package: plyr

隨著K的增加,從最開始的兩類到最後的八類,圖肯定是越到後面越密集。通過這個圖判斷最佳聚類數目的方法應該是看隨著K每增加1,分出來的線越少說明在該k值下越穩定。比如k=7到k=8,假設k=7是很好的聚類數,那分成8類時應該可能只是某一類分成了兩類,其他6類都每怎麼變。反應到圖中應該是有6簇平行線,有一簇分成了兩股,而現在可以看到從7到8,線完全亂了,說明k=7時效果並不好。按照這個分析,k=3到k=4時,第一股和第三股幾本沒變,就第二股拆成了2類,所以k=3是最佳聚類數目

方法匯總與比較

wine數據集我們知道其實是分為3類的,以上10種判定方法中:

  1. 層次聚類和clustergram方法、肘點圖法,需要人工判定,雖然可以得出大致的最佳聚類數,但算法本身不會給出最佳聚類數

  2. 除了Affinity propagation (AP) clustering 給出最佳聚類數為15,剩下6種全都是給出最佳聚類數為3

  3. 選用上次文本挖掘的矩陣進行分析(667*1623)

可見上述方法中有的因為數據太大不能運行,有的結果很明顯不對,一個可能是數據集的本身的原因(缺失值太多等),但是也告訴了我們在確定最佳聚類數目的時候需要多嘗試幾種方法,並沒有固定的套路,然後選擇一種可信度較高的聚類數目。
最後再把這10種方法總結一下:

參考文獻
[1]R語言實戰第二版
[2]Partitioning cluster analysis: Quick start guide - Unsupervised Machine Learning
[3]BIC:http://www.stat.washington.edu/raftery/Research/PDF/fraley1998.pdf
[4]Cluster analysis in R: determine the optimal number of clusters
[5]Calinski-Harabasz Criterion:Calinski-Harabasz criterion clustering evaluation object
[6]Determining the optimal number of clusters: 3 must known methods - Unsupervised Machine Learning
[7] affinity-propagation:聚類算法Affinity Propagation(AP)
[8]輪廓係數https://en.wikipedia.org/wiki/Silhouette(clustering))
[9]gap statistic-Tibshirani R, Walther G, Hastie T. Estimating the number of clusters in a data set via the gap statistic[J]. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 2001, 63(2): 411-423.

[10]ClustergramsClustergram: visualization and diagnostics for cluster analysis (R code)

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • Python機器學習10:機器學習中的五種可視化方法(上)
    在機器學習中,通常需要先了解訓練的數據集,才能決定選擇哪種特徵預處理方法、哪種模型,以便獲得問題的最優解法。最有效的了解訓練數據集的方法是可視化訓練數據集,從各種可視化的圖中觀察訓練數據集特徵。本文將介紹如何使用Python機器學習庫Pandas可視化訓練數據集。Pandas是Python中高效的數據加載、數據分析工具,它是基於NumPy實現的,提供了很多有用的函數接口。引言本教程將介紹5中常用的機器學習可視化方法,分別如下所示。
  • 分享最適合新手入門的10種機器學習算法
    最常見的機器學習類型是學習映射Y=f(X),用它來預測Y的值。這被稱為預測建模或預測分析,我們的目標是做出最準確的預測。 對於想了解機器學習基礎知識的新手,以下是數據科學家最常用的10種機器學習算法。 1.線性回歸 線性回歸也許是數據科學和機器學習中最知名、最好理解的算法了吧。
  • 每個數據科學家都應該知道的10種機器學習方法
    作者 | CDA數據分析師 10 machine learning methods that every data scientist should know機器學習是研究和工業中的熱門話題,新方法一直在發展。
  • 推薦 | 10門最佳的機器學習課程
    從老師那裡獲得最佳實踐和建議。與來自各個級別的志趣相投的學習者社區中的同伴互動。靈活的截止日期方便學習。學習應用學習算法來構建智慧機器人,理解文本,音頻,資料庫挖掘。獲得行業專家和領導者的最佳實踐和建議。按照你的時間表完成所有評估和作業,以獲得專業完成證書。
  • 機器學習的5種「兵法"
    傳統的學習方法要求你在學習算法理論前有諸如線性代數、概率學及統計學等預備數學知識,如果你曾經歷如何端對端解決問題然後傳輸一個有效、可靠且準確的預測模型的工作執行或討論,那你是很幸運的。我來教你一個自上而下的學習機器學習的方法。這種方法首先是學習端對端解決問題的系統性處理繪製一張「最佳組合」機器學習工具及平臺的步驟圖在測試資料庫裡進行定向實踐。
  • 重磅| ICML 2017最佳論文公布!機器學習的可解釋性成熱點
    本屆ICML最佳論文的主題是,利用影響函數理解黑箱預測。機器學習中的一個關鍵問題就是,系統為何做出某種預測?我們不僅需要表現優異的模型,更需要可解釋的模型。理解了模型如何做出決策,也就能進一步改善它。更重要的是,要讓機器學習應用於現實中的重要問題,比如醫療診斷、做出決策、災難響應,我們就需要一個能被人類理解和信任的系統。
  • 使用機器學習前,企業需要做的10項準備工作
    並非每一個問題都可以通過機器學習來解決,也並不是每個企業都為AI的應用做好了準備。比如,企業要確定具體的應用場景、是否有足夠的數據進行分析、要建立預測模型、要有定義模型和訓練模型的人員和工具......等等。
  • 入門機器學習之線性回歸
    什麼是回歸分析在客觀世界中普通存在著變量之間的關係,變量之間的關係一般來說可以分成確定性關係和不確定關係,確定性關係是說變量之間的關係是可以用函數關係來表示的,另一種不確定性關係即所謂相關關係。最常用的回歸方法如下:1、Linear Regression線性回歸:它是最為人熟知的建模技術之一。線性回歸通常是人們在學習預測模型時首選的技術之一。在這種技術中,因變量是連續的,自變量可以是連續的也可以是離散的,回歸線的性質是線性的。線性回歸使用最佳的擬合直線(也就是回歸線)在因變量(Y)和一個或多個自變量(X)之間建立一種關係。
  • 機器學習必學10大算法
    選自Medium作者:garvitanand2機器之心編譯參與:Geek AI、路本文介紹了 10 大常用機器學習算法,包括線性回歸、Logistic 回歸、線性判別分析、樸素貝葉斯、KNN、隨機森林等。1. 線性回歸在統計學和機器學習領域,線性回歸可能是最廣為人知也最易理解的算法之一。
  • 5分鐘入門到精通,適合AI初學者的10個機器學習項目!
    隨著機器學習的激增,越來越多的專業人員從事機器學習工程師的職業。入門的最佳方法之一是動手實踐並開發項目,並且在線上有許多免費資源。這是一些適合初學者的最佳機器學習項目,所有這些都需要一定程度的機器學習知識。通過AI和機器學習增強職業技能並促進職業發展。
  • 機器學習特徵選擇方法總結
    真正的挑戰是找出哪些特徵是最佳的使用特徵(這實際上取決於我們提供的數據量和我們正在努力實現的任務的複雜性)。這就是特徵選擇技術能夠幫到我們的地方!1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。
  • 收藏 | 機器學習特徵選擇方法總結
    真正的挑戰是找出哪些特徵是最佳的使用特徵(這實際上取決於我們提供的數據量和我們正在努力實現的任務的複雜性)。這就是特徵選擇技術能夠幫到我們的地方!1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。
  • 數據科學和機器學習的最佳Python庫
    Python庫Python在AI和ML領域普及的唯一最重要的原因是,Python提供了數千個內置庫,這些庫具有內置功能和方法,可以輕鬆地進行數據分析,處理,處理,建模等。 。在下一節中,我們將討論以下任務的庫:統計分析數據可視化數據建模與機器學習深度學習自然語言處理(NLP)統計分析統計是數據科學和機器學習的最基本基礎之一。
  • 機器學習與統計學的本質差異
    由於這些方法產生相同的結果,因此很容易理解為什麼人們可能認為它們是相同的。統計與機器學習 - 線性回歸舉例我認為這種誤解很好地包含在比較統計數據和機器學習這個表面上非常詼諧的10年挑戰中。然而,僅基於它們都利用相同的基本概率概念這一事實來混淆這兩個術語是不合理的。例如,如果我們根據這個事實做出機器學習只是美化統計的陳述,我們也可以做出以下陳述。
  • 機器學習頂會ICML 2018:復旦大學副教授獲最佳論文亞軍 騰訊清華...
    智東西(公眾號:zhidxcom)文 | 心緣智東西7月12日消息,第35屆機器學習國際大會ICML 2018在7月10日至15日期間登陸瑞典斯特哥爾摩。ICML官網上提前公布了最佳論文名單,來自MIT和UC Berkeley的研究人員摘得最佳論文的桂冠。
  • 機器學習規則:關於機器學習工程的最佳實踐(三)
    另一種方法是交集:如果使用交集方法,若且唯若文檔和查詢中都包含「pony」一詞時,才會出現一個特徵;若且唯若文檔和查詢中都包含「the」一詞時,才會出現另一個特徵。 第 21 條規則:您可以在線性模型中學習的特徵權重數目與您擁有的數據量大致成正比。
  • 七個自動機器學習框架
    但是,機器學習的建模流程時間長且複雜,人們仍然在尋求部署更多機器學習模型。企業需要預測的特定數據集合時,傳統的方法需要執行以下操作:1、處理數據2、定義技術特性3、選擇模型4、優化超參數5、對參數的訓練沒有適用於所有任務的算法,數據分析人員需要為每個特定任務選擇和配置算法。
  • 數據分析師必須掌握的10種統計方法 (1)
    在海量的統計知識裡,我認為有10個統計技能在商業應用中因其應用的廣泛性而脫穎而出,因而這篇文章就是介紹這10種統計方法的。1.線性回歸在統計中,線性回歸是通過擬合因變量和自變量之間最佳的線性關係來預測一個目標變量的。最佳擬合是怎麼找到的呢?是通過找到實際觀測值和預測值的最小加和來確定的。
  • 機器學習 | 43種開源數據集(附地址/調用方法)
    scikit-learn的datasets模塊主要提供了一些導入、在線下載及本地生成數據集的方法。鳶尾花數據集是一個非常經典的數據集,著名的統計學家Fisher在研究判別分析問題時收集了一些關於鳶尾花的數據,包含了150個鳶尾花樣本,對應3種鳶尾花,各50個樣本,以及它們各自對應的4種關於外形的數據(自變量)。該數據集可用於多分類問題,測量數據如下所示。類別共分為三類:Iris Setosa、Iris Versicolour和Iris Virginica。
  • 機器學習備忘錄 | AUC值的含義與計算方法
    筆者也曾遇到類似的問題,因此希望藉由本文來梳理下 AUC 值的意義與計算方法,通過實際的例子幫助讀者加深理解,同時給出了使用 scikit-learn 工具庫計算 AUC 值的方法,供各位參考。我們參看下維基百科上的定義:在信號檢測理論中,接收者操作特徵曲線( receiver operating characteristic curve ,或者叫 ROC 曲線)是一種坐標圖式的分析工具,用於 (1) 選擇最佳的信號偵測模型、捨棄次佳的模型。通常很多的機器學習工具都封裝了模型指標的計算,當然也包括 AUC 值。