Как определяется число кластеров в k-means
Что проверяют
Знаете ли вы, что у k-means нет встроенного способа выбрать k, и понимаете ли, что метрики тут лишь подсказка. Следом обычно спрашивают, что делать, если локтя на графике нет, и подходит ли k-means для этих данных вообще.
Как отвечать
Начните с главного свойства: инерция (сумма квадратов расстояний до центроидов, inertia_ в scikit-learn) монотонно падает с ростом k. Искать её минимум бессмысленно, смотрят на форму кривой и на внешние метрики:
- метод локтя: перебрать k, построить инерцию и найти точку, после которой выигрыш от нового кластера резко падает. Перегиб автоматически ищет
KneeLocatorиз библиотекиkneed; - силуэт:
silhouette_scoreот -1 до 1, чем выше, тем лучше разделены кластеры. Считается за O(n²), на больших данных передаютsample_size. Для одного кластера не определён; - Calinski-Harabasz и Davies-Bouldin: быстрые альтернативы, у первого лучше большее значение, у второго меньшее;
- gap-статистика: сравнивает инерцию с инерцией на случайных равномерных данных. Берут наименьшее k, при котором
Gap(k)не меньше, чемGap(k+1)за вычетом стандартной ошибки; - GMM с BIC:
GaussianMixtureдаёт информационный критерий, который штрафует лишние компоненты.
Перед подбором данные масштабируют (StandardScaler), иначе признак с большим разбросом решает всё. И помните про n_init: с версии 1.4 по умолчанию стоит auto, что для инициализации k-means++ означает один запуск, поэтому устойчивость решения проверяют несколькими прогонами. Финальное k часто задаёт бизнес: сегментов должно быть столько, сколько команда способна обработать.
Где спотыкаются
Выбирают k с минимальной инерцией. Она всегда меньше при большем k.
Трактуют правило gap-статистики как «где разрыв больше всего». Правило другое, и оно учитывает стандартную ошибку.
Не проверяют предпосылки. k-means ищет сферические кластеры похожего размера, и на вытянутых группах или группах разной плотности ни одно k не будет правильным. Тогда честнее взять DBSCAN или HDBSCAN.