[英]K-Means Clustering - output clusters contains same number of elements but in different order [ 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.