Course
После того как вы обучили модель кластеризации, как понять, насколько хороши кластеры?
Единого ответа нет. В классическом обучении с учителем вы сравниваете предсказания с истинными метками и получаете показатель точности. С кластеризацией так нельзя. Вы выбрали k=5, но не будет ли лучше другое значение k? Без меток вы не узнаете, нашёл ли алгоритм структуру или просто разбил данные на случайные части.
Коэффициент силуэта — это нужная вам метрика. Она показывает, насколько хорошо каждая точка подходит своему кластеру относительно ближайшего чужого, и это один из самых широко используемых показателей. Он работает без меток и легко интерпретируется.
В этой статье я разберу формулу и её чтение, покажу пример на Python со scikit-learn и расскажу, когда это подходящее решение, а когда — нет.
Вы новичок в кластеризации? Прочитайте наш учебник Введение в кластеризацию k-Means со scikit-learn, чтобы понять, как работает алгоритм и как использовать его в Python.
Что такое коэффициент силуэта?
Коэффициент силуэта — это число от -1 до 1, которое показывает, насколько хорошо каждая точка соответствует своему кластеру.
Оно отражает две вещи:
- Насколько близка точка к другим точкам в своём кластере
- Насколько далеко она находится от ближайшего кластера, к которому не принадлежит
Если точка хорошо «укрыта» внутри своей группы и далеко от других, балл высокий. Если она на границе, ближе к соседнему кластеру, чем к своему, балл низкий.
В двух словах, коэффициент силуэта показывает баланс: он учитывает и тесноту точек внутри кластера, и степень разделения кластеров между собой. Оба аспекта одинаково важны. Кластеризация, которая плотно группирует точки, но располагает кластеры почти вплотную, бесполезна — как и та, что хорошо разводит кластеры, но допускает сильную «расплывчатость» внутри них.

Хорошо разделённые кластеры по сравнению с перекрывающимися
Чем выше балл, тем лучше определены кластеры. Значение, близкое к 1, означает, что точки плотно расположены внутри своего кластера и далеко от остальных. Значение, близкое к 0, указывает на перекрытие кластеров или размытые границы. Отрицательное значение значит, что точка ближе к другому кластеру, чем к назначенному.
Как работает коэффициент силуэта?
Каждая точка получает свой коэффициент силуэта, и он рассчитывается на основе двух расстояний.
Первое — это среднее расстояние от точки до остальных точек в назначенном ей кластере. Малое значение значит, что точка близка к другим в кластере. Большое — что точка слабо связана со своим кластером.
Второе — это среднее расстояние от точки до точек в ближайшем соседнем кластере. Большое значение означает явное разделение от других кластеров. Малое — что точка близка к границе.

Расстояние точки до кластеров
Значение силуэта сравнивает эти два числа. Точка глубоко внутри своего кластера и далеко от других получает высокий балл. Точка на границе (близко к другому кластеру) — низкий. Точка, которая ближе к чужому кластеру, чем к своему, — отрицательный.
Важно помнить, что ни одно из расстояний само по себе не достаточно.
Плотный кластер может располагаться вплотную к другому. Хорошо разделённый кластер может быть разреженным внутри. Нужны оба расстояния, чтобы доверять назначению.
Формула коэффициента силуэта
Вот формула для одной точки:

Формула коэффициента силуэта
Где:
-
a— среднее расстояние от точки до всех остальных точек в том же кластере -
b— среднее расстояние от точки до всех точек в ближайшем соседнем кластере
Формула делит разницу между b и a на большее из этих двух значений.
В целом можно руководствоваться такими ориентирами при интерпретации:
-
Когда
bнамного больше, чемa: Точка далеко от других кластеров и близка к своему. Числитель близок кb, знаменатель тожеb, и балл близок к 1 -
Когда
aнамного больше, чемb: Точка ближе к другому кластеру, чем к своему. Числитель — большое отрицательное число, близкое к-a, знаменатель —a, и балл близок к -1 -
Когда
aиbпримерно равны: Точка на границе между кластерами. Числитель близок к 0, и балл тоже близок к 0
Далее — немного деталей.
Как интерпретировать коэффициент силуэта
Ниже приведены ориентиры для чтения коэффициента силуэта:
- Близко к 1: Точки хорошо внутри своих кластеров и далеко от других
- Около 0,7: Хорошая кластеризация: группы различимы, а точки близки к другим точкам своего кластера
- Около 0,5: Приемлемая кластеризация: есть некоторое перекрытие, но кластеры различимы
- Близко к 0: Кластеры перекрываются или границы неясны. Структура может быть мнимой
- Ниже 0: Точки ближе к «чужому» кластеру. Такое бывает при неверном выборе числа кластеров или когда данные плохо кластеризуются изначально.
Эти пороги — лишь ориентиры. То, что считать хорошим коэффициентом силуэта, зависит от набора данных.
Разреженные и высокоразмерные данные часто дают более низкие баллы, даже когда кластеры качественные. Плотные и хорошо разделённые данные могут давать значения выше 0,7. Следует сравнивать баллы между моделями на одном и том же датасете, а не с универсальным порогом.
Как вычислить коэффициент силуэта
Коэффициент силуэта рассчитывается поочерёдно для каждой точки. Вот как это работает для одной точки.
Шаг 1: Вычислите a — среднее расстояние от точки до каждой другой точки в её кластере. Если в кластере 4 другие точки, а расстояния до них равны 1.2, 1.5, 1.0 и 1.3:

