Практика: два запуска K-means¶
Автор: Алексей Толстиков
Работайте сверху вниз из папки 05-clustering-kmeans в копии репозитория. Нужны pandas, matplotlib, scikit-learn. В Colab достаточно открыть этот ноутбук: данные Iris входят в scikit-learn.
Сначала предположите, будут ли два разных начала приводить к одинаковым группам. Затем проверьте предположение на восьми точках и на ирисах. Номера кластеров условны.
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
points = pd.DataFrame([(0, 0), (0, 2), (1, 0), (1, 2),
(4, 0), (4, 2), (5, 0), (5, 2)], columns=['x', 'y'])
print(points)
1. Два разных начала на восьми точках¶
Сравните вертикальное и горизонтальное разбиения при одинаковом числе групп. n_init=1 означает один запуск с указанными центрами. Запишите, какие точки попали в каждую группу и какое значение inertia_ получила модель.
starts = {'слева и справа': [[0, 0], [4, 0]],
'снизу и сверху': [[0, 0], [0, 2]]}
for label, centers in starts.items():
model = KMeans(n_clusters=2, init=pd.DataFrame(centers).to_numpy(),
n_init=1, random_state=0).fit(points)
print(label, 'центры:', model.cluster_centers_.round(2).tolist(),
'группы:', model.labels_.tolist(), 'J:', round(model.inertia_, 2))
Самостоятельно. Замените вторую пару центров на (1, 0) и (5, 0). Сначала предположите, изменится ли конечное разбиение. Проверьте по labels_ и inertia_. Объясните, почему сравнивать суммы допустимо здесь: точки, число групп и масштаб одинаковы.
Самопроверка. В исходных запусках суммы равны 10 и 34. Номера групп можно переставить; сравнивать нужно состав групп и центры.
2. Ирисы: таблица и диаграмма¶
Модель увидит только длину и ширину лепестка. Известный вид нужен для интерпретации уже полученных групп, но не для обучения. На диаграмме окраска показывает найденный кластер.
iris = load_iris()
flowers = pd.DataFrame(iris.data[:, 2:4], columns=['length_cm', 'width_cm'])
initial = flowers.iloc[[0, 50, 100]].to_numpy()
model = KMeans(n_clusters=3, init=initial, n_init=1, random_state=0)
flowers['cluster'] = model.fit_predict(flowers[['length_cm', 'width_cm']])
print(flowers.groupby('cluster')[['length_cm', 'width_cm']].mean().round(2))
fig, ax = plt.subplots(figsize=(7, 4))
for group, part in flowers.groupby('cluster'):
ax.scatter(part['length_cm'], part['width_cm'], s=18, alpha=.7, label=f'Группа {group}')
ax.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
marker='X', s=130, c='black', label='Центры')
ax.set(xlabel='Длина лепестка, см', ylabel='Ширина лепестка, см', title='Ирисы после K-means')
ax.legend()
plt.show()
Самостоятельно. Возьмите другие три строки для начальных центров, например flowers.iloc[[10, 60, 110]][['length_cm', 'width_cm']].to_numpy(). Постройте модель заново. Запишите сумму квадратов расстояний, размеры групп и положение центров. Что поменялось? Если численные номера групп поменялись, сравните также их состав, а не только номера.
Дополнительно. Попробуйте KMeans(n_clusters=3, n_init=10, random_state=0) и сравните inertia_. Почему меньшая сумма не доказывает совпадения групп с видами?
Самопроверка. Проверяйте, что len(flowers) == 150, суммарный размер групп равен 150 и виды не входят в признаки. inertia_ оценивает компактность групп по двум числовым признакам; биологический смысл она не измеряет.
Самопроверка¶
1. Что известно до запуска кластеризации в нашем примере?¶
A. Правильная группа каждого места.
B. Координаты мест и выбранное число групп $K=2$.
C. Только готовые центры групп.
D. Эталонный индекс Рэнда.
2. Что означает $K=2$ в K-means?¶
A. У каждой точки две координаты.
B. Алгоритм всегда делает ровно два шага.
C. Мы ищем две группы.
D. В каждой группе должно быть по две точки.
3. Какой квадрат расстояния от B $(0,2)$ до центра $(4,0)$?¶
A. 4.
B. 8.
C. 16.
D. 20.
4. При центрах $(0,0)$ и $(4,0)$ в какую группу попадёт B $(0,2)$?¶
A. К первому центру: квадраты расстояний 4 и 20.
B. Ко второму центру: он правее.
C. Сразу в обе группы.
D. Ни в одну: координата $y$ не равна нулю.
5. Каким станет центр группы A–D после первого распределения?¶
A. $(0,1)$.
B. $(0{,}5;1)$.
C. $(1,1)$.
D. $(0{,}5;2)$.
6. Что произойдёт на втором шаге первого запуска?¶
A. Все точки сменят группу.
B. Группы не изменятся, центры останутся $(0{,}5;1)$ и $(4{,}5;1)$.
C. Число групп увеличится до восьми.
D. Центры вернутся в начальные положения.
7. Куда сдвинутся центры при начале с $(0,0)$ и $(0,2)$?¶
A. К $(2{,}5;0)$ и $(2{,}5;2)$.
B. К $(0{,}5;1)$ и $(4{,}5;1)$.
C. Оба к $(2{,}5;1)$.
D. Они не сдвинутся.
8. Какова сумма квадратов расстояний $J$ для вертикальных групп?¶
A. 8.
B. 10.
C. 17.
D. 34.
9. Оба запуска остановились. Какой вывод верен?¶
A. Они обязательно дали одинаковые группы.
B. Начальные центры могут изменить итоговую группировку.
C. Нижние группы всегда лучше левых.
D. Номера групп стали правильными ответами.
10. Когда при кластеризации ирисов можно использовать известные названия видов?¶
A. Добавить вид как ещё один признак перед запуском K-means.
B. Подменить видом номер ближайшего центра при распределении цветков.
C. Сравнить виды с полученными группами после запуска.
D. Назвать группы видами только по их номерам.
Подсказки и решения¶
Вопрос 1¶
Подсказка
Правильных меток у мест нет.
Решение
B. Координаты заданы, а две группы нужны по условию задачи. Группы и их центры ещё предстоит найти.
Вопрос 2¶
Подсказка
Не путайте число координат и число групп.
Решение
C. $K$ задаёт число групп. Число шагов и размеры групп могут быть другими.
Вопрос 3¶
Подсказка
Возведите в квадрат разности обеих координат и сложите.
Решение
D. $(0-4)^2+(2-0)^2=16+4=20$. Число 16 учитывает только одну координату.
Вопрос 4¶
Подсказка
Сравните два числа из таблицы первого шага.
Решение
A. B ближе к первому центру, поскольку $4<20$. Одна точка получает одну группу.
Вопрос 5¶
Подсказка
Найдите среднее отдельно для $x$ и для $y$.
Решение
B. Среднее $x$ равно $(0+0+1+1)/4=0{,}5$, среднее $y$ равно 1. Центр — $(0{,}5;1)$.
Вопрос 6¶
Подсказка
Сравните расстояния до уже обновлённых центров.
Решение
B. A–D по-прежнему ближе к левому центру, E–H — к правому. Повторное среднее даёт те же центры.
Вопрос 7¶
Подсказка
Первый центр получает нижние точки A, C, E, G; второй — верхние B, D, F, H.
Решение
A. Среднее нижних точек — $(2{,}5;0)$, верхних — $(2{,}5;2)$. Это другой результат на тех же данных.
Вопрос 8¶
Подсказка
У каждой точки квадрат расстояния до своего центра равен $1{,}25$.
Решение
B. Восемь точек дают $8\cdot1{,}25=10$. Это компактнее второго полученного разбиения с $J=34$.
Вопрос 9¶
Подсказка
Сравните вертикальное и горизонтальное разбиения.
Решение
B. Здесь получились разные устойчивые группировки. Остановка означает, что этот запуск больше не меняется, а не что все запуски дадут одно и то же.
Вопрос 10¶
Подсказка
На каком шаге нашего примера мы открыли названия видов?
Решение
C. K-means получал только измерения цветков. Известные виды можно открыть после группировки и сравнить с ней; если передать их алгоритму как признак, это уже не будет группировкой без правильных ответов.