Перейти к содержимому

K-means

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

Что такое кластеризация K-means?

K-means — это алгоритм кластеризации, который группирует точки данных на основе их сходства. Это метод обучения без учителя, не требующий размеченных данных для обучения. Алгоритм работает путем разбиения набора данных на K кластеров, где K — параметр, задаваемый пользователем, определяющий количество кластеров. Цель алгоритма K-means — минимизировать сумму квадратов расстояний между точками данных и центроидами назначенных им кластеров.

Как работает кластеризация K-means?

Алгоритм K-means работает в следующие шаги:

  1. Инициализация: Выберите K случайных точек данных в качестве начальных центроидов.
  2. Назначение: Присвойте каждой точке данных ближайший центроид.
  3. Пересчет: Пересчитайте центроид каждого кластера, взяв среднее значение всех точек данных, назначенных этому кластеру.
  4. Повторение: Повторяйте шаги 2 и 3 до сходимости или достижения максимального числа итераций.

Преимущества кластеризации K-means

Кластеризация K-means имеет несколько преимуществ, включая:

  1. Простота реализации и интерпретации.
  2. Масштабируемость для больших наборов данных.
  3. Применимость к различным типам данных.
  4. Может использоваться для обнаружения выбросов.

Недостатки кластеризации K-means

Кластеризация K-means также имеет некоторые ограничения, такие как:

  1. Чувствительность к инициализации: качество конечного результата кластеризации зависит от начальных центроидов.
  2. Выбор оптимального числа кластеров: количество кластеров необходимо указать заранее, что может быть сложной задачей.
  3. Хорошо работает только со сферическими кластерами: K-means предполагает, что кластеры имеют сферическую форму, что может быть неверно для всех наборов данных.

Реализация кластеризации K-means в Python

Для реализации кластеризации K-means в Python мы будем использовать библиотеку scikit-learn. Перед кластеризацией важно масштабировать признаки, так как K-means опирается на вычисление расстояний и крайне чувствителен к немасштабированным числовым данным.

Кластеризация K-means с масштабированием и визуализацией

python
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

# Generate sample data
X, y = make_blobs(n_samples=1000, centers=3, random_state=42)

# Scale the features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Create KMeans instance with 3 clusters
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_scaled)

# Get cluster labels directly from the fitted model
labels = kmeans.labels_

# Visualize the results
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='X', s=200, label='Centroids')
plt.legend()
plt.show()

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

Выбор оптимального числа кластеров (K)

Поскольку K необходимо указать заранее, для нахождения оптимального значения обычно используется метод локтя. Он строит график суммы квадратов внутри кластера (WCSS) в зависимости от различных значений K. Точка «локтя» указывает на лучший компромисс между сложностью модели и дисперсией.

python
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, random_state=42)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)

plt.plot(range(1, 11), wcss, marker='o')
plt.xlabel('Number of clusters (K)')
plt.ylabel('WCSS')
plt.show()

Заключение

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

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.