Вычисление коэффициента силуэта (1)
Шаг 2: Найдите ближайший соседний кластер (тот, для которого, кроме собственного, среднее расстояние от точки минимально). Затем вычислите b — среднее расстояние от точки до каждой точки в этом кластере. Если в ближайшем кластере 5 точек на расстояниях 2.4, 2.8, 3.0, 2.6 и 2.7:

Вычисление коэффициента силуэта (2)
Шаг 3: Подставьте a и b в формулу:

Вычисление коэффициента силуэта (3)
Шаг 4: Повторите для каждой точки набора данных. Общий коэффициент силуэта для кластеризации — это среднее по всем точкам.
Пример вычисления коэффициента силуэта в Python
Scikit-learn предоставляет две функции для расчёта коэффициента силуэта, обе в sklearn.metrics:
-
silhouette_score()возвращает средний балл для всей кластеризации -
silhouette_samples()возвращает балл для каждой отдельной точки
Вот как использовать их с KMeans на синтетическом датасете:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples
# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")
# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")
Запустив приведённый выше код, вы получите следующий вывод:

Вывод примера на Python
Общий балл 0.791 означает, что четыре кластера хорошо определены и разделены.
Показатели по точкам позволяют анализировать каждую запись.
Точки с высокими индивидуальными баллами хорошо внутри своих кластеров. Точки с низкими или отрицательными баллами находятся на границе или неверно отнесены — это удобно для поиска выбросов и проверки пограничных случаев.
Выбор оптимального числа кластеров
Одна из самых распространённых задач с коэффициентом силуэта — подобрать правильное k для KMeans.
Это делается в три шага:
- Обучите KMeans на ряде значений k
- Рассчитайте коэффициент силуэта для каждого обучения
- Выберите
kс наибольшим значением
Вот код для этого:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)
# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
scores.append(silhouette_score(X, labels))
print(f"k={k}: silhouette = {scores[-1]:.3f}")
Для каждого значения k вы увидите такой результат:

