Будут ли те же кластеры при повторном запуске K-Means?

«Будут ли те же кластеры при повторном запуске K-Means?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Причины невоспроизводимости:

  1. Случайная инициализация центроидов. По умолчанию алгоритм выбирает K случайных точек из данных в качестве начальных центроидов.
  2. Локальные минимумы. K-Means сходится к локальному минимуму суммы квадратов расстояний (inertia). Разная инициализация может привести к разным локальным минимумам.

Как обеспечить воспроизводимость:

  • Фиксация random_state в sklearn.cluster.KMeans. Это заставит генератор случайных чисел начинать с одного и того же seed.
  • Использование детерминированного метода инициализации, например, init='k-means++' (используется по умолчанию), который более устойчив, чем полностью случайный выбор, но все же зависит от random_state.

Пример:

from sklearn.cluster import KMeans
import numpy as np

# Генерация данных
np.random.seed(0)
X = np.random.randn(100, 2)

# БЕЗ фиксации random_state — результаты могут отличаться
kmeans_unstable = KMeans(n_clusters=3)
kmeans_unstable.fit(X)
print("Метки без random_state (первые 5):", kmeans_unstable.labels_[:5])

# С фиксацией random_state — результаты воспроизводимы
kmeans_stable = KMeans(n_clusters=3, random_state=42)
kmeans_stable.fit(X)
print("Метки с random_state=42 (первые 5):", kmeans_stable.labels_[:5])

# Повторный запуск с тем же random_state даст идентичный результат
kmeans_stable_again = KMeans(n_clusters=3, random_state=42)
kmeans_stable_again.fit(X)
print("Совпадают ли метки?", np.array_equal(kmeans_stable.labels_, kmeans_stable_again.labels_))

Практический совет: Для получения более стабильного и качественного результата часто запускают K-Means несколько раз с разными инициализациями (параметр n_init в sklearn, по умолчанию 10) и выбирают запуск с наименьшей инерцией (суммой квадратов расстояний). Фиксация random_state нужна именно для полной воспроизводимости эксперимента.