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

问题描述 投票:0回答:1

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

为此,我加载图像并以可以馈入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. 

我该如何解决?

python image machine-learning deep-learning unsupervised-learning
1个回答
0
投票

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

起初,这种情况似乎暗示您的功能没有足够的多样性来证明3个不同的群集的合理性。并且,只要我们仍然处于K-means上下文中,您将无能为力。在几个可用选项中(有关各个参数的详细信息,请参见documentation):

    增加迭代次数max_iter(默认为300)
  • 增加不同质心初始化的数量n_init(默认10)
  • init参数更改为random(默认值为k-means++),或者甚至更好的是,提供一个3元素数组,其中包含每个目标集群中的一个样本(如果您已经知道这些集群可能实际上在您的数据中)
  • 使用不同的random_state值运行模型
  • 合并以上内容
  • 如果上述方法没有任何效果,您应该为在这里实际上不适用K均值的方法做好准备,您可能必须寻找替代方法。
  • © www.soinside.com 2019 - 2024. All rights reserved.