繁体   English   中英

KMeans 中不同簇的数量少于 n_clusters?

[英]Number of distinct clusters in KMeans is less than n_clusters?

我有一些食物图像存储在一个文件夹中。 所有图像都没有标记,也没有存储在单独的文件夹中,例如“意大利面”或“肉”。 我目前的目标是将图像聚类为多个类别,以便我稍后可以评估同一聚类图像中描绘的食物的味道是否相似。

为此,我加载图像并以可以输入 VGG16 进行特征提取的格式对其进行处理,然后将这些特征传递给我的 KMeans 以对图像进行聚类。 我使用的代码是:

path = r'C:\Users\Hi\Documents\folder'
train_dir = os.path.join(path)
model = VGG16(weights='imagenet', include_top=False)
vgg16_feature_list = []
files = glob.glob(r'C:\Users\Hi\Documents\folder\*.jpg')
for i in enumerate(files):
    img = image.load_img(img_path,target_size=(224,224))
    img_data=image.img_to_array(img)
    img_data=np.expand_dims(img_data,axis=0)
    img_data=preprocess_input(img_data)

    vgg16_feature = model.predict(img_data)
    vgg16_feature_np = np.array(vgg16_feature)
    vgg16_feature_list.append(vgg16_feature_np.flatten())
vgg16_feature_list_np=np.array(vgg16_feature_list)
print(vgg16_feature_list_np.shape)
print(vgg16_feature_np.shape)

kmeans = KMeans(n_clusters=3, random_state=0).fit(vgg16_feature_list_np)
print(kmeans.labels_)

问题是我收到以下警告:

ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (3). Possibly due to duplicate points in X. 

我该如何解决?

这是其中一种情况,尽管您的代码从编程的角度来看很好,但由于与ML相关的问题(数据、model 或两者),它不会产生令人满意的结果,因此“调试”相当困难"(我引用这个词,因为这不是典型的调试过程,因为代码本身运行良好)。

起初,这种情况似乎意味着您的特征没有足够的多样性来证明 3 个不同的集群是合理的。 而且,如果我们仍然处于 K-means 环境中,那么您无能为力; 在几个可用的选项中(有关各个参数的详细信息,请参阅文档):

  • 增加迭代次数max_iter (默认300)
  • 增加不同质心初始化的数量n_init (默认 10)
  • init参数更改为random (默认为k-means++ ),或者更好的是,提供一个 3 元素数组,其中包含来自每个目标集群的一个样本(如果您已经知道这些集群实际上可能在您的数据中) )
  • 使用不同的random_state值运行 model
  • 结合以上

如果上述方法均无效,则很可能意味着 K-means 实际上不适用于此处,您可能必须寻找替代方法(不在此线程的 scope 中)。 事实是,正如下面评论中正确指出的那样,K-means 通常不适用于如此高维的数据。

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    cluster_data(data_arr)

您可以使用此 function 删除警告。 由于sklearn使用警告模块来删除警告。

暂无
暂无

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

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