Эффективные стратегии для решения проблем инициализации K-Means

Эффективные стратегии решения проблем инициализации K-Means

Использование n_init и K-Means++

изображение от Flo

Введение

K-Means – широко используемый алгоритм кластеризации в машинном обучении, который имеет множество преимуществ, но также представляет существенные вызовы. В этой статье мы рассмотрим его ограничения и предложим простые решения для их решения.

Как работает K-Means?

K-Means – алгоритм кластеризации, который разбивает данные на K кластеров. Он случайным образом инициализирует K центроидов, а затем назначает каждую точку данных ближайшему центроиду. Центроиды пересчитываются на основе среднего значения назначенных точек, и процесс повторяется до сходимости.

Я иллюстрирую это ниже с помощью t-распределенного стохастического алгоритма вложения соседних точек, метода снижения размерности. Каждый кластер представлен цветом.

Кластеры K-Means через T-SNE, изображение от Flo

K-Means начинается с выбора центроидов случайным образом, что означает, что результат может варьироваться в зависимости от этого начального выбора. Если эти центроиды не выбраны осмотрительно, они могут создавать неточные кластеры. Чтобы противостоять этому, можно использовать две стратегии: “n_init” и “K-means++”.

В следующем разделе мы подробно рассмотрим весь процесс, начиная с определения лучшего значения “K” и заканчивая обучением модели.

Выбор оптимального K

K представляет собой количество кластеров, которое является ключевым в алгоритме K-Means. Подсчет оптимального K может привести к неточной кластеризации. Определение правильного K часто не является прямолинейным и обычно требует комбинации экспертного знания и аналитических методов. Мы будем использовать 2 метода, называемые методом “локтя” и оценкой силуэта.

Метод “локтя”

Один из распространенных методов – “метод локтя”, но также есть различные другие техники и соображения, которые следует учесть. Давайте подробнее рассмотрим, как наилучшим образом выбрать К для ваших данных.

from sklearn.metrics import silhouette_scorecost = []silhouettes = []K = range(2, 20)for k in K:    kmeans = KMeans(n_clusters=k, n_init=10)...