3

我正在使用 OpenCV 的 python 接口对多维数据(通常为 7 维)进行 K-Means 聚类。我得到了集群的奇怪结果。当请求 n 个集群(索引 0 到 n)时,一些集群没有分配给它们的点 - 这导致集群少于预期。有人成功使用了 OpenCV 的 python K-Means 实现吗?一些用户体验或建议将是最有帮助的。

这是我的python实现的代码片段:

points = cv.CreateMat(dim1, dim2, cv.CV_32FC2)
clusters = cv.CreateMat(dim1, 1, cv.CV_32SC1)
for a in range(0,dim0):
   for b in range(0,dim1):
       for c in range(0,dim2):
           #print float(list[a*dim1*dim2 + b*dim2 + c])
           cv.Set2D( points, b, c, float(list[a*dim1*dim2 + b*dim2 + c]) )
cv.KMeans2(points, numClusters, clusters, (cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 100000, 0.00000001), 50)

for d in range(0,dim1):
    f.write(str(int(clusters[d,0])))
    f.write(' ')
    f.write('\n')

问候,

斯特凡

4

1 回答 1

0

这可能是一个理想的属性,并且它因实现而异。

这是如何发生的:当随机初始化或使用 Lloyd 迭代时,很可能会发生集群丢失所有对象的情况。在 MacQueen k-means 中,它应该始终至少保留一个对象。假设在 1d 中,在 1 和 2 有(以及其他)对象,分配给集群 c1。集群 c1 的平均值为 1.5。现在如果有其他两个簇的均值移动到 0.6 和 2.4,那么这两个对象将被重新分配,簇 c1 将突然变空。

为什么这可能是可取的:假设您事先不知道最佳值k,您可能只是决定选择一个太大的 k 并查看某些集群是否退化。

然而,这很可能确实表明您的数据集不适用于 k-means。K-means 实际上非常挑剔,令人惊讶的是,它的工作频率仍然令人满意。一般来说,k-means 不喜欢大小不同但彼此接近的簇。因为k-means总是会在中间分裂!另外,在您的特定情况下,k可能太高了

这是 k-means 不喜欢的情况的一维说明:(A 和 B 是它们的集群的对象;第二行表示真正的均值和两个均值之间的中间拆分。然后 k-means 将重新分配和拆分更左一点。

AAAAAAAAAAAAA BBBBB
      A    |    B
于 2012-06-14T16:12:39.533 回答