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