【问题标题】:Best way to test a clustering algorithm测试聚类算法的最佳方法
【发布时间】:2012-05-03 22:46:11
【问题描述】:

测试聚类算法的最佳方法是什么?我正在使用带有停止标准的凝聚聚类算法。如何测试集群是否正确形成?

【问题讨论】:

    标签: algorithm cluster-analysis hierarchical-clustering


    【解决方案1】:

    理想情况下,您拥有某种预先聚类的数据 (supervised learning),并在此基础上测试聚类算法的结果。只需计算正确分类的数量除以执行的分类总数即可获得准确度分数。

    如果你在做unsupervised learning,那么真的没有办法评估你的算法。

    【讨论】:

    • 除了你说的是分类,不是聚类分析。
    • 不不,当谈到集群时,tskuzzy 是对的——我们只是检查是否有来自同一类的点放在同一个公共集群中。
    【解决方案2】:

    评估图可以聚集多少(在粗粒度级别上)的一个好的经验法则与“特征值差距”有关。给定一个加权图A,计算特征值并对它们进行排序(这是特征值谱)。绘制时,如果频谱在某个点有较大的跳跃,则有一个自然对应的块来划分图形。

    下面是一个示例(在 numpy python 中),它显示,给定一个几乎块对角矩阵,在块数处特征值谱中有很大的差距(由代码中的 c 参数化)。请注意,矩阵排列(与标记图节点相同)仍然给出相同的光谱间隙:

    from numpy import *
    import pylab as plt
    
    # Make a block diagonal matrix
    N = 30
    c = 5
    A = zeros((N*c,N*c))
    for m in xrange(c):
        A[m*N:(m+1)*N, m*N:(m+1)*N] = random.random((N,N))
    
    # Add some noise
    A += random.random(A.shape) * 0.1
    
    # Make symmetric
    A += A.T - diag(A.diagonal())
    
    # Show the original matrix
    plt.subplot(131)
    plt.imshow(A.copy(), interpolation='nearest')
    
    # Permute the matrix for effect
    idx = random.permutation(N*c)
    A = A[idx,:][:,idx]
    
    # Compute eigenvalues
    L = linalg.eigvalsh(A)
    
    # Show the results
    plt.subplot(132)
    plt.imshow(A, interpolation='nearest')
    plt.subplot(133)
    plt.plot(sorted(L,reverse=True))
    
    plt.plot([c-.5,c-.5],[0,max(L)],'r--')
    
    plt.ylim(0,max(L))
    plt.xlim(0,20)
    plt.show() 
    

    【讨论】:

      【解决方案3】:

      在存在已知且可能显而易见的构造答案的情况下构造输入数据有时很有用。对于聚类算法,您可以构建具有 N 个聚类的数据,使得同一聚类中任意两点之间的最大距离小于不同聚类中任意两点之间的最小距离。另一种选择是生成许多不同的数据集,这些数据集可绘制为二维散点图,其中集群显而易见,然后将算法的结果与此结构进行比较,也许将集群移动在一起以查看算法何时无法看到他们。

      鉴于您对特定聚类算法的了解,您可能会做得更好,但上述方法至少有一些机会从掩护中清除明显的错误。

      【讨论】:

        【解决方案4】:

        这取决于您要测试的

        在测试您自己的已知算法实现时,您可能希望将结果与已知良好实现的结果进行比较。

        分层聚类很难在质量方面进行测试,因为它是分层的。 Rand 索引等常用度量仅对严格分区有效。您可以从层次聚类中获得严格的分区,但是您需要固定要切割的高度。

        【讨论】:

          猜你喜欢
          • 2016-06-10
          • 2012-07-22
          • 2018-08-12
          • 2015-10-01
          • 2019-10-14
          • 1970-01-01
          • 2022-09-27
          • 2019-08-06
          • 1970-01-01
          相关资源
          最近更新 更多