Algorithm 测试聚类算法的最佳方法

Algorithm 测试聚类算法的最佳方法,algorithm,cluster-analysis,hierarchical-clustering,Algorithm,Cluster Analysis,Hierarchical Clustering,测试聚类算法的最佳方法是什么?我正在使用一个带有停止标准的聚集聚类算法。如何测试集群是否正确形成?理想情况下,您拥有某种预集群数据(),并在此基础上测试集群算法的结果。只需将正确分类的数量除以执行的分类总数,即可获得准确度得分 如果你这样做了,那么就真的没有办法评估你的算法。评估一个图可以聚集多少的经验法则(在粗粒度级别上)与“特征值差距”有关。给定一个加权图a,计算特征值并对其排序(这是特征值谱)。当绘制时,如果在某个点的光谱中有一个大的跳跃,则有一个自然的对应块来划分图形 下面是一个示例(在

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

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


如果你这样做了,那么就真的没有办法评估你的算法。

评估一个图可以聚集多少的经验法则(在粗粒度级别上)与“特征值差距”有关。给定一个加权图
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() 

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

如果您了解特定的聚类算法,您可能会做得更好,但以上内容至少有可能从封面上清除明显的bug。

这取决于您想测试什么

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


分层聚类很难在质量方面进行测试,因为它是分层的。诸如兰德指数等常用指标仅对严格划分有效。你可以从分层聚类中得到一个严格的分区,但是你需要确定切割的高度。

除了你谈论的是分类,而不是聚类分析。不,不,当谈论聚类时,tskuzzy是对的-我们只是检查是否有来自同一类的点放在同一个公共聚类中。