ggplot集锦

轮廓系数--【Silhouette Coefficient】

2023-04-17  本文已影响0人  倪桦

轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。最早由 Peter J. Rousseeuw 在 1986 提出。它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

silhouette = sil = \frac {b_i - a_i}{max(a_i,b_i)} , i \in sample\{1,2,..N\}

  • a_i :样本 i 到簇内其它样本的平均距离,反映了簇内不相似度。
  • b_i :样本 i 到最近外簇的距离,b_i = \min(b_{i1},b_{i2},..b_{ij}),j\in cluster\{1,2,..j\},反映了簇间不相似度。

轮廓系数的判断

silhouette 接近 1,说明样本S_i 聚类合理;
silhouette 接近 -1,说明样本S_i 更应该分类到另外的簇;
silhouette 近似 0,说明样本S_i 在两个簇的边界上。

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))
上一篇下一篇

猜你喜欢

热点阅读