Алгоритм K-Means — это итеративный алгоритм кластеризации, который разбивает множество точек на K кластеров. Алгоритм работает следующим образом:
1.
Инициализация: задаются начальные координаты K центров кластеров
2.
Назначение: каждая точка относится к кластеру с ближайшим центром (по евклидову расстоянию)
3.
Пересчёт: центр каждого кластера пересчитывается как среднее арифметическое координат всех точек, принадлежащих этому кластеру
4.
Проверка сходимости: если центры не изменились — алгоритм завершается, иначе переход к шагу 2
Евклидово расстояние между точками
\((x_1, y_1)\) и
\((x_2, y_2)\)вычисляется по формуле:
\(d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}\)
Реализуйте алгоритм K-Means и выведите результат его работы.
Формат входных данных
- Первая строка содержит два целых числа n и k (1 <= n <= 1000, 1 <= k <= 10, k <= n) — количество точек и количество кластеров.
- Следующие n строк содержат по два вещественных числа x
i и y
i (-10
6 <= x
i, y
i <= 10
6) — координаты точек.
- Следующие k строк содержат по два вещественных числа cx
j и cy
j (-10
6 <= cx
j, cy
j <= 10
6) — начальные координаты центров кластеров.
Формат выходных данных
- Первая строка должна содержать одно целое число — количество итераций, выполненных до сходимости.
- Следующие k строк должны содержать по два вещественных числа — финальные координаты центров кластеров (в том же порядке, что и во входных данных). Координаты выводить с точностью до 2 знаков после запятой.
- Следующие n строк должны содержать по одному целому числу — номер кластера для каждой точки (нумерация с 0, в том же порядке, что и точки во входных данных).
Примечания
- Сходимость достигается, когда координаты всех центров не изменяются между итерациями (с точностью до вычислительной погрешности 1e-9)
- При сравнении расстояний, если точка равноудалена от нескольких центров, она относится к кластеру с меньшим номером
- Если кластер оказался пустым (ни одна точка не была к нему отнесена), его центр остаётся на прежнем месте
- Гарантируется, что алгоритм сойдётся не более чем за 100 итераций
Примеры
| № | Входные данные | Выходные данные |
|
1
|
6 2 1 1 2 1 1 2 8 8 9 8 8 9 0 0 10 10
|
2
1.33 1.33
8.33 8.33
0
0
0
1
1
1
|