Коэффициент силуэта для разных значений k
Самый высокий балл при k=4. Это и есть подходящее значение.
Важно помнить, что коэффициент силуэта не заменяет предметную экспертизу. Если бизнес-задача требует 5 сегментов клиентов, а наибольшее значение силуэта при 4, не стоит автоматически выбирать 4. Метрика показывает, где в данных наиболее чистая структура, но иногда правильное число кластеров — то, которое соотносится с чем-то значимым в вашей задаче.
Коэффициент силуэта и другие метрики кластеризации
Коэффициент силуэта — вероятно, самая распространённая метрика для оценки кластеризации, но не единственная. Вот как он сравнивается с альтернативами.
Коэффициент силуэта vs. метод локтя
Метод локтя — визуальный приём выбора k в KMeans. Вы обучаете модели для ряда значений k, строите график инерции (суммы квадратов внутри кластеров) по k и выбираете значение, где кривая резко меняет наклон.
Преимущество метода локтя — скорость и простота. Но «локоть» виден не всегда. На «шумных» данных кривая может быть гладкой, и точку перегиба трудно определить.
Коэффициент силуэта даёт конкретное число для каждого k, что позволяет сравнивать осмысленно. Он вычисляется медленнее, но не оставляет решение на усмотрение визуальной интерпретации.
Используйте метод локтя для быстрой проверки здравого смысла. Пользуйтесь коэффициентом силуэта, когда нужен обоснованный ответ.
Коэффициент силуэта vs. индекс Дэвиса—Булдина
Индекс Дэвиса—Булдина (DBI) измеряет среднее сходство каждого кластера с наиболее похожим на него. Чем ниже DBI, тем лучше кластеризация; идеальное значение — 0.
DBI использует центроиды кластеров для расчёта сходства, поэтому на больших данных он быстрее коэффициента силуэта. Он также поощряет плотные и хорошо разделённые кластеры.
Но DBI сообщает только о кластеризации в целом. Коэффициент силуэта даёт ещё и показатели по точкам, что помогает находить пограничные случаи и выбросы.
Используйте DBI при работе с большими датасетами, когда важна скорость. Коэффициент силуэта — когда нужен анализ на уровне отдельных точек.
Коэффициент силуэта vs. индекс Калински—Харабаса
Индекс Калински—Харабаса (CH), также известный как критерий отношения дисперсий, — это отношение межкластерной дисперсии к внутрикластерной. Более высокие значения означают лучшую кластеризацию, верхней границы нет.
CH быстрый и хорошо работает на больших данных, так как использует только агрегаты по кластерам. Как и силуэт и DBI, лучше всего подходит для выпуклых, хорошо разделённых кластеров.
У CH также нет естественной шкалы, поэтому сравнивать значения можно только между моделями на одном и том же датасете, а не между разными наборами данных.
Используйте CH, когда датасет большой и нужно быстро получить результат. Коэффициент силуэта — когда важна интерпретируемость и анализ отдельных точек.
Внутренние и внешние метрики кластеризации
Описанные выше метрики (силуэт, DBI, CH, локоть) — внутренние. Они оценивают кластеризацию, опираясь только на сами данные, без «истинных» меток. Поэтому они — стандартный выбор для реальных задач кластеризации, где меток нет.
Внешние метрики сравнивают присвоение кластеров с известными метками. Примеры: скорректированный индекс Рэнда (ARI), нормированная взаимная информация (NMI), однородность. Их используют, когда метки есть и нужно проверить, насколько хорошо алгоритм их воспроизводит.
Используйте внутренние метрики, когда меток нет — это типичный случай. Внешние — при сравнительном тестировании алгоритмов на размеченных данных.
Ниже — краткое сравнение метрик:
| Метод | Диапазон | Лучшее значение | Скорость | Использовать для |
|---|---|---|---|---|
| Коэффициент силуэта | -1 до 1 | Близко к 1 | Медленно на больших датасетах | Интерпретация и анализ по точкам |
| Метод локтя | 0 до бесконечности | Ищите «локоть» | Быстро | Быстрые проверки |
| Индекс Дэвиса—Булдина | 0 до бесконечности | Близко к 0 | Быстро | Большие датасеты |
| Индекс Калински—Харабаса | 0 до бесконечности | Чем выше, тем лучше | Быстро | Большие, неразмеченные датасеты |
Коэффициент силуэта по сравнению с альтернативами
Ограничения коэффициента силуэта
У коэффициента силуэта есть несколько важных ограничений:
- Предполагает кластеризацию на основе расстояний: по умолчанию используется евклидово расстояние. Метрика хорошо подходит для KMeans и других алгоритмов на центроидах, но плохо согласуется с методами плотности, такими как DBSCAN, где кластеры имеют произвольные формы и нет чётких центроидов
- Лучше всего работает с небольшими, хорошо разделёнными кластерами: метрика поощряет плотные, сферические кластеры, расположенные далеко друг от друга. Если кластеры близки или перекрываются, балл будет низким, даже если кластеризация корректна
- Не лучшая для нерегулярных форм кластеров: В реальности кластеры не всегда выпуклые. В таких случаях баллы могут быть низкими, даже при верных назначениях
- Вычислительная стоимость на больших данных: для расчёта требуются попарные расстояния между точками, что масштабируется как
O(n^2). На наборах с миллионами точек это становится дорого - Чувствительность к выбранной метрике расстояния: Значения зависят от того, используете ли вы евклидово, манхэттенское, косинусное или другое расстояние. Если данные не соответствуют предпосылкам евклидовой метрики, коэффициент силуэта может вводить в заблуждение
Лучшие практики использования коэффициента силуэта
Коэффициент силуэта работает лучше всего, если соблюдать несколько простых правил:
- Сравнивайте несколько решений кластеризации: Не ограничивайтесь одним значением силуэта. Обучайте модели кластеризации с разными значениями
k(или разными алгоритмами) и сравнивайте их результаты бок о бок - Визуализируйте кластеры вместе с метрикой: Одного числа недостаточно. Постройте графики кластеров и оцените, имеют ли формы смысл
- Не оптимизируйте только по максимальному баллу: Кластеризация с k=2 часто даёт более высокий балл, чем
k=5, даже если 5 кластеров имеют смысл в вашей задаче - Комбинируйте с предметной экспертизой: Метрика показывает, где структура данных чище. Экспертиза подсказывает, какая структура действительно полезна. Используйте и то и другое
- Оценивайте несколькими метриками кластеризации: Silhouette, DBI, CH и другие метрики по-разному измеряют качество. Если они согласуются — вы на верном пути; если нет — изучайте данные
Заключение
Коэффициент силуэта — один из самых интуитивных способов оценить кластеризацию, потому что он показывает и плотность точек внутри кластеров, и степень их разделения.
Его считают по точкам, усредняют и получают одно число от -1 до 1. Чем ближе к 1 — тем лучше определены кластеры; значения около 0 и ниже указывают, что структура, возможно, несущественна.
Но коэффициент силуэта — лишь начало. Сопровождайте его визуализациями кластеров и, главное, своей предметной экспертизой. Доверять результату стоит, когда все эти источники «сходятся».
Коэффициент силуэта — часть большой темы обучения без учителя в Python. Запишитесь сегодня и научитесь кластеризовать, преобразовывать, визуализировать и извлекать инсайты из неразмеченных данных.