美文网首页ggplot集锦
轮廓系数--【Silhouette Coefficient】

轮廓系数--【Silhouette Coefficient】

作者: 倪桦 | 来源:发表于2023-04-17 11:04 被阅读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))
    

    相关文章

      网友评论

        本文标题:轮廓系数--【Silhouette Coefficient】

        本文链接:https://www.haomeiwen.com/subject/idxcjdtx.html