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官方文档

  • 相关阅读:
    第32周二
    第32周一
    第31周日
    第31周六
    第31周五
    第31周四
    第31周三
    C++中this指针的使用方法.
    ArcPad 10 的安装部署
    UEditor用法
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/10892308.html
Copyright © 2011-2022 走看看