Количество отдельных кластеров в KMeans меньше n_clusters? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть изображения еды, хранящиеся в одной папке. Все изображения не помечены, и они не хранятся в отдельной папке, например, «макароны» или «мясо». Моя текущая цель - сгруппировать изображения по нескольким категориям, чтобы позже я мог оценить, похож ли вкус продуктов, изображенных на изображениях того же кластера.

Для этого я загружаю изображения и обрабатываю их в формате, который можно передать в 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. 

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Это одна из таких ситуаций, когда, хотя ваш код хорош с точки зрения программирования , он не дает удовлетворительных результатов из-за проблемы, связанной с ML (данные , модель или и то, и другое), поэтому «отлаживать» довольно сложно (я цитирую это слово, поскольку это не типичная процедура отладки, так как сам код работает нормально).

На первом этапе , ситуация, похоже, подразумевает, что в ваших функциях недостаточно разнообразия, чтобы оправдать 3 разных кластера. И, при условии, что мы остаемся в контексте K-средних, вы мало что можете сделать; среди немногих доступных опций (см. документацию для получения подробной информации о соответствующих параметрах):

  • Увеличение количества итераций max_iter (по умолчанию 300)
  • Увеличьте количество различных инициализаций центроидов n_init (по умолчанию 10)
  • Измените аргумент init на random (по умолчанию k-means++) или, что еще лучше, предоставьте 3-элементный массив с одним образцом из каждого из ваших целевых кластеров (если у вас уже есть представление о том, какие именно кластеры могут быть в ваших данных)
  • Запустите модель с разными random_state значениями
  • Объедините вышеперечисленное

Если ничего из вышеперечисленного не работает, это, скорее всего, будет означать, что K-средства на самом деле здесь не применимы, и вам, возможно, придется искать альтернативные подходы (которые выходят за рамки этой темы ). На самом деле, как правильно указано в комментарии ниже, K-means обычно не так хорошо работает с данными такой высокой размерности.

0 голосов
/ 23 июня 2020
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    cluster_data(data_arr)

Вы можете использовать эту функцию для удаления предупреждений. Поскольку sklearn использует модуль предупреждений для удаления предупреждений.

...