1.最佳分類個數
# 輔助確定最佳聚類數 4.7*2.6
factoextra::fviz_nbclust( t(DPAU_2), kmeans, method = "silhouette")
在2有下降拐點,但是樣本較多時分成2類一般意義不大。
在7時也有下降拐點。
2.查看每個分類的輪廓系數
(1) pam k=5
library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=5){
pdf( paste0(outputRoot, keyword, "_01_2.K_means.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
plot(silhouette(pamclu), col = (1+ head(df1, n=nrow(df1)) |> as.data.frame() |> pull("cluster")),main=NULL)
dev.off()
}
Fig1. Silhouette plot displaying the composition (n = number of samples) and stability (average width) of clustering.
(2) pam k=6
library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=6){
pdf( paste0(outputRoot, keyword, "_01_2.K_means.6.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
plot(silhouette(pamclu), col = (1+ head(df1, n=nrow(df1)) |> as.data.frame() |> pull("cluster")),main=NULL)
dev.off()
}
(3) pam k=7
library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=7){
pdf( paste0(outputRoot, keyword, "_01_2.K_means.7.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
df1=head(df1, n=nrow(df1)) |> as.data.frame()
plot(silhouette(pamclu), col = df1$cluster +1,#xlim=c(min(df1$sil_width)-0.2, max(df1$sil_width))+0.2,main=NULL)
dev.off()
}
(4) kmeans k=5
dat=DPAU_2
kclu=kmeans(t(dat), centers=5)#kclu$clustering=kclu$cluster #add this list element: clustering
distance=dist( t(dat) ) #10min
kclu.sil=sortSilhouette( silhouette(kclu$cluster, dist = distance ) )
#rownames(kclu.sil)=colnames(dat)
head(kclu.sil)
# cluster neighbor sil_width
#1226 1 2 0.1124117
#991 1 2 0.1113240
pdf( paste0(outputRoot, keyword, "_01_2.K_means.5.silhouette.pdf"), width=6, height=5)
df1=kclu.sil
df1=head(df1, n=nrow(df1)) |> as.data.frame()
plot(kclu.sil, col = rev(df1$cluster+1),do.col.sort=F,main=NULL)factoextra::fviz_silhouette(kclu.sil)
dev.off()
(5) hclust, k=4
dat=DPAU_2
distance=dist( t(dat) )
out.hclust=hclust(distance, method = "ward.D2")# visual
pdf( paste0(outputRoot, keyword, "_01_2.hclust.4.silhouette.pdf"), width=6, height=5)
plot(out.hclust,#hang = -1,#hang=0.1,hang=0,ann=F, axes=F, labels = F, #no labelscex = 0.7,col = "grey20")
rect.hclust( out.hclust, k=4, border = c("#FF6B6B", "#4ECDC4", "#556270", "deeppink") )
# sil plot
out.hclust.D2=cutree(out.hclust, k=4)
sil_hclust=sortSilhouette(silhouette(out.hclust.D2, distance))
rownames(sil_hclust) = rownames(as.matrix(distance))[attr(sil_hclust, 'iOrd')]
#
plot(sil_hclust, col=out.hclust.D2[rownames( head(sil_hclust, n=nrow(sil_hclust)) )]+1,main=attr(sil_hclust, "call") |> deparse() )
dev.off()
3. 輪廓系數的解釋
輪廓系數(Silhouette Coefficient),是聚類效果好壞的一種評價方式。最早由 Peter J. Rousseeuw 在 1986 提出。 它結合內聚度和分離度兩種因素。可以用來在相同原始數據的基礎上用來評價不同算法、或者算法不同運行方式對聚類結果所產生的影響。
- 內聚度可以理解為反映一個樣本點與類內元素的緊密程度。
- 分離度可以理解為反映一個樣本點與類外元素的緊密程度。
對于一個樣本集合,它的輪廓系數是所有樣本輪廓系數的平均值。
- 當a(i)<b(i)時,即類內的距離小于類間距離,則聚類結果更緊湊。S的值會趨近于1。越趨近于1代表輪廓越明顯。
- 相反,當a(i)>b(i)時,類內的距離大于類間距離,說明聚類的結果很松散。S的值會趨近于-1,越趨近于-1則聚類的效果越差。
- 輪廓系數S的取值范圍為[-1, 1],輪廓系數越大聚類效果越好。
Ref:
- https://baike.baidu.com/item/輪廓系數/17361607
- https://pubmed.ncbi.nlm.nih.gov/32929364/