雷鋒網(wǎng) AI科技評(píng)論按,本文作者貝爾塔 ,原文載于知乎專(zhuān)欄數(shù)據(jù)分析與可視化 ,雷鋒網(wǎng) AI科技評(píng)論獲其授權(quán)發(fā)布。
在聚類(lèi)分析的時(shí)候確定最佳聚類(lèi)數(shù)目是一個(gè)很重要的問(wèn)題,比如kmeans函數(shù)就要你提供聚類(lèi)數(shù)目這個(gè)參數(shù),總不能兩眼一抹黑亂填一個(gè)吧。之前也被這個(gè)問(wèn)題困擾過(guò),看了很多博客,大多泛泛帶過(guò)。今天把看到的這么多方法進(jìn)行匯總以及代碼實(shí)現(xiàn)并盡量弄清每個(gè)方法的原理。 數(shù)據(jù)集選用比較出名的wine數(shù)據(jù)集進(jìn)行分析
library(gclus) data(wine) head(wine)
Loading required package: cluster
因?yàn)槲覀円乙粋€(gè)數(shù)據(jù)集進(jìn)行聚類(lèi)分析,所以不需要第一列的種類(lèi)標(biāo)簽信息,因此去掉第一列。 同時(shí)注意到每一列的值差別很大,從1到100多都有,這樣會(huì)造成誤差,所以需要?dú)w一化,用scale函數(shù)
dataset <- wine[,-1] #去除分類(lèi)標(biāo)簽 dataset <- scale(dataset)
去掉標(biāo)簽之后就可以開(kāi)始對(duì)數(shù)據(jù)集進(jìn)行聚類(lèi)分析了,下面就一一介紹各種確定最佳聚類(lèi)數(shù)目的方法
判定方法
1.mclust包
mclust包是聚類(lèi)分析非常強(qiáng)大的一個(gè)包,也是上課時(shí)老師給我們介紹的一個(gè)包,每次導(dǎo)入時(shí)有一種科技感 :) 幫助文檔非常詳盡,可以進(jìn)行聚類(lèi)、分類(lèi)、密度分析 Mclust包方法有點(diǎn)“暴力”,聚類(lèi)數(shù)目自定義,比如我選取的從1到20,然后一共14種模型,每一種模型都計(jì)算聚類(lèi)數(shù)目從1到20的BIC值,最終確定最佳聚類(lèi)數(shù)目,這種方法的思想很直接了當(dāng),但是弊端也就顯然易見(jiàn)了——時(shí)間復(fù)雜度太高,效率低。
library(mclust) m_clust <- Mclust(as.matrix(dataset), G=1:20) #聚類(lèi)數(shù)目從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 可見(jiàn)該函數(shù)已經(jīng)把數(shù)據(jù)集聚類(lèi)為3種類(lèi)型了。數(shù)目分別為63、51、64。再畫(huà)出14個(gè)指標(biāo)隨著聚類(lèi)數(shù)目變化的走勢(shì)圖
plot(m_clust, "BIC")
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/9c2e7ed5c2a689fc2caf452112362db6.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;531&amp;amp;quot; data-rawheight=&amp;amp;quot;527&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;531&amp;amp;quot; data-original=&amp;amp;quot;https://pic4.zhimg.com/v2-5357b2dfa1d132078fb52f7ec8ea8faf_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/9c2e7ed5c2a689fc2caf452112362db6.png&amp;amp;quot;/&amp;amp;gt;
下表是這些模型的意義
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/92cc4b3be70b912cc2f43a3e8d204f9d.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;715&amp;amp;quot; data-rawheight=&amp;amp;quot;532&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;715&amp;amp;quot; data-original=&amp;amp;quot;https://pic2.zhimg.com/v2-5e9833600f6cff8e5233c12e61dc15b9_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/92cc4b3be70b912cc2f43a3e8d204f9d.png&amp;amp;quot;/&amp;amp;gt;
它們應(yīng)該分別代表著相關(guān)性(完全正負(fù)相關(guān)——對(duì)角線、稍強(qiáng)正負(fù)相關(guān)——橢圓、無(wú)關(guān)——圓)等參數(shù)的改變對(duì)應(yīng)的模型,研究清楚這些又是非常復(fù)雜的問(wèn)題了,先按下表,知道BIC值越大則說(shuō)明所選取的變量集合擬合效果越好。上圖中除了兩個(gè)模型一直遞增,其他的12模型數(shù)基本上都是在聚類(lèi)數(shù)目為3的時(shí)候達(dá)到峰值,所以該算法由此得出最佳聚類(lèi)數(shù)目為3的結(jié)論。 mclust包還可以用于分類(lèi)、密度估計(jì)等,這個(gè)包值得好好把玩。
注意:此BIC并不是貝葉斯信息準(zhǔn)則!!!
最近上課老師講金融模型時(shí)提到了BIC值,說(shuō)BIC值越小模型效果越好,頓時(shí)想起這里是在圖中BIC極大值為最佳聚類(lèi)數(shù)目,然后和老師探討了這個(gè)問(wèn)題,之前這里誤導(dǎo)大家了,Mclust包里面的BIC并不是貝葉斯信息準(zhǔn)則。
1.維基 上的貝葉斯信息準(zhǔn)則定義
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/3b66ee7c7a243bf9c7c3b22a23ad55af.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;292&amp;amp;quot; data-rawheight=&amp;amp;quot;53&amp;amp;quot; class=&amp;amp;quot;content_image&amp;amp;quot; width=&amp;amp;quot;292&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/3b66ee7c7a243bf9c7c3b22a23ad55af.png&amp;amp;quot;/&amp;amp;gt;
與log(likelihood)成反比,極大似然估計(jì)是值越大越好,那么BIC值確實(shí)是越小模型效果越好
2.Mclust包中的BIC定義[3]
這是Mclust包里面作者定義的“BIC值”,此BIC非彼BIC,這里是作者自己定義的BIC,可以看到,這里的BIC與極大似然估計(jì)是成正比的,所以這里是BIC值越大越好,與貝葉斯信息準(zhǔn)則值越小模型越好的結(jié)論并不沖突
2.Nbclust包
Nbclust包是我在《R語(yǔ)言實(shí)戰(zhàn)》上看到的一個(gè)包,思想和mclust包比較相近,也是定義了幾十個(gè)評(píng)估指標(biāo),然后聚類(lèi)數(shù)目從2遍歷到15(自己設(shè)定),然后通過(guò)這些指標(biāo)看分別在聚類(lèi)數(shù)為多少時(shí)達(dá)到最優(yōu),最后選擇指標(biāo)支持?jǐn)?shù)最多的聚類(lèi)數(shù)目就是最佳聚類(lèi)數(shù)目。
library(NbClust) set.seed(1234) #因?yàn)閙ethod選擇的是kmeans,所以如果不設(shè)定種子,每次跑得結(jié)果可能不同 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 = "聚類(lèi)數(shù)",ylab = "支持指標(biāo)數(shù)")
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/343439c0965ccbde22dbc1d2185b1a13.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;533&amp;amp;quot; data-rawheight=&amp;amp;quot;530&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;533&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-a08e3cf366ada95c9fa43d429a00f16a_r.png&amp;amp;quot; _src=&amp;amp;quot;&lt;a href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/343439c0965ccbde22dbc1d2185b1a13.png&amp;quot;/&gt;&quot; _src=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/343439c0965ccbde22dbc1d2185b1a13.png&amp;quot;/&gt;&quot; _href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/343439c0965ccbde22dbc1d2185b1a13.png&amp;quot;/&gt;&quot;&gt;https://static.leiphone.com/uploads/new/article/pic/201710/343439c0965ccbde22dbc1d2185b1a13.png&amp;amp;quot;/&amp;amp;gt;&lt;/a&gt;
可以看到有16個(gè)指標(biāo)支持最佳聚類(lèi)數(shù)目為3,5個(gè)指標(biāo)支持聚類(lèi)數(shù)為2,所以該方法推薦的最佳聚類(lèi)數(shù)目為3.
3. 組內(nèi)平方誤差和——拐點(diǎn)圖
想必之前動(dòng)輒幾十個(gè)指標(biāo),這里就用一個(gè)最簡(jiǎn)單的指標(biāo)——sum of squared error (SSE)組內(nèi)平方誤差和來(lái)確定最佳聚類(lèi)數(shù)目。這個(gè)方法也是出于《R語(yǔ)言實(shí)戰(zhàn)》,自定義的一個(gè)求組內(nèi)誤差平方和的函數(shù)。
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)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/39ae40d81ccf72c41b48a28e609d661e.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;533&amp;amp;quot; data-rawheight=&amp;amp;quot;531&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;533&amp;amp;quot; data-original=&amp;amp;quot;https://pic2.zhimg.com/v2-25b396108e9b5da6094c2097888f2251_r.png&amp;amp;quot; _src=&amp;amp;quot;&lt;a href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/39ae40d81ccf72c41b48a28e609d661e.png&amp;quot;/&gt;&quot; _src=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/39ae40d81ccf72c41b48a28e609d661e.png&amp;quot;/&gt;&quot; _href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/39ae40d81ccf72c41b48a28e609d661e.png&amp;quot;/&gt;&quot;&gt;https://static.leiphone.com/uploads/new/article/pic/201710/39ae40d81ccf72c41b48a28e609d661e.png&amp;amp;quot;/&amp;amp;gt;&lt;/a&gt;
隨著聚類(lèi)數(shù)目增多,每一個(gè)類(lèi)別中數(shù)量越來(lái)越少,距離越來(lái)越近,因此WSS值肯定是隨著聚類(lèi)數(shù)目增多而減少的,所以關(guān)注的是斜率的變化,但WWS減少得很緩慢時(shí),就認(rèn)為進(jìn)一步增大聚類(lèi)數(shù)效果也并不能增強(qiáng),存在得這個(gè)“肘點(diǎn)”就是最佳聚類(lèi)數(shù)目,從一類(lèi)到三類(lèi)下降得很快,之后下降得很慢,所以最佳聚類(lèi)個(gè)數(shù)選為三
另外也有現(xiàn)成的包(factoextra)可以調(diào)用
library(factoextra) library(ggplot2) set.seed(1234) fviz_nbclust(dataset, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2)
Loading required package: ggplot2
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/45de0c17eee70394a867f5889f7d3098.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;537&amp;amp;quot; data-rawheight=&amp;amp;quot;534&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;537&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-b80ac3d187e619c5fdaf46a3d3c9361e_r.png&amp;amp;quot; _src=&amp;amp;quot;&lt;a href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/45de0c17eee70394a867f5889f7d3098.png&amp;quot;/&gt;&quot; _src=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/45de0c17eee70394a867f5889f7d3098.png&amp;quot;/&gt;&quot; _href=&quot;https://static.leiphone.com/uploads/new/article/pic/201710/45de0c17eee70394a867f5889f7d3098.png&amp;quot;/&gt;&quot;&gt;https://static.leiphone.com/uploads/new/article/pic/201710/45de0c17eee70394a867f5889f7d3098.png&amp;amp;quot;/&amp;amp;gt;&lt;/a&gt;
選定為3類(lèi)為最佳聚類(lèi)數(shù)目 用該包下的fviz_cluster函數(shù)可視化一下聚類(lèi)結(jié)果
km.res <- kmeans(dataset,3) fviz_cluster(km.res, data = dataset)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/4c6ed79b2deec361f41a79be29eca253.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;532&amp;amp;quot; data-rawheight=&amp;amp;quot;530&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;532&amp;amp;quot; data-original=&amp;amp;quot;https://pic2.zhimg.com/v2-9ff52d6a4c1dfeedff83fa03c895e2b9_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/4c6ed79b2deec361f41a79be29eca253.png&amp;amp;quot;/&amp;amp;gt;
4. PAM(Partitioning Around Medoids) 圍繞中心點(diǎn)的分割算法
k-means算法取得是均值,那么對(duì)于異常點(diǎn)其實(shí)對(duì)其的影響非常大,很可能這種孤立的點(diǎn)就聚為一類(lèi),一個(gè)改進(jìn)的方法就是PAM算法,也叫k-medoids clustering 首先通過(guò)fpc包中的pamk函數(shù)得到最佳聚類(lèi)數(shù)目
library(fpc) pamk.best <- pamk(dataset) pamk.best$nc
3
pamk函數(shù)不需要提供聚類(lèi)數(shù)目,也會(huì)直接自動(dòng)計(jì)算出最佳聚類(lèi)數(shù),這里也得到為3 得到聚類(lèi)數(shù)提供給cluster包下的pam函數(shù)并進(jìn)行可視化
library(cluster) clusplot(pam(dataset, pamk.best$nc))
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/3399bd76503f61d284bdccca0023d899.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;530&amp;amp;quot; data-rawheight=&amp;amp;quot;532&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;530&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-387e44d991195f07e55ffbdeb0c479be_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/3399bd76503f61d284bdccca0023d899.png&amp;amp;quot;/&amp;amp;gt;
5.Calinsky criterion
這個(gè)評(píng)估標(biāo)準(zhǔn)定義[5]如下: 其中,k是聚類(lèi)數(shù),N是樣本數(shù),SSw是我們之前提到過(guò)的組內(nèi)平方和誤差, SSb是組與組之間的平方和誤差,SSw越小,SSb越大聚類(lèi)效果越好,所以Calinsky criterion值一般來(lái)說(shuō)是越大,聚類(lèi)效果越好
library(vegan) ca_clust <- cascadeKM(dataset, 1, 10, iter = 1000) ca_clust$results
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/a12ebaef7daa5788c09e5eb3ba08c6d0.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;592&amp;amp;quot; data-rawheight=&amp;amp;quot;142&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;592&amp;amp;quot; data-original=&amp;amp;quot;https://pic4.zhimg.com/v2-aa28be2976a4f350d80506c45026df97_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/a12ebaef7daa5788c09e5eb3ba08c6d0.png&amp;amp;quot;/&amp;amp;gt;
可以看到該函數(shù)把組內(nèi)平方和誤差和Calinsky都計(jì)算出來(lái)了,可以看到calinski在聚類(lèi)數(shù)為3時(shí)達(dá)到最大值。
calinski.best <- as.numeric(which.max(ca_clust$results[2,])) calinski.best
3
畫(huà)圖出來(lái)觀察一下
plot(fit, sortg = TRUE, grpmts.plot = TRUE)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/699416f926e98813797da0ae31c45ce4.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;534&amp;amp;quot; data-rawheight=&amp;amp;quot;533&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;534&amp;amp;quot; data-original=&amp;amp;quot;https://pic4.zhimg.com/v2-fc2cda58b5ba4856c681a731bc4906eb_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/699416f926e98813797da0ae31c45ce4.png&amp;amp;quot;/&amp;amp;gt;
注意到那個(gè)紅點(diǎn)就是對(duì)應(yīng)的最大值,自帶的繪圖橫軸縱軸取的可能不符合我們的直覺(jué),把數(shù)據(jù)取出來(lái)自己?jiǎn)为?dú)畫(huà)一下
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)."
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/d1a5ca803f794122475c83a0f2ca700a.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;533&amp;amp;quot; data-rawheight=&amp;amp;quot;533&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;533&amp;amp;quot; data-original=&amp;amp;quot;https://pic2.zhimg.com/v2-7655fc4a181aa14c3614f060e7981575_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/d1a5ca803f794122475c83a0f2ca700a.png&amp;amp;quot;/&amp;amp;gt;
這個(gè)看上去直觀多了。這就很清晰的可以看到在聚類(lèi)數(shù)目為3時(shí),calinski指標(biāo)達(dá)到了最大值,所以最佳數(shù)目為3
6.Affinity propagation (AP) clustering
這個(gè)本質(zhì)上是類(lèi)似kmeans或者層次聚類(lèi)一樣,是一種聚類(lèi)方法,因?yàn)椴恍枰駅means一樣提供聚類(lèi)數(shù),會(huì)自動(dòng)算出最佳聚類(lèi)數(shù),因此也放到這里作為一種計(jì)算最佳聚類(lèi)數(shù)目的方法。 AP算法的基本思想是將全部樣本看作網(wǎng)絡(luò)的節(jié)點(diǎn),然后通過(guò)網(wǎng)絡(luò)中各條邊的消息傳遞計(jì)算出各樣本的聚類(lèi)中心。聚類(lèi)過(guò)程中,共有兩種消息在各節(jié)點(diǎn)間傳遞,分別是吸引度( responsibility)和歸屬度(availability) 。AP算法通過(guò)迭代過(guò)程不斷更新每一個(gè)點(diǎn)的吸引度和歸屬度值,直到產(chǎn)生m個(gè)高質(zhì)量的Exemplar(類(lèi)似于質(zhì)心),同時(shí)將其余的數(shù)據(jù)點(diǎn)分配到相應(yīng)的聚類(lèi)中[7]
library(apcluster) ap_clust <- apcluster(negDistMat(r=2), dataset) length(ap_clust@clusters)
15
該聚類(lèi)方法推薦的最佳聚類(lèi)數(shù)目為15,再用熱力圖可視化一下
heatmap(ap_clust)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/dbc870375b6d45be952ee72e882fbbc0.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;527&amp;amp;quot; data-rawheight=&amp;amp;quot;530&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;527&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-b982fd6c85860755226f4ae347397252_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/dbc870375b6d45be952ee72e882fbbc0.png&amp;amp;quot;/&amp;amp;gt;
選x或者y方向看(對(duì)稱(chēng)),可以數(shù)出來(lái)“葉子節(jié)點(diǎn)”一共15個(gè)
7. 輪廓系數(shù)Average silhouette method
輪廓系數(shù)是類(lèi)的密集與分散程度的評(píng)價(jià)指標(biāo)。
a(i)是測(cè)量組內(nèi)的相似度,b(i)是測(cè)量組間的相似度,s(i)范圍從-1到1,值越大說(shuō)明組內(nèi)吻合越高,組間距離越遠(yuǎn)——也就是說(shuō),輪廓系數(shù)值越大,聚類(lèi)效果越好[9]
require(cluster) library(factoextra) fviz_nbclust(dataset, kmeans, method = "silhouette")
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/320ffea3de355eba9f40c34a92397420.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;535&amp;amp;quot; data-rawheight=&amp;amp;quot;531&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;535&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-f24229d24e86ded6219e4636e9849292_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/320ffea3de355eba9f40c34a92397420.png&amp;amp;quot;/&amp;amp;gt;
可以看到也是在聚類(lèi)數(shù)為3時(shí)輪廓系數(shù)達(dá)到了峰值,所以最佳聚類(lèi)數(shù)為3
8. Gap Statistic
之前我們提到了WSSE組內(nèi)平方和誤差,該種方法是通過(guò)找“肘點(diǎn)”來(lái)找到最佳聚類(lèi)數(shù),肘點(diǎn)的選擇并不是那么清晰,因此斯坦福大學(xué)的Robert等教授提出了Gap Statistic方法,定義的Gap值為[9]
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/c62dd70be24d437c31a08065d289ac33.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;300&amp;amp;quot; data-rawheight=&amp;amp;quot;72&amp;amp;quot; class=&amp;amp;quot;content_image&amp;amp;quot; width=&amp;amp;quot;300&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/c62dd70be24d437c31a08065d289ac33.png&amp;amp;quot;/&amp;amp;gt;
取對(duì)數(shù)的原因是因?yàn)閃k的值可能很大 通過(guò)這個(gè)式子來(lái)找出Wk跌落最快的點(diǎn),Gap最大值對(duì)應(yīng)的k值就是最佳聚類(lèi)數(shù)
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)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/dd77400b222298012bc677bcc05cb7a8.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;532&amp;amp;quot; data-rawheight=&amp;amp;quot;534&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;532&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-64bd9c3b553db08a095966397e88e26e_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/dd77400b222298012bc677bcc05cb7a8.png&amp;amp;quot;/&amp;amp;gt;
可以看到也是在聚類(lèi)數(shù)為3的時(shí)候gap值取到了最大值,所以最佳聚類(lèi)數(shù)為3
9.層次聚類(lèi)
層次聚類(lèi)是通過(guò)可視化然后人為去判斷大致聚為幾類(lèi),很明顯在共同父節(jié)點(diǎn)的一顆子樹(shù)可以被聚類(lèi)為一個(gè)類(lèi)
h_dist <- dist(as.matrix(dataset)) h_clust<-hclust(h_dist) plot(h_clust, hang = -1, labels = FALSE) rect.hclust(h_clust,3)
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/ff45e8a530a86955edfe5cbe6478c20d.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;529&amp;amp;quot; data-rawheight=&amp;amp;quot;532&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;529&amp;amp;quot; data-original=&amp;amp;quot;https://pic1.zhimg.com/v2-3d1b5ba7f76ce0ff1240ca497a613440_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/ff45e8a530a86955edfe5cbe6478c20d.png&amp;amp;quot;/&amp;amp;gt;
10.clustergram
最后一種算法是Tal Galili[10]大牛自己定義的一種聚類(lèi)可視化的展示,繪制隨著聚類(lèi)數(shù)目的增加,所有成員是如何分配到各個(gè)類(lèi)別的。該代碼沒(méi)有被制作成R包,可以去Galili介紹頁(yè)面 )里面的github地址找到源代碼 跑一遍然后就可以用這個(gè)函數(shù)了,因?yàn)樵创a有點(diǎn)長(zhǎng)我就不放博客里面了,直接放出運(yùn)行代碼的截圖。
clustergram(dataset, k.range = 2:8, line.width = 0.004)
Loading required package: colorspace Loading required package: plyr
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/f31e6e16ca2b9f49e4af337493eb703a.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;527&amp;amp;quot; data-rawheight=&amp;amp;quot;530&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;527&amp;amp;quot; data-original=&amp;amp;quot;https://pic4.zhimg.com/v2-9797f9f7e0288fdf2d034531db315663_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/f31e6e16ca2b9f49e4af337493eb703a.png&amp;amp;quot;/&amp;amp;gt;
隨著K的增加,從最開(kāi)始的兩類(lèi)到最后的八類(lèi),圖肯定是越到后面越密集。通過(guò)這個(gè)圖判斷最佳聚類(lèi)數(shù)目的方法應(yīng)該是看隨著K每增加1,分出來(lái)的線越少說(shuō)明在該k值下越穩(wěn)定。比如k=7到k=8,假設(shè)k=7是很好的聚類(lèi)數(shù),那分成8類(lèi)時(shí)應(yīng)該可能只是某一類(lèi)分成了兩類(lèi),其他6類(lèi)都每怎么變。反應(yīng)到圖中應(yīng)該是有6簇平行線,有一簇分成了兩股,而現(xiàn)在可以看到從7到8,線完全亂了,說(shuō)明k=7時(shí)效果并不好。按照這個(gè)分析,k=3到k=4時(shí),第一股和第三股幾本沒(méi)變,就第二股拆成了2類(lèi),所以k=3是最佳聚類(lèi)數(shù)目
方法匯總與比較
wine數(shù)據(jù)集我們知道其實(shí)是分為3類(lèi)的,以上10種判定方法中:
層次聚類(lèi)和clustergram方法、肘點(diǎn)圖法,需要人工判定,雖然可以得出大致的最佳聚類(lèi)數(shù),但算法本身不會(huì)給出最佳聚類(lèi)數(shù)
除了Affinity propagation (AP) clustering 給出最佳聚類(lèi)數(shù)為15,剩下6種全都是給出最佳聚類(lèi)數(shù)為3
選用上次文本挖掘的矩陣進(jìn)行分析(667*1623)
mclust效果很差,14種模型只有6種有結(jié)果
bclust報(bào)錯(cuò)
SSE可以運(yùn)行
fpc包中的pamk函數(shù)聚成2類(lèi),明顯不行
Calinsky criterion聚成2類(lèi)
Affinity propagation (AP) clustering 聚成28類(lèi),相對(duì)靠譜
輪廓系數(shù)Average silhouette聚類(lèi)2類(lèi)
gap-Statistic跑不出結(jié)果
可見(jiàn)上述方法中有的因?yàn)閿?shù)據(jù)太大不能運(yùn)行,有的結(jié)果很明顯不對(duì),一個(gè)可能是數(shù)據(jù)集的本身的原因(缺失值太多等),但是也告訴了我們?cè)诖_定最佳聚類(lèi)數(shù)目的時(shí)候需要多嘗試幾種方法,并沒(méi)有固定的套路,然后選擇一種可信度較高的聚類(lèi)數(shù)目。 最后再把這10種方法總結(jié)一下:
&amp;amp;lt;img src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/e62c8e97de526716f340c418282308ab.png&amp;amp;quot; data-rawwidth=&amp;amp;quot;534&amp;amp;quot; data-rawheight=&amp;amp;quot;532&amp;amp;quot; class=&amp;amp;quot;origin_image zh-lightbox-thumb&amp;amp;quot; width=&amp;amp;quot;534&amp;amp;quot; data-original=&amp;amp;quot;https://pic3.zhimg.com/v2-d43a3c6a70d48edb2add13722f224ac2_r.png&amp;amp;quot; _src=&amp;amp;quot;https://static.leiphone.com/uploads/new/article/pic/201710/e62c8e97de526716f340c418282308ab.png&amp;amp;quot;/&amp;amp;gt;
參考文獻(xiàn) [1]R語(yǔ)言實(shí)戰(zhàn)第二版 [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:聚類(lèi)算法Affinity Propagation(AP) [8]輪廓系數(shù)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)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知 。