Рубрики
Без рубрики

K-означает кластеризацию с Scikit – учиться

Узнайте основные основы и математики позади популярных k-означает алгоритм кластеризации и как реализовать его в «Scikit-Learn». Теги с обучением машины, учебником, Python, начинающими.

Кластеризация (или Анализ кластеров ) – это техника, которая позволяет нам найти группы подобных объектов, объектов, которые более связаны друг с другом, чем объектами других групп. Примерами ориентированных на бизнес-ориентированные в бизнес-приложениях кластеризации включают группу документов, музыки и фильмы по разным темам или поиске клиентов, которые разделяют подобные интересы на основе общего поведения на покупку в качестве основы для регулярных двигателей.

В этом руководстве мы узнаем о одной из самых популярных алгоритмов кластеризации, k-означает , который широко используется в академии, а также в промышленности. Мы охватим:

  • Основные концепции K-означает кластеризацию
  • Математика за алгоритмом K-означает
  • Преимущества и недостатки K-означает
  • Как реализовать алгоритм в примерном наборе данных, используя Scikit-Surve
  • Как визуализировать кластеры
  • Как выбрать оптимальный к Использование метода локтя

Давайте начнем!

Этот учебник адаптирован из Часть 3 следующих технологий Машина Python обучение Серия, которая берет вас через машинное обучение и глубокие алгоритмы обучения с Python от 0 до 100. Он включает в себя капенбовочную среду в браузере со всеми необходимыми программными и библиотеками предварительно установленными и проектами, использующими общественные наборы данных. Вы можете начать бесплатно здесь Действительно

Основы K-означает кластеризацию

Как мы увидим, алгоритм K-означает чрезвычайно прост в реализации и также является вычислением очень эффективным по сравнению с другими алгоритмами кластеризации, которые могут объяснить свою популярность. Алгоритм K-означает относится к категории Кластеризация на основе прототипа Отказ

Кластеризация на основе прототипа означает, что каждый кластер представлен прототипом, который может быть либо Центроидный ( Среднее ) подобных точек с непрерывными функциями или Медоид (Большинство представитель или наиболее часто встречающийся точка) в случае категориальных особенностей.

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

Хотя K-означает кластеризацию Clustering к данным в более высоких размерах, мы будем проходить через следующие примеры, используя простой двумерный набор данных с целью визуализации.

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

Как только ваша песочница нагрузки, давайте импортируем игрушечный набор данных из Scikit - Учите и визуализируйте источники данных:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# create dataset
X, y = make_blobs(
    n_samples=150, n_features=2,
    centers=3, cluster_std=0.5,
    shuffle=True, random_state=0
)

# plot
plt.scatter(
    X[:, 0], X[:, 1],
    c='white', marker='o',
    edgecolor='black', s=50
)
plt.show()

Набор данных, который мы только что создали, состоит из 150 случайно сгенерированных точек, которые примерно сгруппированы в три области с более высокой плотностью, что визуализируется через двумерную рассеивание.

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

  1. Случайно выбрать к Центроиды из точек образца в качестве начальных кластерных центров.
  2. Назначьте каждый образец ближайшему центроиду μ (j) , j ∈ {1, …, k} Отказ
  3. Переместите центроида в центр образцов, которые были назначены ему.
  4. Повторите шаги 2 и 3 до тех пор, пока назначения кластера не изменяются, либо определяемый пользователем допуск или максимальное количество итераций.

Теперь следующий вопрос Как мы измеряем сходство между объектами ? Мы можем определить сходство как противоположность расстояния, а обычно используемое расстояние для кластеризации образцов с непрерывными особенностями является квадратное евклидое расстояние между двумя точками x и у в м -мерное пространство:

Обратите внимание, что в предыдущем уравнении индекс J относится к J TH Размер (функциональный столбец) очков образца x и у . Мы будем использовать SuperScripts i и J Для ссылки на индекс образца и индекса кластера соответственно.

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

Здесь μ (j) это центр для кластера J , и

W (Я, j) Если образец х (i) находится в кластере J иначе

Обратите внимание, что когда мы применяем K-средства для реальных данных с использованием метрики евклидовых расстояний, мы хотим убедиться, что функции измеряются в том же масштабе и применяют z Расширение стандартизации или Min Max Max, если это необходимо.

K-означает кластеризацию с помощью Scikit-Sulect

Теперь, когда мы узнали, как работает алгоритм K-означает, давайте применим его к нашему набору данных, используя Kmeans класс от Scikit - Учите ‘s кластер модуль:

from sklearn.cluster import KMeans

