zoukankan      html  css  js  c++  java
  • sklearn聚类评价指标

    sklearn中的指标都在sklearn.metric包下,与聚类相关的指标都在sklearn.metric.cluster包下,聚类相关的指标分为两类:有监督指标和无监督指标,这两类指标分别在sklearn.metric.cluster.supervised和sklearn.metric.cluster.unsupervised包下。聚类指标大部分都是有监督指标,无监督指标较少。
    无监督指标和有监督指标应该充分配合起来:无监督指标很好,有监督指标很差,表明这个问题可能不是单靠聚类就能解决的;无监督指标很差,有监督指标很好,表明有监督指标很可能是不靠谱的,数据标注有问题。

    sklearn.metric.cluster.__init__.py把所有的聚类指标都引入进来了。
    实际上,sklearn.metric包把cluster下的指标全部引进来了,所以可以直接使用sklearn.metric而不必关心sklearn.metric.cluster.

    from .supervised import adjusted_mutual_info_score
    from .supervised import normalized_mutual_info_score
    from .supervised import adjusted_rand_score
    from .supervised import completeness_score
    from .supervised import contingency_matrix
    from .supervised import expected_mutual_information
    from .supervised import homogeneity_completeness_v_measure
    from .supervised import homogeneity_score
    from .supervised import mutual_info_score
    from .supervised import v_measure_score
    from .supervised import fowlkes_mallows_score
    from .supervised import entropy
    from .unsupervised import silhouette_samples
    from .unsupervised import silhouette_score
    from .unsupervised import calinski_harabaz_score
    from .bicluster import consensus_score
    

    预备知识

    在了解这些聚类指标前,需要一些预备知识才能读懂代码。

    COO

    稀疏矩阵的一种格式,保存行、列、数三项。

    contingency_matrix共现矩阵

    from sklearn import metrics
    from sklearn.metrics.cluster.supervised import contingency_matrix
    
    labels_true = np.array([0, 2, 2, 3, 2, 1])
    labels_pred = np.array([0, 2, 2, 2, 1, 2])
    contingency = contingency_matrix(labels_true, labels_pred, sparse=True)
    

    输出为
    [[1 0 0]
    [0 0 1]
    [0 1 2]
    [0 0 1]]

    共现矩阵行数等于实际类别数,列数等于聚类个数,第i行第j列的值表示实际类别为i的元素有多少个被当做聚类类别为j。

    AdjustedRandIndex调整兰德系数

    调整之意是:$score=frac{x-E(x)}{max(x)-E(x)}$
    兰德系数是一种指标,互信息是一种指标,经过调整得到调整兰德系数和调整互信息两种指标。
    调整的意义在于:对于随机聚类,分值应该尽量低。

    import numpy as np
    from scipy.misc import comb
    from sklearn import metrics
    from sklearn.metrics.cluster.supervised import contingency_matrix
    
    labels_true = np.array([0, 2, 2, 3, 2, 1])
    labels_pred = np.array([0, 2, 2, 2, 1, 2])
    score = metrics.cluster.adjusted_rand_score(labels_true, labels_pred)
    print(score)
    n_samples = labels_true.shape[0]
    n_classes = np.unique(labels_true).shape[0]
    n_clusters = np.unique(labels_pred).shape[0]
    contingency = contingency_matrix(labels_true, labels_pred, sparse=True)
    print(contingency.todense())
    sum_comb_c = sum(comb(n_c, 2) for n_c in np.ravel(contingency.sum(axis=1)))
    sum_comb_k = sum(comb(n_k, 2) for n_k in np.ravel(contingency.sum(axis=0)))
    sum_comb = sum(comb(n_ij, 2) for n_ij in contingency.data)
    prod_comb = (sum_comb_c * sum_comb_k) / comb(n_samples, 2)
    mean_comb = (sum_comb_k + sum_comb_c) / 2.
    score = (sum_comb - prod_comb) / (mean_comb - prod_comb)
    print(score)
    

    silhouette_score

    silhouette_score是一种无监督聚类指标。
    $$silhouette_sample_score=frac{b-a}{max(a,b)}$$
    a表示样本的最小类内距离,b表示样本的最小类间距离。
    silhouette_samples函数用于计算每个样本的silhouette分值,silhouette_score就是各个样本分值的平均值。

    参考资料

    https://blog.csdn.net/howhigh/article/details/73928635
    sklearn官方文档

  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/10892308.html
Copyright © 2011-2022 走看看