繁体   English   中英

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

[英]OpenCV KMeans (K-Means) python number of output clusters issue

我正在使用OpenCV的python接口来进行多维数据的K-Means聚类(通常是7维)。 我对集群的结果很奇怪。 在请求n-clusters(索引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')

问候,

斯特凡

这可能是理想的属性,并且从实现到实现各不相同。

如何发生这种情况 :当随机初始化或使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM