美文网首页人工智能工程师
聚类算法模型评估

聚类算法模型评估

作者: longsan0918 | 来源:发表于2019-01-26 14:15 被阅读14次

    ● 混淆矩阵
    ● 均一性
    ● 完整性
    ● V-measure
    ● 调整兰德系数(ARI)
    ● 调整互信息(AMI)
    ● 轮廓系数(Silhouette)

    1、均一性

    均一性:一个簇中只包含一个类别的样本,则满足均一性;其实也可以认为就是正确率(每个聚簇中正确分类的样本数占该聚簇总样本数的比例和);

    image
    2、完整性

    完整性:同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占类型的总样本数比例的和。

    image image
    3、V-measure

    V-measure:均一性和完整性的加权平均。

    image
    4、调整兰德系数(ARI)

    Rand index(兰德指数)(RI),RI取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。

    其中C表示实际类别信息,K表示聚类结果,a表示在C与K中都是同类别的元素对数,b表示在C与K中都是不同类别的元素对数,C2N samples 表示数据集中可以组成的对数。

    image image

    调整兰德系数(ARI,Adjusted Rnd Index),ARI取值范围[-1,1],值越大,表示聚类结果和真实情况越吻合。从广义的角度来将,ARI是衡量两个数据分布的吻合程度的。

    image image
    5、调整互信息(AMI)

    调整互信息(AMI,Adjusted Mutual Information) 类似ARI,内部使用信息熵。

    image
    6、轮廓系数

    簇内不相似度:计算样本i到同簇其它样本的平均距离为ai;ai越小,表示样本i越应该被聚类到该簇,簇C中的所有样本的ai的均值被称为簇C的簇不相似度。

    簇间不相似度:计算样本i到其它簇Cj的所有样本的平均距离bij,i=min{bi1,bi2,...,bik};bi越大,表示样本i越不属于其它簇。

    轮廓系数: si值越接近1表示样本i聚类越合理,越接近-1,表示样本i应该分类到另外的簇中,近似为0,表示样本i应该在边界上;所有样本的si的均值被成为聚类结果的轮廓系数。

    image
    # -*- coding: utf-8 -*-
    # @Time    : 2019/1/26 10:50 AM
    # @Author  : scl
    # @Email   : 1163820757@qq.com
    # @File    : K-Means算法和Mini Batch K-Means算法效果评估.py (了解即可)
    # @Software: PyCharm
    
    import matplotlib
    matplotlib.use("TkAgg")
    import time
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from sklearn.cluster import MiniBatchKMeans, KMeans
    from sklearn import metrics
    from sklearn.metrics.pairwise import pairwise_distances_argmin
    from sklearn.datasets.samples_generator import make_blobs
    import warnings
    
    warnings.filterwarnings("ignore", category=FutureWarning)
    
    ## 设置属性防止中文乱码
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    
    
    centers = [[1,1],[-1,-1],[1,-1]]
    clusters = len(centers)
    
    X,Y = make_blobs(n_samples=3000,centers=centers,cluster_std=0.5,random_state=12)
    
    
    '''
     目的: 比较k-means算法和mini-batch k-means算法耗时
    
     结果: k-means算法消耗时间:0.0700s
          Mini Batch K-Means算法消耗时间:0.0160s
    '''
    k_means = KMeans(init='k-means++',n_clusters=clusters,random_state=12)
    tkbt = time.time()
    k_means.fit(X)
    kmt = time.time()-tkbt
    print('k-means算法消耗时间:%.4fs'%kmt)
    
    batch_size = 1000
    mbk_means = MiniBatchKMeans(init='k-means++',n_clusters=clusters,
                                batch_size=batch_size,random_state=12)
    mbbt = time.time()
    mbk_means.fit(X)
    mbt = time.time()-mbbt
    print('Mini Batch K-Means算法消耗时间:%.4fs'%mbt)
    
    
    '''
      目的:输出样本所属的类别
    
      [0 2 2 ... 2 1 0]
      [1 2 2 ... 2 0 1]
    
    '''
    km_y_hat = k_means.labels_
    mbkm_y_hat = mbk_means.labels_
    print(km_y_hat)
    print(mbkm_y_hat)
    
    '''
     目的: 聚类算法聚类中心
    '''
    k_means_cluster_centers = k_means.cluster_centers_
    mb_means_cluster_centers = mbk_means.cluster_centers_
    print('k-means算法聚类中心点%s'%k_means_cluster_centers)
    print('Mini Batch K-Means算法聚类中心点%s'%mb_means_cluster_centers)
    order = pairwise_distances_argmin(k_means_cluster_centers,mb_means_cluster_centers)
    # 计算X中每个样本与k_means_cluster_centers中的哪个样本最近。也就是获取所有对象的所属的类标签
    print(order)
    
    
    #### 示例代码展示
    '''
     目的: 模型效果评估
    
     结果: k-means算法:adjusted_rand_score评估函数
          计算的评估结果值:0.9181
        耗时时间:0.001
        Mini Batch K-Means算法:adjusted_rand_score评估函数
        计算的评估结果值:0.9173
        耗时时间:0.001
    
    
        k-means算法:v_measure_score评估函数
        计算的评估结果值:0.8754
        耗时时间:0.001
        Mini Batch K-Means算法:v_measure_score评估函数
        计算的评估结果值:0.8745
        耗时时间:0.001
    
    
        k-means算法:adjusted_mutual_info_score评估函数
        计算的评估结果值:0.8753
         耗时时间:0.003
        Mini Batch K-Means算法:adjusted_mutual_info_score评估函数
        计算的评估结果值:0.8744
        耗时时间:0.003
    
    
        k-means算法:mutual_info_score评估函数
        计算的评估结果值:0.9617
         耗时时间:0.001
        Mini Batch K-Means算法:mutual_info_score评估函数
        计算的评估结果值:0.9608
        耗时时间:0.001
    
    '''
    score_funcs = [
        metrics.adjusted_rand_score,#ARI
        metrics.v_measure_score,#均一性和完整性的加权平均
        metrics.adjusted_mutual_info_score,#AMI
        metrics.mutual_info_score,#互信息
    ]
    
    # 迭代对每个评估函数进行评估操作
    for score_func in score_funcs:
        t0 = time.time()
        km_scores = score_func(Y,km_y_hat)
        print('k-means算法:%s评估函数\n计算的评估结果值:%.4f\n 耗时时间:%.3f'%
              (score_func.__name__,km_scores,time.time()-t0))
    
    
    
        t0 = time.time()
        mbkm_scores = score_func(Y,mbkm_y_hat)
        print('Mini Batch K-Means算法:%s评估函数\n 计算的评估结果值:%.4f\n 耗时时间:%.3f'
              %(score_func.__name__,mbkm_scores,time.time()-t0))
    
        print('\n')
    
    
    '''
      目的 使用轮廓系数评估模型
    
      轮廓系数:越接近1表示样本i聚类越合理 越接近-1 样本i越属于另外的簇  近似等于0 表示样本i在簇的边界上
    
      结果: K-Means算法的轮廓系数指标 (簇中心:3个):0.9617
           Mini Batch K-means轮廓系数指标:0.9608
    '''
    km_score = metrics.silhouette_score(X,km_y_hat)
    mbkm_score = metrics.silhouette_score(X,mbkm_y_hat)
    
    print('K-Means算法的轮廓系数指标 (簇中心:%d个):%.4f'%(clusters,km_scores))
    print('Mini Batch K-means轮廓系数指标:%.4f'%(mbkm_scores))
    
    

    相关文章

      网友评论

        本文标题:聚类算法模型评估

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