【发布时间】:2018-01-09 22:27:31
【问题描述】:
我知道有很多这样的问题和一些解决方案,但我希望有另一种方法。
目标:最终目标是对给定图像的颜色进行聚类,然后允许用户更改这些颜色。用户不需要输入任何k。算法确定K。
方法:目前,我使用的是剪影分数指标 (http://scikit-learn.sourceforge.net/dev/modules/generated/sklearn.metrics.silhouette_score.html#sklearn.metrics.silhouette_score)。我正在使用 MiniBatchKMeans 对图像进行聚类,然后在 k (4-8) 的范围内计算 silhouette_score。代码是:
# silhouetteCoeff determination
def silhouetteCoeff(z):
max_silhouette = 0
max_k = 0
for i in range(4, 17):
clt = MiniBatchKMeans(n_clusters = i, random_state = 42)
clt.fit(z)
silhouette_avg = silhouette_score(z, clt.labels_, sample_size = 250, random_state = 42)
print("k: ", i, " silhouette avg: ", silhouette_avg)
if (silhouette_avg == 1.0):
max_k = i
break
elif (silhouette_avg > max_silhouette):
max_silhouette = silhouette_avg
max_k = i
print("Max silhouette: ", max_silhouette)
print("Max k: ", max_k)
return int(max_k)
即使我事先对图像进行了颜色量化(到 16 种颜色),该函数仍然需要 6-8 秒才能运行(假设图像大小为 400x400)。
我的问题是,是否有任何更好或更快的方法可以找到 k?我也尝试过 Elbow 方法,但仍然要计算那里的 SSE。通过对一些图像的测试,我发现 k = 8 的平均值很好。但是在颜色更密集的图像上,算法会丢失一些颜色。
【问题讨论】:
标签: algorithm machine-learning computer-vision cluster-analysis k-means