精华内容
下载资源
问答
  • 聚类效果评估

    2015-05-03 22:22:00
    聚类在数据挖掘领域有很多算法,到底哪个算法效果比较好,根据实际情况应该如何选择哪个算法,是数据分析应该要考虑的问题,简单来说也就是聚类效果评估。 假设一个集合有N篇文章 那么这个集合的集合对就有\[C{2 \...

    聚类在数据挖掘领域有很多算法,到底哪个算法效果比较好,根据实际情况应该如何选择哪个算法,是数据分析应该要考虑的问题,简单来说也就是聚类效果评估。


    假设一个集合有N篇文章

    那么这个集合的集合对就有\[C{2 \choose N}=\frac{N(N-1)}{2}\]个集合对

    • TP:同一类的文章被分到同一个簇
    • TN:不同类的文章被分到不同簇
    • FP:不同类的文章被分到同一个簇
    • FN:同一类的文章被分到不同簇

    Rand Index 度量的正确的百分比: \[ RI = \frac{TP+TN}{TP+FP+FN+TN} \]

    032214164277021.jpg

    \[ TP+FP=C{2 \choose 6}+C{2 \choose 6}+C{2 \choose 6}=40 \]

    \[ TP=C{2 \choose 5}+C{2 \choose 4}+C{2 \choose 3} + C{2 \choose 2}=20 \]

    因此,\[ FP=40-20=20 \]
    同理,
    \[ FN+TN={1 \choose 6} \times {1 \choose 6} +{1 \choose 6} \times {1 \choose 5} +C{1 \choose 6} \times C{1 \choose 5} =96 \]

    \[ FN=C{1 \choose 5} \times C{1 \choose 3}+C{1 \choose 1} \times C{1 \choose 2}+C{1 \choose 1} \times C{1 \choose 4}+C{1 \choose 1} \times C{1 \choose 3}=24 \]

    \[ FP=96-24=72 \]

    同簇
    同类 TP = 20
    不同类 FP = 20

    \[ \textbf{RI}=\frac{20+72}{20+20+24+72}\approx0.68\]

    \[\textbf{Precision}=\frac{TP}{TP+FP} \]

    \[\textbf{Recall}=\frac{TP}{TP+FN} \]

    • \[ \beta>1 \]
    • \[\textbf{F}_\beta=\frac{ (\beta^2+1) \times Recall\times Precision}{ \beta^2 \times Precision+Recall} \]

    \[Precision=\frac{20}{20+20}=0.5 \]

    \[Recall=\frac{20}{20+24} \approx 0.455 \]

    \[F_1=\frac{ 2 \times 0.455 \times 0.5}{0.455 + 0.5} \approx 0.48 \]

    转载于:https://www.cnblogs.com/kerwinpeng/p/4474837.html

    展开全文
  • 聚类效果评估指标

    2021-05-11 17:15:16
    sklearn聚类算法评估方法 之各种系数 那关于GMM高斯聚类该用什么参数呢?GMM方法里可没有各种label和score函数,遇到问题最好还是看官方介绍,尤其是里面的demo,于是在关于GMM模型选择的一篇例子中找到了

    在sklearn的官方文档中,GMM高斯聚类和其他聚类方法是不在同一模块下的。
    在这里插入图片描述
    对于以下这些聚类,文档里给出了具体的评价参数。
    在这里插入图片描述
    Clustering Performance evaluation
    上述链接里有具体的参数计算调用方法。
    这里不一一赘述了,英文阅读有障碍的可以参考这篇博客
    sklearn聚类算法评估方法 之各种系数
    那关于GMM高斯聚类该用什么参数呢?GMM方法里可没有各种label和score函数,遇到问题最好还是看官方介绍,尤其是里面的demo,于是在关于GMM模型选择的一篇例子中找到了评价方法,也就是AIC/BIC准则,具体调用也很简单,model.bic(X)#X为训练数据,model为聚类模型,这里当然就是GMM了。
    Gaussian Mixture Model Selection
    不想看原文的可以看我复制下来的关键原代码

    X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
              .7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]
    
    lowest_bic = np.infty
    bic = []
    n_components_range = range(1, 7)
    cv_types = ['spherical', 'tied', 'diag', 'full']
    for cv_type in cv_types:
        for n_components in n_components_range:
            # Fit a Gaussian mixture with EM
            gmm = mixture.GaussianMixture(n_components=n_components,
                                          covariance_type=cv_type)
            gmm.fit(X)
            bic.append(gmm.bic(X))
            if bic[-1] < lowest_bic:
                lowest_bic = bic[-1]
                best_gmm = gmm
    
    

    if循环里就是找bic值最小的model为best_model,也就是说BIC可以作为高斯聚类模型的选择参数。

    展开全文
  • 聚类效果评估、内部指标(Jaccard系数、FM指数、Rand指数)、外部指标(DB指数、Dunn指数)、轮廓系数(Silhouette Coefficient) 目录 聚类效果评估、内部指标(Jaccard系数、FM指数、Rand指数)、外部指标(DB...

    聚类效果评估、内部指标(Jaccard系数、FM指数、Rand指数)、外部指标(DB指数、Dunn指数)、轮廓系数(Silhouette Coefficient)

    目录

    聚类效果评估、内部指标(Jaccard系数、FM指数、Rand指数)、外部指标(DB指数、Dunn指数)、轮廓系数(Silhouette Coefficient)

    聚类效果评估

    内部指标

    外部指标

    轮廓系数(Silhouette Coefficient)


    聚类效果评估

    聚类性能度量,亦称为聚类“有效性指标”(validity index

    我们希望“物以类聚”,即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同。换言之,聚类结果的“簇内相似度”(intra-cluster similarity高,且“簇间相似度”(inter-cluster similarity)低,这样的聚类效果较好.

    聚类性能度量

    • 外部指标 (external index):将聚类结果与某个“参考模型”(reference model)进行比较。
    • 内部指标 (internal index):直接考察聚类结果而不用任何参考模型。
       

    内部指标

    内部指标包含:Jaccard系数、FM指数、Rand指数

    这三个指标都是在0-1的区间内越大越好

    外部指标

    DB指数、Dunn指数

    DB指数是越大越好、Dunn指数是越小越好

    轮廓系数(Silhouette Coefficient

    轮廓系数(Silhouette Coefficient衡量对象和所属簇之间的相似度——即内聚性(cohesion),以及与其他簇的分离性separation轮廓系数的取值在 [-1, 1] 范围内。Silhouette 值接近 1,说明对象与所属簇之间有密切联系;反之则接近 -1。若某模型中的一个数据簇,生成的基本是比较高的 silhouette 值,说明该模型是合适、可接受的。

     

     

     

    展开全文
  • 我曾在机器学习之聚类算法应用篇中介绍过,聚类算法常使用轮廓系数来评估聚类效果,不过有时候并不是轮廓系数越大越好,如下面两幅图所示,图中的红色虚线表示聚类系数分数: 显然将簇数据设置为2的时候得到的...

    我曾在机器学习之聚类算法应用篇中介绍过,聚类算法常使用轮廓系数来评估聚类效果,不过有时候并不是轮廓系数越大越好,如下面两幅图所示,图中的红色虚线表示聚类系数分数:

    显然将簇数据设置为2的时候得到的轮廓系数最高,达到了0.705分,但是这并不一定是最好的聚类结果,显然在这个测试集中,我们有4个簇。为了将各个簇的轮廓系数以可视化的形式展现出来,辅助决策聚类参数,【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans 中提供了对应的代码,能够绘制上面的可视化图,带有详细注释的代码见最后。

    另外我已经将两份聚类可视化的代码封装,方便调参以及调用。

    cluster_algos.py

    第一份代码是做各个聚类算法对比的cluster_algos.py:

    # 不同聚类算法结果对比
    from sklearn.datasets import make_circles
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
    from sklearn.metrics import silhouette_score, silhouette_samples
    from sklearn.decomposition import PCA
    import pandas as pd
    import time
    import functools
    
    
    def time_cost(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            t0 = time.time()
            func(*args, **kwargs)
            t1 = time.time()
            print(args[0],':%.2fs' % (t1 - t0))
            return func(*args, **kwargs), t1 - t0
    
        return wrapper
    
    
    def load_data(file):
        assert file != ''
        df = pd.read_csv(file)
        x = df.values
        pca = PCA(n_components=2)
        pca_result = pca.fit_transform(x)
        return x, pca_result
        
        
    @time_cost
    def cluster_function(model_name, model, data):
        y_pred = model.fit_predict(data)
        return y_pred
    
    
    if __name__ == '__main__':
        
        model_list = {
            "AgglomerativeClustering": AgglomerativeClustering(n_clusters = 4),
            "KMeans": KMeans(n_clusters = 4, random_state=10),
            "DBSCAN": DBSCAN(eps=0.1),
            "Birch": Birch(n_clusters=4),
            "SpectralClustering": SpectralClustering(n_clusters = 4, random_state=10),
            "MeanShift": MeanShift()
        }
    
        x, pca_result = load_data('./data.csv')
    
        i = 1
        fig = plt.figure(figsize=(15,10))
        for model in model_list:
            fig.add_subplot(2,3,i)
            result = cluster_function(model, model_list[model], x)
            plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=result[0])
            plt.title("{}({})".format(model, silhouette_score(x, result[0])))
            plt.text(.99, .01, ('%.2fs' % (result[1])).lstrip('0'), transform=plt.gca().transAxes, horizontalalignment='right')
            i += 1
        plt.show()

    其生成结果如下图所示:

     

    clusters_test

    第二份代码用于测试给定聚类算法情况下簇的个数的选择对结果的影响

    # 不同簇个数聚类结果对比
    from sklearn.datasets import make_circles
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
    from sklearn.metrics import silhouette_score, silhouette_samples
    from sklearn.decomposition import PCA
    import pandas as pd
    import time
    import functools
    import matplotlib.cm as cm
    
    
    def cluster_test(model_name, model, X, clusters_list = [2,3,4,5,6,7]):
        for n_clusters in clusters_list:
            if hasattr(model, "n_clusters"):
                model.set_params(n_clusters = n_clusters)
            elif len(clusters_list) >= 2 and n_clusters == clusters_list[1]:
                print("{} do not have parameter 'n_clusters', return automatically.".format(model_name))
                return
            
            fig, (ax1, ax2) = plt.subplots(1, 2)
            fig.set_size_inches(18, 7)
    
            ax1.set_xlim([-0.1, 1])
            ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
    
            clusterer, t = cluster_function(model_name, model, X)
            cluster_labels = clusterer.labels_
            silhouette_avg = silhouette_score(X, cluster_labels)
            print("For n_clusters = ", n_clusters, " the average silhoutte_score is ", silhouette_avg)
            sample_silhouette_values = silhouette_samples(X, cluster_labels)
    
            y_lower = 10
            for i in range(n_clusters):
                ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
                ith_cluster_silhouette_values.sort()
                size_cluster_i = ith_cluster_silhouette_values.shape[0]
                y_upper = y_lower + size_cluster_i
                color = cm.nipy_spectral(float(i) / n_clusters)
    
                ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor = color, alpha = 0.7)
                ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
                y_lower = y_upper + 10
    
            ax1.set_title("The silhouette plot for the various clusters")
            ax1.set_xlabel("The silhouette coefficient values")
            ax1.set_ylabel("Cluster label")
            ax1.axvline(x = silhouette_avg, color = 'red', linestyle = "--")
            ax1.set_yticks([])
            ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
            
            colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
            ax2.scatter(pca_result[:,0], pca_result[:,1], marker = 'o', s = 8, c = colors)
            if hasattr(clusterer, 'cluster_centers_'):
                centers = clusterer.cluster_centers_
                ax2.scatter(centers[:, 0], centers[:, 1], marker = 'x', c = 'red', alpha = 1, s = 200)
            ax2.text(.99, .01, ('%.2fs' % (t)).lstrip('0'), transform=plt.gca().transAxes, size=12,horizontalalignment='right')
            ax2.set_title("The visualization of the clustered data")
            ax2.set_xlabel("Feature space for the 1st feature")
            ax2.set_ylabel("Feature space for the 2nd feature")
    
            plt.suptitle("Silhouette analysis for {} clustering on sample data with n_clusters = {} ({})".format(model_name, n_clusters, silhouette_avg), fontsize = 14, fontweight="bold")
            plt.show()
    
            
    def time_cost(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            t0 = time.time()
            func(*args, **kwargs)
            t1 = time.time()
            return func(*args, **kwargs), t1 - t0
        return wrapper
    
    
    @time_cost
    def cluster_function(model_name, model, data):
        model = model.fit(data)
        return model
    
    
    def load_data(file):
        assert file != ''
        df = pd.read_csv(file)
        x = df.values
        pca = PCA(n_components=2)
        pca_result = pca.fit_transform(x)
        return x, pca_result
    
    
    # 加载数据
    x, pca_result = load_data('data.csv')
    
    cluster_test("AgglomerativeClustering", AgglomerativeClustering(), x)

     

    绘图代码详细解释

    此原始代码来自【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans

    import numpy as np
    import matplotlib.cm as cm
    from sklearn.metrics import silhouette_score, silhouette_samples
    from sklearn.datasets import make_blobs
    from sklearn.cluster import KMeans
    
    X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state = 1)
    
    for n_clusters in [2,3,4,5,6,7]:
        n_clusters = n_clusters
        
        # 创建画布,画布上共有一行两列两个子图
        fig, (ax1, ax2) = plt.subplots(1, 2)
        
        # 画布尺寸
        fig.set_size_inches(18, 7)
        
        ax1.set_xlim([-0.1, 1])
        ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
        
        # 聚类
        clusterer = KMeans(n_clusters = n_clusters, random_state = 10).fit(X)
        cluster_labels = clusterer.labels_
        
        # 使用轮廓系数分数
        silhouette_avg = silhouette_score(X, cluster_labels)
        print("For n_clusters = ", n_clusters, " the average silhoutte_score is ", silhouette_avg)
        
        # 调用silhouette_samples,返回每个样本点的轮廓系数,这就是我们的横坐标
        sample_silhouette_values = silhouette_samples(X, cluster_labels)
        
        # 设定y轴上的初始取值
        y_lower = 10
        
        # 对每一个簇进行循环
        for i in range(n_clusters):
            # 从每个样本的轮廓系数中抽取出第i个簇的轮廓系数,并对他进行排序
            ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
            
            # 排序
            ith_cluster_silhouette_values.sort()
            
            # 查看这个簇中有多少个样本
            size_cluster_i = ith_cluster_silhouette_values.shape[0]
            
            # 这一个簇在y轴上从上往下画图的起点
            y_upper = y_lower + size_cluster_i
            
            # colormap库中的,使用小数来调用颜色的函数
            color = cm.nipy_spectral(float(i) / n_clusters)
                
            ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor = color, alpha = 0.7)
    
            # 为每个簇的轮廓系数写上簇的编号
            ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
    
            # 为下一个簇计算新的y周上的初始值
            y_lower = y_upper + 10
            
        # 给图1加上标题
        ax1.set_title("The silhouette plot for the various clusters")
        ax1.set_xlabel("The silhouette coefficient values")
        ax1.set_ylabel("Cluster label")
    
        # 把整个数据集上的轮廓系数的均值以虚线的形式放入我们的图中
        ax1.axvline(x = silhouette_avg, color = 'red', linestyle = "--")
    
        # 让y轴不显示任何刻度
        ax1.set_yticks([])
    
        # 设置x轴刻度
        ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
    
        # 开始对第二个图进行处理
        colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
    
        ax2.scatter(X[:,0], X[:,1], marker = 'o', s = 8, c = colors)
    
        # 把生成的质心放到图像中去
        centers = clusterer.cluster_centers_
        ax2.scatter(centers[:, 0], centers[:, 1], marker = 'x', c = 'red', alpha = 1, s = 200)
    
        # 为图二设置标题
        ax2.set_title("The visualization of the clustered data")
        ax2.set_xlabel("Feature space for the 1st feature")
        ax2.set_ylabel("Feature space for the 2nd feature")
            
        # 为整个图设置标题
        plt.suptitle("Silhouette analysis for KMeans clustering on sample data with n_clusters = {}".format(n_clusters), fontsize = 14, fontweight="bold")
        plt.show()

     (完)

    展开全文
  • https://zhuanlan.zhihu.com/p/145856959
  • 机器学习:k-means聚类效果评估

    万次阅读 2019-02-22 20:45:31
    今天查阅了各种同学的分享,太多了,就不给出链接了,对聚类算法的评估,我筛选了下面三种方法 第一种 SSE 样本距离最近的聚类中心的距离总和 (簇内误差平方和) 只对单个族中的数据分析,族与族之间的关系没有涉及...
  • 轮廓系数前言是什么?为什么?由此可得:怎么用?不适用示例 前言 在机器学习中,无监督学习...K值的选择至关重要,选择的好可以有较好的聚类效果。 通常情况下,K值的选择人们会根据先验的知识给定一个估计的值,或
  • 什么是轮廓系数? 参见百度百科,讲的很清楚此处不赘述; ...核心问题: 这个计算方法的复杂度是多少? O(N^2) 其中N为样本数量;...这个复杂度对于spark分布式大数据处理而言,是不可接受的,所以怎么办呢?...
  • 聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。我们事先并不知道数据的正确结果(类标),通过聚类算法来发现和挖掘数据本身的结构信息,对数据进行...
  • tslearn和sklearn一样,是一款优秀的机器学习框架,tslearn更偏向于处理时间序列问题,如其聚类模块就包含了DTW(Dynamic Time Warping)等算法及变种,也提供了轮廓系数对聚类效果评估,十分方便。但可惜,tslearn...
  • 导航效果评估综述轮廓系数互信息参考文章 效果评估综述   这里直接贴上 聚类算法初探(七)聚类分析的效果评测   它摘自于中国科学院计算技术研究所周昭涛的硕士论文《文本聚类分析效果评价及文本表示研究》的...
  • 谱聚类和计算轮廓系数评估聚类效果代码 matlab,可以提供借鉴参考
  • 4.4 聚类分析评估

    2020-07-22 15:44:21
    在度量聚类中簇的你和邢,可以计算所有对象轮廓系数的平均值,轮廓系数越接近于1,聚类效果越好 聚类 当你在山上徒步旅行时,你偶然发现了一种你从未见过的植物。你环顾四周,发现了更多。它们不完全相同,但它们...
  • 最近进行了一些聚类的学习,需要对聚类效果进行评估,用python进行了简单的DBI实现,给自己做一个小的记录。 DBI的理论知识见:http://blog.sina.com.cn/s/blog_65c8baf901016flh.html ```python import math ...
  • 高维数据的聚类分析 高维聚类研究方向 高维数据聚类的难点在于:  1、适用于普通集合的聚类算法,在高维数据集合中效率极低  2、由于高维空间的稀疏性以及最近邻特性,高维的空间中基本不存在数据簇。 在高维...
  • 定量评估聚类效果

    千次阅读 2018-08-22 11:24:54
    如果有了类别标签,那么聚类结果也可以像分类那样计算准确率和召回率。但是不应该将分类标签作为聚类结果的评价指标,除非你有相关的先验知识或某种假设,知道这种分类类内差距更小。但是它还是给出了几种评价标准。...
  • 聚类评估:轮廓系数 计算样本到同簇其他样本的平均距离ai, ai越小,说明样本越应该被聚类到该簇 计算样本到其他簇样本的平均距离bi,这个称为样本与簇Cj的不相似度 s(i) = (b(i) - a(i)) / max(b(i), a(i)) si ...
  • 聚类评估指标

    千次阅读 2019-09-26 08:27:36
    参考:https://github.com/chrisPiemonte/url2vec/blob/master/notebooks/embedding.ipynb
  • 当不知道ground truth labels时,需要内部度量来评估聚类算法的性能。...取值范围为(-1,1),系数越大,聚类效果越好; metrics.silhouette_score(X, labels, metric=‘euclidean’); 基于某个样本点与同一簇中...
  • 本文提出一种高效的聚类模块和一种新颖的聚类质量评估模块
  • 聚类性能评估一、综述二、Rand index(兰德指数)(RI) 、Adjusted Rand index(调整兰德指数)(ARI)三、Silhouette Coefficient(轮廓系数)(s(i))四、建模实例参考文献: 一、综述 聚类性能度量亦称聚类“有效性指标”...
  • 7.9 聚类模型评估

    万次阅读 2017-06-29 22:09:31
    如果有了类别标签,那么聚类结果也可以像分类那样计算准确率和召回率。但是不应该将分类标签作为聚类结果的评价指标,除非你有相关的先验知识或某种假设,知道这种分类类内差距更小。但是它还是给出了几种评价标准。...
  • 聚类质量评估指标

    2018-03-15 17:48:55
    这个计算简单直接,得到的Calinski-Harabasz分数值ss越大则聚类效果越好。Calinski-Harabasz分数值ss的数学计算公式是(理论介绍来源于:用scikit-learn学习K-Means聚类):  也就是说,类别内部数据的协方差越...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,040
精华内容 6,416
关键字:

聚类效果的评估