OpenCV KMeans(K-Means)python输出集群数量问题

时间:2011-04-01 20:26:03

标签: python opencv cluster-analysis k-means

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

以下是我的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')

此致

的Stefan

1 个答案:

答案 0 :(得分: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