轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。最早由 Peter J. Rousseeuw 在 1986 提出。它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。
- :样本 到簇内其它样本的平均距离,反映了簇内不相似度。
- :样本 到最近外簇的距离,,反映了簇间不相似度。
轮廓系数的判断
接近 1,说明样本 聚类合理;
接近 -1,说明样本 更应该分类到另外的簇;
近似 0,说明样本 在两个簇的边界上。
R code
#### Build hclust Tree
hc_dist <- amap::Dist(counts)
hc_tree <- amap::hcluster(counts, method = "euclidean",link = "ward")
#### dynamic—clustering ; deepSplit 控制聚类精度
memb <- dynamicTreeCut::cutreeDynamic(hc_tree,
distM = as.matrix(hc_dist),
deepSplit = .5, minClusterSize = 1)
### 计算当前分簇的轮廓系数,合并不理想的簇到最近的簇
memb <- cluster::silhouette(memb, dist = hc_dist) %>% data.frame() %>%
mutate(across(1:2,.fns = as.character)) %>%
group_by(cluster) %>% mutate(avg_sil = mean(sil_width)) %>%
mutate(cluster_adj = ifelse(avg_sil < 0 ,
yes = as.numeric(names(which.max(table(neighbor)))),
no = as.numeric(cluster))) %>%
ungroup() %>% pull(cluster_adj)
if(F) plot(cluster::silhouette(memb, dist = hc_dist))
网友评论