Алгоритм K-средних: принципы работы и применение в анализе данных
Для кого эта статья:
- Студенты и практикующие аналитики данных, изучающие методы кластеризации
- Специалисты в области машинного обучения и статистики
Бизнесмены и маркетологи, интересующиеся анализом клиентских данных и сегментацией рынка
Когда вы смотрите на облако точек данных, ваш мозг интуитивно группирует их по схожести. Алгоритм K-средних делает то же самое, но с математической точностью. Этот метод — настоящая рабочая лошадка в мире анализа данных, разделяющая хаотичные наборы на четкие кластеры. От сегментации клиентов до сжатия изображений, K-means завоевал популярность благодаря своей простоте и эффективности. Давайте разберем этот алгоритм по винтикам: от теории и формул до практической реализации и реальных примеров использования. 🔍
Погружаясь в мир кластеризации данных и алгоритм K-средних, вы делаете важный шаг к овладению аналитическими инструментами, востребованными на рынке. Курс Профессия аналитик данных от Skypro предлагает глубокое изучение не только кластеризации, но и всего спектра методов анализа данных — от базовой статистики до продвинутого машинного обучения. Реальные проекты и индивидуальная поддержка экспертов помогут вам трансформировать теоретические знания в практические навыки, которые открывают двери в мир высокооплачиваемых профессий.
Сущность метода K-средних в кластеризации данных
K-средних (K-means) — это алгоритм кластеризации, который разбивает набор данных на K заранее заданных групп (кластеров). Метод относится к классу итеративных алгоритмов и является одним из наиболее популярных подходов к кластеризации благодаря своей простоте и эффективности.
Суть алгоритма состоит в том, чтобы минимизировать вариацию внутри каждого кластера, одновременно максимизируя расстояние между кластерами. Иными словами, объекты внутри одного кластера должны быть максимально похожи друг на друга, а объекты из разных кластеров — максимально различаться.
Основная идея метода K-средних заключается в следующем:
- Выбираем K начальных центроидов (центров кластеров)
- Относим каждую точку данных к ближайшему центроиду
- Пересчитываем положение центроидов на основе среднего значения всех точек, отнесенных к данному кластеру
- Повторяем шаги 2-3 до сходимости (когда центроиды перестают существенно менять своë положение)
Для измерения "близости" точек к центроидам чаще всего используется евклидово расстояние, хотя возможны и другие метрики расстояний в зависимости от специфики задачи.
Александр Викторович, аналитик данных в финтех-секторе
Помню свой первый серьезный проект с кластеризацией клиентов банка. У нас была огромная база из более чем 2 миллионов клиентов с десятками признаков — от финансовых показателей до поведенческих паттернов. Руководство хотело получить "естественную" сегментацию для точечных маркетинговых кампаний.
Начал я с метода K-средних, установив K = 5 (на основе бизнес-логики). Первые результаты выглядели многообещающе — алгоритм выделил группу "VIP-клиентов" с высокими остатками на счетах, активных пользователей мобильных приложений, приверженцев кредитных продуктов и две промежуточные группы.
Но затем я заметил неравномерность размеров кластеров — один содержал более 70% всех клиентов. Это указывало на неоптимальность начальной инициализации центроидов. Повторив алгоритм с K-means++ и оптимизировав параметры через метрику силуэта, я получил более сбалансированные и интерпретируемые группы.
Бизнес-результат превзошел ожидания — таргетированные предложения для каждого сегмента повысили конверсию почти в 3 раза по сравнению со стандартными кампаниями. Этот опыт научил меня тому, что успешная кластеризация — это всегда итеративный процесс с постоянной валидацией результатов.
Для наглядности рассмотрим простой пример кластеризации двумерных данных с помощью K-средних:
| Этап | Описание действия | Результат |
|---|---|---|
| Инициализация | Выбираем случайно K=3 начальных центроидов | Три начальные точки на графике |
| Итерация 1, шаг 1 | Относим каждую точку к ближайшему центроиду | Формируются первоначальные кластеры |
| Итерация 1, шаг 2 | Пересчитываем центроиды как средние по каждому кластеру | Центроиды смещаются к центрам формирующихся кластеров |
| Итерации 2-4 | Повторяем процесс отнесения точек и пересчета центроидов | Кластеры постепенно стабилизируются |
| Сходимость | Алгоритм останавливается, когда центроиды почти не меняются | Получаем финальное разбиение на 3 кластера |
Метод K-средних интуитивно понятен и relativamente прост в реализации, что делает его отличным выбором для многих задач кластеризации. Однако у него есть и свои ограничения — например, необходимость заранее указывать число кластеров K и чувствительность к выбору начальных центроидов.

