Кластеризация и K-means
ЧерновикМатериалы дорабатываются и будут дополняться.
Чему научимся
- Отличать группировку без правильных ответов от задачи, в которой ответы уже известны.
- Выполнять два шага K-means: относить точки к ближайшим центрам и пересчитывать центры.
- Сравнивать результаты при разных начальных центрах и объяснять, что показывает мера компактности.
Время и подготовка: ориентир 6–8 часов с практикой. Понадобятся координаты, среднее арифметическое, квадраты чисел и основы Python. Ручные два шага — обязательный маршрут; сравнение с видами ирисов и индекс Рэнда расширяют его.
План занятия
- Разделим восемь точек на две группы без готовых меток.
- Дважды выполним шаг K-means вручную.
- Изменим начальные центры, сравним результаты и посмотрим на классический набор «Ирисы».
Группы без правильных ответов
Кружок робототехники отмечает восемь мест выдачи деталей на плане. Он хочет разделить места на две компактные группы. Координаты придуманы для занятия; по ним нельзя судить о настоящем помещении.
| Место | Координаты |
|---|---|
| A | |
| B | |
| C | |
| D | |
| E | |
| F | |
| G | |
| H |
У мест нет заранее известных названий групп. Мы сами ищем группировку по координатам — это кластеризация. Число групп
Как работает K-means
Каждая группа имеет центр — точку, координаты которой равны средним координатам членов группы. K-means повторяет два действия:
- Распределение: каждый объект относим к ближайшему центру.
- Обновление: для каждой группы считаем новый центр как среднее её точек.
Для двух точек
Первый запуск: центры слева и справа
Возьмём начальные центры
| Место | Группа | ||
|---|---|---|---|
| A | 0 | 16 | 1 |
| B | 4 | 20 | 1 |
| C | 1 | 9 | 1 |
| D | 5 | 13 | 1 |
| E | 16 | 0 | 2 |
| F | 20 | 4 | 2 |
| G | 25 | 1 | 2 |
| H | 29 | 5 | 2 |
Группа 1 содержит A–D, поэтому её новый центр —
Второй шаг: проверяем расстояния до обновлённых центров. Например, для D квадраты расстояний равны
Второй запуск: центры снизу и сверху
Оставим точки и
Оба запуска остановились, но получили разные группы. Начальные центры повлияли на итог. Названия «группа 1» и «группа 2» условны: их перестановка не меняет разбиение.
Как сравнить две группировки
Для уже полученных групп K-means складывает квадраты расстояний от точек до центров. Обозначим эту сумму
где
Классический пример: ирисы Фишера
Набор «Ирисы» — классический учебный пример машинного обучения. В нём 150 цветков трёх видов; для каждого измерены длина и ширина чашелистика и лепестка в сантиметрах. На классической диаграмме ниже каждый цветок — точка: по горизонтали длина лепестка, по вертикали ширина. Показаны все 150 записей, а не несколько выбранных цветков.
На левой диаграмме цвет показывает известный вид. Для правой диаграммы мы скрыли виды от K-means, задали
Например, цветок с лепестком
Проверим шаги на Python
Код повторяет именно ручной расчёт. В каждой паре координат порядок один и тот же: сначала
points = [(0, 0), (0, 2), (1, 0), (1, 2),
(4, 0), (4, 2), (5, 0), (5, 2)]
def distance_squared(point, center):
return sum((value - origin) ** 2 for value, origin in zip(point, center))
def step(points, centers):
groups = [[] for _ in centers]
for point in points:
nearest = min(range(len(centers)), key=lambda i: distance_squared(point, centers[i]))
groups[nearest].append(point)
if any(not group for group in groups):
raise ValueError("Одна из групп пуста; нужны другие начальные центры")
new_centers = [tuple(sum(point[j] for point in group) / len(group) for j in range(2))
for group in groups]
return groups, new_centers
centers = [(0, 0), (4, 0)]
for _ in range(2):
groups, centers = step(points, centers)
assert groups == [points[:4], points[4:]]
assert centers == [(0.5, 1.0), (4.5, 1.0)]
print("Группы:", groups)
print("Центры:", centers)
Программа останавливает пример, если какая-то группа оказалась пустой: для неё нельзя вычислить среднее. В полной реализации K-means нужно заранее выбрать способ обработки такой ситуации и повторять шаги до стабилизации либо до заданного предела итераций.
Для всех ирисов те же действия удобно выполнить библиотекой. petals содержит только две колонки измерений; известные виды iris.target в fit_predict не передаются. Начальные центры выбраны явно, поэтому результат повторяется:
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
petals = iris.data[:, 2:4]
model = KMeans(n_clusters=3, init=petals[[0, 50, 100]], n_init=1)
groups = model.fit_predict(petals)
print(model.cluster_centers_.round(2))
Для работы с таблицами удобно дать двум размерам имена столбцов и добавить найденную группу. pandas позволяет затем посмотреть средние размеры внутри каждой группы; названия видов мы по-прежнему не передаём модели:
import pandas as pd
flowers = pd.DataFrame(petals, columns=["length_cm", "width_cm"])
flowers["cluster"] = groups
print(flowers.groupby("cluster")[["length_cm", "width_cm"]].mean().round(2))
Число группы условно. Таблица средних помогает описать найденные группы, но не доказывает, что они совпали с ботаническими видами. В ноутбуке можно изменить начальные центры и увидеть, как меняются группы и их положение на диаграмме.
Практика
- Повторите два шага для начальных центров
и : выпишите группы, пересчитайте центры и проверьте распределение после обновления. Самопроверка: группы A–D и E–H, центры и ; второй шаг их не меняет. - Для тех же точек начните с
и . Выполните два шага и найдите . Самопроверка: нижняя группа A, C, E, G и верхняя B, D, F, H; центры и , . - На диаграмме ирисов найдите область, где виды versicolor и virginica перекрываются. Объясните, почему цветок
см может попасть не в группу своего вида. Самопроверка: K-means сравнивает расстояния до центров по двум выбранным признакам и не знает названия вида.
Дополнительно. Допишите к функции step цикл до неизменных центров и запустите его с обоими наборами начальных центров. Для сравнения двух разбиений можно использовать индекс Рэнда: он считает долю пар точек, для которых оба разбиения согласны — пара вместе в обоих или порознь в обоих. У восьми точек 28 пар; вертикальное и горизонтальное разбиения согласны для 12 пар, поэтому индекс равен
Типичные ошибки
- При пересчёте центра брать среднее всех точек, а не точек одной группы.
- Считать, что любой остановившийся запуск даёт лучший результат среди всех начальных центров.
- Принимать номера групп за правильные ответы или сравнивать группировки по совпадению этих номеров.
Итоги
K-means чередует распределение точек по ближайшим центрам и пересчёт центров. Начало влияет на результат, а малая сумма квадратов расстояний говорит о компактности, не о «правильном» смысле групп. Проверьте себя: почему здесь нет обучающих ответов? Что меняется после первого обновления центров? Можно ли назвать найденную группу видом ириса только по номеру? Подсказки и решения — ниже.
Самопроверка
Проверено 0 из 10
Подсказка
Правильных меток у мест нет.
Решение
B. Координаты заданы, а две группы нужны по условию задачи. Группы и их центры ещё предстоит найти.
Подсказка
Не путайте число координат и число групп.
Решение
C.
Подсказка
Возведите в квадрат разности обеих координат и сложите.
Решение
D.
Подсказка
Сравните два числа из таблицы первого шага.
Решение
A. B ближе к первому центру, поскольку
Подсказка
Найдите среднее отдельно для
Решение
B. Среднее
Подсказка
Сравните расстояния до уже обновлённых центров.
Решение
B. A–D по-прежнему ближе к левому центру, E–H — к правому. Повторное среднее даёт те же центры.
Подсказка
Первый центр получает нижние точки A, C, E, G; второй — верхние B, D, F, H.
Решение
A. Среднее нижних точек —
Подсказка
У каждой точки квадрат расстояния до своего центра равен
Решение
B. Восемь точек дают
Подсказка
Сравните вертикальное и горизонтальное разбиения.
Решение
B. Здесь получились разные устойчивые группировки. Остановка означает, что этот запуск больше не меняется, а не что все запуски дадут одно и то же.
Подсказка
На каком шаге нашего примера мы открыли названия видов?
Решение
C. K-means получал только измерения цветков. Известные виды можно открыть после группировки и сравнить с ней; если передать их алгоритму как признак, это уже не будет группировкой без правильных ответов.
Самопроверка завершена
Файлы
- Эксперименты с K-means (.ipynb) · Открыть в браузере
- Схема двух запусков (.svg)
- Ирисы — виды и группы K-means (.svg)