KMeans на NumPy: центроиды и инерция за один шаг
Реализуйте один шаг KMeans: назначьте точки ближайшим центрам, пересчитайте центроиды и найдите инерцию. Здесь можно проверить саму механику кластеризации без запуска готового алгоритма.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Один итерационный шаг KMeans: распределение и центроиды
Что уже дано
Проверяющая система выполняет решение в среде Python 3.12 с предустановленной библиотекой numpy. Никаких глобальных переменных или скрытых файлов перед запуском решения не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию kmeans_single_step(X, centers).
Что нужно сделать
Реализуйте функцию kmeans_single_step(X, centers).
Функция принимает:
X: вещественный двумерный массивnp.ndarray(или вложенный числовой список) формы(N, p), где , — координаты точек выборки;centers: вещественный двумерный массивnp.ndarray(или вложенный числовой список) формы(k, p), где — начальные координаты центроидов.
Функция должна выполнить ровно один базовый шаг алгоритма KMeans без запуска полного цикла оптимизации scikit-learn:
- Для каждой точки найти индекс ближайшего центра из
centersпо квадрату евклидова расстояния . Гарантируется, что ничьих по расстояниям нет и каждый из центров получает хотя бы одну точку. - Пересчитать координаты каждого из центров как среднее арифметическое точек, отнесённых к этому центру на шаге 1.
- Рассчитать суммарную инерцию (сумму квадратов евклидовых расстояний от точек до их обновлённых центров) для этого же зафиксированного распределения по группам: .
Функция возвращает словарь со следующими ключами:
"labels": одномерный массивnp.ndarrayдлины с целочисленным типом (например,int64), содержащий индексы назначенных центров ();"new_centers": двумерный вещественный массивnp.ndarrayформы(k, p)с обновлёнными координатами центроидов;"inertia": вещественное числоfloat— сумма квадратов евклидовых расстояний от точек до обновлённых центроидов при закреплённом распределении.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. Проверяющая система вызывает kmeans_single_step и передаёт аргументы в виде числовых массивов или списков.
Пример использования
import numpy as np
X = np.array([[1.0, 0.0], [3.0, 0.0], [5.0, 0.0]])
centers = np.array([[0.0, 0.0], [4.0, 0.0]])
result = kmeans_single_step(X, centers)
print(result["labels"].tolist())
print(np.round(result["new_centers"], 4).tolist())
print(round(result["inertia"], 4))
Результат:
[0, 1, 1]
[[1.0, 0.0], [4.0, 0.0]]
2.0
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