Математическое обоснование алгоритма k-средних
Метод K-средних можно формально описать как задачу оптимизации, целью которой является минимизация суммарного квадратичного отклонения точек данных от центров их кластеров. 📊
Формально эту задачу можно записать следующим образом:
J = ∑_{i=1}^{k} ∑_{x ∈ S_i} ||x – μ_i||^2
где:
J— функция стоимости (целевая функция), которую нужно минимизироватьk— количество кластеровS_i— i-й кластерx— точка данных, принадлежащая кластеруS_iμ_i— центроид i-го кластера||x – μ_i||^2— квадрат евклидова расстояния между точкойxи центроидомμ_i
Алгоритм K-средних стремится минимизировать эту функцию через итеративный процесс. На каждой итерации выполняются два шага:
- Шаг назначения (Assignment step): Каждую точку данных относят к ближайшему центроиду:
S_i^{(t)} = {x_j : ||x_j – μ_i^{(t)}||^2 ≤ ||x_j – μ_l^{(t)}||^2 ∀ l, 1 ≤ l ≤ k}
где S_i^{(t)} — множество точек, отнесенных к кластеру i на итерации t.
- Шаг обновления (Update step): Пересчитываем позиции центроидов как среднее арифметическое всех точек в соответствующем кластере:
μ_i^{(t+1)} = (1/|S_i^{(t)}|) ∑_{x_j ∈ S_i^{(t)}} x_j
где |S_i^{(t)|} — количество точек в кластере i на итерации t.
Доказано, что на каждой итерации значение функции стоимости J не увеличивается, а поскольку существует конечное число возможных кластерных назначений, алгоритм гарантированно сходится к локальному минимуму (хотя не обязательно к глобальному).
Эта математическая формулировка позволяет понять, почему алгоритм K-средних хорошо работает с кластерами сферической или эллиптической формы примерно одинакового размера, но может давать субоптимальные результаты в других случаях.
Ключевые математические свойства алгоритма K-средних:
- Сложность по времени составляет O(tknd), где
t— число итераций,k— количество кластеров,n— количество объектов,d— размерность пространства признаков - Алгоритм гарантированно сходится, но может попасть в локальный минимум, зависящий от начальных центроидов
- Для непрерывных данных центроиды сходятся к центрам масс соответствующих кластеров
- Может быть доказано, что алгоритм K-средних — это частный случай алгоритма максимизации ожидания (EM) при определенных допущениях
Существуют различные подходы к выбору начальных центроидов, влияющие на конечный результат:
| Метод инициализации | Описание | Преимущества | Недостатки | ||
|---|---|---|---|---|---|
| Случайный выбор | Случайный выбор K точек из набора данных | Простота реализации | Нестабильность результатов | ||
| K-means++ | Вероятностный выбор центроидов с учетом расстояний | Улучшенная сходимость, более стабильные результаты | Немного более сложная реализация | ||
| K-means | Параллельная версия K-means++ | Эффективность для больших наборов данных | Сложность реализации | ||
| Иерархическая инициализация | Использование результатов иерархической кластеризации | Часто дает хорошие начальные приближения | Вычислительно затратно |
Для валидации результатов кластеризации и определения оптимального числа кластеров K используются различные математические метрики:
- Метод локтя (Elbow method): График зависимости внутрикластерной дисперсии от числа кластеров, где "локоть" указывает на оптимальное
K - Силуэтный анализ (Silhouette analysis): Измеряет насколько объект похож на свой кластер по сравнению с другими кластерами
- Индекс Дэвиса-Болдина: Оценивает среднее отношение разброса внутри кластеров к расстоянию между кластерами
- Критерий Калински-Харабаша: Отношение разброса между кластерами к разбросу внутри кластеров
Математическая формулировка метода K-средних позволяет не только понять его внутреннюю логику, но и определить границы применимости, а также разрабатывать модификации для решения конкретных задач кластеризации.
Пошаговая реализация метода k-средних в Python
Практическое освоение алгоритма K-средних невозможно без его реализации. Python предлагает несколько способов — от "ручной" реализации до использования специализированных библиотек. Рассмотрим оба подхода, чтобы глубже понять механизм работы алгоритма. 💻
Для начала реализуем алгоритм K-means "с нуля", используя только NumPy:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# Генерируем синтетический набор данных
X, y_true = make_blobs(
n_samples=300,
centers=4,
cluster_std=0.60,
random_state=42
)
# Функция для расчета расстояний между точками и центроидами
def calculate_distances(X, centroids):
distances = np.zeros((X.shape[0], len(centroids)))
for k, centroid in enumerate(centroids):
# Евклидово расстояние между каждой точкой и центроидом
distances[:, k] = np.sqrt(np.sum((X – centroid) ** 2, axis=1))
return distances
# Наша реализация алгоритма K-means
def kmeans(X, k, max_iters=100, tol=1e-4):
# Случайно выбираем начальные центроиды
idx = np.random.choice(len(X), k, replace=False)
centroids = X[idx]
for i in range(max_iters):
# Сохраняем старые центроиды для проверки сходимости
old_centroids = centroids.copy()
# Рассчитываем расстояния и назначаем точки ближайшим центроидам
distances = calculate_distances(X, centroids)
labels = np.argmin(distances, axis=1)
# Обновляем центроиды
for j in range(k):
if np.sum(labels == j) > 0: # проверяем, что кластер не пустой
centroids[j] = np.mean(X[labels == j], axis=0)
# Проверяем сходимость
if np.sum((centroids – old_centroids) ** 2) < tol:
break
return centroids, labels
# Запускаем алгоритм
k = 4
centroids, labels = kmeans(X, k)
# Визуализируем результаты
plt.figure(figsize=(10, 8))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.7, s=40)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x', s=200)
plt.title('K-means кластеризация (k=4)')
plt.xlabel('Признак 1')
plt.ylabel('Признак 2')
plt.show()
Теперь рассмотрим реализацию с помощью библиотеки scikit-learn, которая предоставляет оптимизированную и гибкую реализацию K-means:
from sklearn.cluster import KMeans
# Создаем и обучаем модель
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
kmeans.fit(X)
# Получаем предсказанные метки кластеров и центроиды
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# Визуализируем результаты
plt.figure(figsize=(10, 8))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.7, s=40)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x', s=200)
plt.title('Scikit-learn K-means (k=4)')
plt.xlabel('Признак 1')
plt.ylabel('Признак 2')
plt.show()
Библиотека scikit-learn предлагает множество дополнительных возможностей, которые стоит использовать в реальных проектах:
- Инициализация методом k-means++ (параметр
init='k-means++') - Несколько запусков с разными начальными центроидами (параметр
n_init) - Предварительные вычисления расстояний (параметр
precompute_distances) - Ограничение на количество итераций (параметр
max_iter) - Оценка "инерции" (сумма квадратов расстояний до ближайших центроидов) с помощью атрибута
inertia_
Пример определения оптимального числа кластеров с помощью метода локтя:
# Вычисляем инерцию для разного количества кластеров
inertias = []
k_range = range(1, 11)
for k in k_range:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
inertias.append(kmeans.inertia_)
# Строим график метода локтя
plt.figure(figsize=(10, 6))
plt.plot(k_range, inertias, 'bo-')
plt.xlabel('Количество кластеров k')
plt.ylabel('Инерция')
plt.title('Метод локтя для определения оптимального k')
plt.grid(True)
plt.show()
Ирина Сергеевна, специалист по машинному обучению
В одном из проектов по анализу поведения пользователей интернет-магазина нам нужно было сегментировать аудиторию для персонализированного маркетинга. База содержала информацию о 50 000+ пользователях с 15 характеристиками — от демографии до истории покупок.
Первоначально я попробовала использовать "ванильный" K-means из scikit-learn с рекомендованными настройками. Результаты были неудовлетворительными — кластеры получались несбалансированными, а интерпретация затруднительной. Метрики силуэта показывали низкое качество кластеризации.
Через профилирование кода выяснилось, что масштаб признаков сильно различался: суммы покупок варьировались от 100 до 100 000 руб., а частота визитов — от 1 до 50 раз в месяц. Это искажало расстояния в евклидовом пространстве.
Я модифицировала подход, применив предварительную стандартизацию данных и использовав K-means++. Кроме того, применила метод локтя и силуэтный анализ для определения оптимального числа кластеров (оказалось, что это 5, а не 7, как мы изначально предполагали).
Результат превзошел ожидания — кластеры получились интерпретируемыми и действительно отражали различные паттерны поведения. Маркетинговая команда использовала эту сегментацию для таргетированных кампаний, что увеличило конверсию на 32%.
Главный урок: никогда не применяйте K-means "как есть" без предварительной подготовки данных и валидации результатов.
Помимо scikit-learn, для кластеризации методом K-means можно использовать другие библиотеки:
- PySpark — для распределенной кластеризации больших данных
- RAPIDS cuML — для GPU-ускоренной реализации K-means
- PyTorch/TensorFlow — для кастомных реализаций с использованием нейронных сетей
Практические советы по применению K-means в Python:
- Всегда нормализуйте данные перед кластеризацией — K-means чувствителен к масштабу признаков
- Используйте K-means++ для инициализации — это значительно повышает стабильность результатов
- Запускайте алгоритм несколько раз с разными начальными центроидами (параметр
n_init) - Применяйте методы уменьшения размерности (PCA, t-SNE) перед кластеризацией высокоразмерных данных
- Оценивайте качество кластеризации с помощью внутренних метрик (силуэт, инерция) и внешней валидации (если доступны метки)
Реализация K-means в Python позволяет гибко настраивать параметры алгоритма и интегрировать его в более сложные аналитические пайплайны для решения разнообразных задач кластеризации данных.
Практические задачи, решаемые методом k-средних
Метод K-средних, несмотря на свою простоту, находит применение в различных областях анализа данных и машинного обучения. Рассмотрим конкретные практические задачи, где этот алгоритм доказал свою эффективность. 🚀
Сегментация клиентов — одно из наиболее распространенных применений K-means в бизнес-аналитике:
- RFM-анализ — кластеризация клиентов по параметрам Recency (давность), Frequency (частота) и Monetary Value (денежная ценность)
- Поведенческая сегментация — группировка пользователей по паттернам взаимодействия с сайтом/приложением
- Сегментация по лояльности — выявление групп клиентов с различным уровнем приверженности бренду
В маркетинге K-means используется для:
- Таргетирования рекламных кампаний — определение целевых групп для конкретных предложений
- Анализа рынка — выделение групп товаров/услуг со схожими характеристиками
- Ценообразования — выявление ценовых сегментов и оптимизация прайс-листов
Обработка изображений — еще одна область, где K-means находит широкое применение:
- Квантизация цветов — сокращение цветовой палитры изображения до K основных цветов
- Сегментация изображений — выделение различных областей изображения для дальнейшего анализа
- Сжатие данных — использование центроидов для представления групп пикселей
В области анализа текстов метод K-средних применяется для:
- Кластеризации документов — группировка текстов по тематической близости
- Обнаружения тем — выявление основных тематических кластеров в коллекции документов
- Классификации спама — кластеризация сообщений на основе их признаков
В финансовой сфере алгоритм используется для:
- Анализа портфеля — группировка ценных бумаг со схожими характеристиками
- Обнаружения мошенничества — выявление аномальных транзакций, не вписывающихся в типичные кластеры
- Кредитного скоринга — сегментация заемщиков по уровню риска
| Отрасль | Задача | Входные данные | Результат применения K-means |
|---|---|---|---|
| Розничная торговля | Сегментация ассортимента | Данные о продажах, маржинальности, оборачиваемости товаров | Выделение групп товаров для дифференцированного управления |
| Телекоммуникации | Предотвращение оттока | Использование услуг, платежи, обращения в поддержку | Идентификация групп риска для проактивных удерживающих мероприятий |
| Медицина | Стратификация пациентов | Демографические данные, анализы, симптомы | Группы пациентов для персонализированного лечения |
| Городское планирование | Анализ транспортных потоков | GPS-треки, данные о загруженности дорог | Определение типичных маршрутов и проблемных зон |
| IoT | Мониторинг оборудования | Телеметрия с датчиков устройств | Выявление нормальных и аномальных режимов работы |
Несколько конкретных примеров успешного применения K-means:
- Netflix использует кластеризацию для группировки пользователей по предпочтениям, что улучшает рекомендательную систему
- Amazon применяет K-means для сегментации клиентской базы и персонализации маркетинговых кампаний
- Spotify использует кластеризацию для группировки треков и создания персонализированных плейлистов
- Системы мониторинга сетевого трафика используют K-means для обнаружения аномалий и потенциальных DDoS-атак
При решении практических задач с помощью K-means необходимо учитывать специфику данных и цели анализа. Часто алгоритм является первым шагом более сложного аналитического процесса, например:
- Кластеризация → Профилирование кластеров → Построение прогнозных моделей для каждого кластера
- Кластеризация → Выделение аномалий → Детальный анализ аномальных случаев
- Кластеризация → Снижение размерности → Визуализация многомерных данных
Выбор количества кластеров K в реальных задачах должен основываться не только на математических метриках, но и на бизнес-логике и возможности интерпретации результатов. Оптимальное число кластеров — то, которое обеспечивает баланс между точностью разделения данных и практической применимостью результатов.
Ограничения и альтернативы алгоритма k-means
Несмотря на популярность и широкое применение, алгоритм K-средних имеет ряд существенных ограничений, которые необходимо учитывать при выборе метода кластеризации. Рассмотрим основные недостатки K-means и альтернативные подходы, которые могут быть более эффективны в определенных ситуациях. ⚠️
Ключевые ограничения алгоритма K-means:
- Необходимость предварительного задания числа кластеров K — не всегда известно заранее оптимальное количество групп
- Чувствительность к выбору начальных центроидов — разные запуски могут давать разные результаты
- Предположение о сферической форме кластеров — алгоритм плохо работает с кластерами сложной формы
- Влияние выбросов — аномальные наблюдения могут значительно искажать положение центроидов
- Проблема пустых кластеров — при неудачной инициализации некоторые кластеры могут остаться пустыми
- Масштабирование признаков — алгоритм чувствителен к масштабу, требуется предварительная нормализация
- Сложность работы с категориальными данными — требует специальных подходов к кодированию
Для иллюстрации ограничений K-means, рассмотрим примеры данных, с которыми алгоритм справляется плохо:
- Кластеры нестандартной формы (например, концентрические окружности)
- Кластеры разной плотности и размера
- Данные с большим количеством шума и выбросов
- Высокоразмерные данные с проблемой "проклятия размерности"
Альтернативные алгоритмы кластеризации, преодолевающие ограничения K-means:
| Алгоритм | Особенности | Преимущества перед K-means | Недостатки |
|---|---|---|---|
| DBSCAN | Кластеризация на основе плотности точек | Обнаруживает кластеры произвольной формы, автоматически определяет количество кластеров, устойчив к выбросам | Чувствителен к параметрам, проблемы с кластерами разной плотности |
| Hierarchical Clustering | Строит иерархию кластеров (дендрограмму) | Не требует предварительного задания K, визуализирует структуру данных | Высокая вычислительная сложность O(n³), чувствительность к выбросам |
| Gaussian Mixture Models | Вероятностная модель, основанная на смеси гауссианов | Гибкие эллиптические кластеры, вероятностная принадлежность к кластерам | Сложность настройки, возможность переобучения |
| Spectral Clustering | Использует собственные значения матрицы сходства | Работает с кластерами сложной формы, эффективен для разреженных графовых структур | Вычислительно затратен для больших наборов данных |
| OPTICS | Упорядочивание точек для идентификации кластерной структуры | Обрабатывает кластеры разной плотности, меньше параметров чем DBSCAN | Сложная интерпретация результатов, высокая вычислительная сложность |
| Fuzzy C-means | Нечеткая версия K-means | Объекты могут принадлежать нескольким кластерам с разной степенью принадлежности | Требует задания K, чувствителен к шуму |
Модификации K-means, решающие некоторые проблемы базового алгоритма:
- K-means++ — умная инициализация центроидов, снижающая зависимость от начальных условий
- K-medoids (PAM) — использует медоиды вместо центроидов, более устойчив к выбросам
- Weighted K-means — учитывает веса признаков, важность различных измерений
- Bisecting K-means — иерархическая версия, последовательно разделяющая кластеры
- Mini-batch K-means — использует подвыборки данных, подходит для больших наборов
- X-means — автоматически определяет количество кластеров K
Рекомендации по выбору алгоритма кластеризации в зависимости от характеристик данных:
- Для больших наборов данных: Mini-batch K-means, BIRCH
- Для кластеров произвольной формы: DBSCAN, Spectral Clustering
- При неизвестном K: Hierarchical Clustering, DBSCAN, X-means
- При наличии выбросов: DBSCAN, K-medoids
- Для высокоразмерных данных: Subspace Clustering, Ensemble Clustering
Практический подход к выбору алгоритма кластеризации часто включает:
- Начало с K-means как базового алгоритма (из-за его простоты и вычислительной эффективности)
- Анализ результатов и выявление потенциальных проблем (нестабильность, неестественные кластеры)
- Тестирование альтернативных алгоритмов, если K-means не дает удовлетворительных результатов
- Сравнение нескольких алгоритмов по внутренним и внешним метрикам качества кластеризации
- Выбор наиболее подходящего алгоритма с учетом баланса между качеством результатов и вычислительной сложностью
Важно помнить, что не существует "универсально лучшего" алгоритма кластеризации — выбор зависит от специфики данных, целей анализа и вычислительных ресурсов. Часто наилучшие результаты достигаются при комбинировании нескольких подходов или использовании ансамблевых методов кластеризации.
Метод K-средних, при всей своей простоте, остается мощным и практичным инструментом для кластеризации данных. Понимание его математических основ, умение реализовать и настроить алгоритм, а также осознание его ограничений — важные составляющие мастерства аналитика данных. Помните, что правильное применение любого алгоритма требует критического мышления: начинайте с четкой постановки задачи, тщательно подготавливайте данные, оценивайте качество результатов и не бойтесь экспериментировать с альтернативными методами. Кластеризация — это искусство находить скрытые структуры в данных, и K-means может стать вашей первой, но далеко не последней кистью в этом творческом процессе.
Читайте также
- Топ-10 лучших курсов по анализу данных: обзор, рейтинг, отзывы
- Метод K ближайших соседей: принцип работы и применение в анализе данных
- Корреляционная матрица в Python: анализ взаимосвязей между данными
- Python и Kivy: топ-7 курсов для создания десктопных приложений
- Нейросети: бесплатные курсы и эффективные практики обучения
- Иерархическая кластеризация: методы, дендрограммы и применение
- Когортный анализ: как превратить данные в стратегическое оружие
- Pandas: мощный инструмент анализа данных для Python-разработчиков
- 5 способов преобразования списка Python в DataFrame pandas: гайд
- 10 лучших программ обучения искусственному интеллекту: выбор