km = KMeans(
    n_clusters=3, init='random',
    n_init=10, max_iter=300, 
    tol=1e-04, random_state=0
)
y_km = km.fit_predict(X)

Используя предыдущий код, мы устанавливаем количество желаемых кластеров на 3 Отказ Мы устанавливаем n_init = 10 Чтобы запустить K-означает алгоритмы кластеризации в 10 раз независимо с различными случайными центроидами, чтобы выбрать конечную модель как один с самым низким SSE. Через max_iter параметр Мы указываем максимальное количество итераций для каждого запуска (здесь, 300 ).

Обратите внимание, что k-означает реализацию в Scikit - Учите Останавливается рано, если он сходится до того, как достигнуто максимальное количество итераций. Тем не менее, возможно, что K-означает не достигает конвергенции для конкретного прогона, который может быть проблематичным (вычислительно дорогим), если мы выберем относительно большие значения для max_iter Отказ

Один из способов справиться с проблемами сходимости состоит в том, чтобы выбрать большие значения для Толь , который является параметром, который контролирует толерантность в отношении изменений в пределах в квадрате в квадрате в рамках кластера, чтобы объявить конвергенцию. В предыдущем коде мы выбрали терпимость 1e-04 .0001).

Проблема с помощью k-означает, что один или несколько кластеров могут быть пустыми. Однако эта проблема учитывается в текущих k-означает реализацию в Scikit - Учите Отказ Если кластер пуст, алгоритм будет искать образец, который самый дальний от центра от центрального кластера. Затем он перенасматривает центроид, чтобы быть этой дальнейшей точкой.

Теперь, когда мы предсказали кластерные этикетки y_km. Давайте визуализируем кластеры, которые K-средства идентифицированы в наборе данных вместе с кластерными центрами. Они хранятся под cluster_centers_ Атрибут установленного Kmeans объект:

# plot the 3 clusters
plt.scatter(
    X[y_km == 0, 0], X[y_km == 0, 1],
    s=50, c='lightgreen',
    marker='s', edgecolor='black',
    label='cluster 1'
)

plt.scatter(
    X[y_km == 1, 0], X[y_km == 1, 1],
    s=50, c='orange',
    marker='o', edgecolor='black',
    label='cluster 2'
)

plt.scatter(
    X[y_km == 2, 0], X[y_km == 2, 1],
    s=50, c='lightblue',
    marker='v', edgecolor='black',
    label='cluster 3'
)

# plot the centroids
plt.scatter(
    km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],
    s=250, marker='*',
    c='red', edgecolor='black',
    label='centroids'
)
plt.legend(scatterpoints=1)
plt.grid()
plt.show()

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

Метод локтя

Хотя K-средства K-средства работали хорошо на этом наборе игрушек, важно подтвердить, что недостаток k-означает, что мы должны указать количество кластеров, k. , прежде чем мы узнаем, что оптимально к является. Количество кластеров для выбора, возможно, не всегда будет настолько очевидно в реальных приложениях, особенно если мы работаем с набором более высокого размера, который не может быть визуализирован.

Метод локтя это полезный графический инструмент для оценки оптимального количества кластеров к для данной задачи. Интуитивно, мы можем сказать, что, если к Увеличивается, внутри кластера SSE (« искажение ») уменьшится. Это связано с тем, что образцы будут ближе к центру), они назначены.

Идея метода локтя – определить значение к Там, где искажение начинает расти наиболее быстро, что станет яснее, если мы построим искажение для разных ценностей к :

# calculate distortion for a range of number of cluster
distortions = []
for i in range(1, 11):
    km = KMeans(
        n_clusters=i, init='random',
        n_init=10, max_iter=300,
        tol=1e-04, random_state=0
    )
    km.fit(X)
    distortions.append(km.inertia_)

# plot
plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()

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

Я надеюсь, что вам понравилось это руководство по алгоритму K-означает! Мы исследовали основные концепции и математики позади алгоритма K-означает, как реализовать k-средства и как выбрать оптимальное количество кластеров, k .

Если вы хотите узнать больше, следующие технологии Машина Python (часть 3) Курс дополнительно исследует алгоритмы кластеризации и техники, такие как:

  • Силуэтные участки Другой метод, используемый для выбора оптимального k.
  • K-означает ++ , вариант k-означает, что улучшает результаты кластеризации благодаря более умным посевам начальных кластерных центров.
  • Другие категории кластеризации алгоритмов, таких как Иерархический и Кластеризация на основе плотности , что не требует от нас указывать количество кластеров авансового или предположить сферические структуры в нашем наборе данных.

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

Оригинал: “https://dev.to/nexttech/k-means-clustering-with-scikit-learn-14kk”