测试聚类算法的最佳方法是什么?我正在使用带有停止标准的凝聚聚类算法。如何测试集群是否正确形成?
4 回答
评估一个图可以聚集多少(在粗粒度级别上)的一个好的经验法则与“特征值差距”有关。给定一个加权图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()
这取决于您要测试的内容。
在测试您自己的已知算法实现时,您可能希望将结果与已知良好实现的结果进行比较。
分层聚类很难在质量方面进行测试,因为它是分层的。Rand index 等常用度量仅对严格分区有效。您可以从层次聚类中获得严格的分区,但是您需要固定要切割的高度。
有时,在存在已知且可能显而易见的构造答案的情况下构造输入数据是有用的。对于聚类算法,您可以构建具有 N 个聚类的数据,使得同一聚类中任意两点之间的最大距离小于不同聚类中任意两点之间的最小距离。另一种选择是生成许多不同的数据集,这些数据集可绘制为二维散点图,其中集群显而易见,然后将算法的结果与此结构进行比较,也许将集群移动在一起以查看算法何时无法看到他们。
鉴于您对特定聚类算法的了解,您可能会做得更好,但上述内容可能至少有一些机会从掩护中清除明显的错误。