我正在使用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
答案 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