测试聚类算法的最佳方法是什么?我正在使用具有停止标准的凝聚聚类算法。如何测试簇是否正确形成?
答案 0 :(得分: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()
答案 1 :(得分:2)
这取决于你要测试的 。
在测试您自己的已知算法实现时,您可能希望将结果与已知良好实现的结果进行比较。
分层聚类很难在质量方面进行测试,因为它是分层的。诸如Rand索引等常用度量仅对严格分区有效。您可以从层次聚类中获得严格的分区,但是您需要修改高度以进行切割。
答案 2 :(得分:1)
理想情况下,您拥有某种预聚类数据(supervised learning)并在其上测试聚类算法的结果。只需计算正确分类的数量除以为获得准确性分数而执行的分类总数。
如果您正在执行unsupervised learning,则无法评估您的算法。
答案 3 :(得分:1)
构造输入数据有时很有用,其中有一个已知的,也许是显而易见的构造答案。对于聚类算法,您可以构造具有N个聚类的数据,使得同一聚类中任意两个点之间的最大距离小于不同聚类中任意两个点之间的最小距离。另一种选择是生成许多不同的数据集,可以绘制为二维散点图,其中集群显而易见,然后将算法的结果与此结构进行比较,也许将集群移动到一起以查看算法何时无法看到它们。
您可以在了解特定聚类算法的情况下做得更好,但上述内容可能至少有可能从掩盖中清除明显的错误。