修复KMeans聚类位置

我试图使用KMeans对RGB颜色进行聚类,并自动计算图像中每个组的像素数量。为此,我将质心的初始位置设置为我希望分类的位置,并从sklearn运行KMeans。

问题是,根据图像的不同,算法输出的初始质心向量的顺序会发生变化,所以当我计算元素数量时,它会对应到错误的颜色。

这种情况通常发生在我图像中没有一个或多个初始质心颜色的时候。在这种情况下,我希望它计算为0。

有谁知道如何在KMeans预测输出中固定初始质心的顺序吗?

代码如下:

 centroid_start = np.array([[0,0,0],#Black                           [38,64,87], #Col1                           [43,68,98], #Col2                           [23,42,45], #Col3                           [160, 62, 0],#Col3                           [153, 82, 33], #Col5                           [198, 130, 109], #Col6                           [100,105,79], #Col7                           [220,138, 22]#Col8                           ], np.float64)          image = cv.cvtColor(img, cv.COLOR_HSV2RGB)    reshape=image.reshape((image.shape[0]*image.shape[1], 3))    cluster = KMeans(n_clusters =np.shape(centroid_start[0], init =centroid_start).fit(reshape) pixels = Counter(cluster.labels_)print(pixels)

问题是:当我检查’pixels’变量时,0并不总是对应黑色,1并不总是对应Col1,依此类推。


回答:

如果你不希望颜色发生迁移,可能不应该使用k-means。相反,只需使用成对距离来计算你的颜色与图像像素之间的距离,然后选择距离最小的颜色。

如果你确实希望初始颜色发生迁移,那么你必须接受你的某些初始聚类中心(颜色)可能会消失,或者可能迁移到与你初始颜色非常不同的状态。一个选项是重新排序你的已拟合的KMeans对象的cluster_centers_属性(以及可能的labels_)的行。另一个可能更安全的选项是计算拟合的聚类中心与你的原始颜色的映射(再次使用成对距离),然后转换你后续k-means分类的结果。如果你想一步完成,你可以子类化KMeans或通过创建你自己的从BaseEstimator派生的类来包装它。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注