Silhouette на Python: качество и размеры кластеров
Посчитайте силуэт каждого объекта, среднее качество и размеры кластеров. Для силуэта нужно от двух до N − 1 кластеров; одиночный объект внутри допустимого разбиения получает силуэт 0.
Программа курса «Классическое машинное обучение: алгоритмы и практика на Python».
Расчёт силуэта и аудит наполненности кластеров
Что уже дано
Проверяющая система выполняет решение в среде Python 3.12 с библиотеками numpy и scikit-learn. Никаких вспомогательных глобальных переменных, файлов или классов перед запуском решения не создаётся. Проверяющие тесты напрямую импортируют и вызывают функцию evaluate_clustering_partitions.
Что нужно сделать
Реализуйте функцию evaluate_clustering_partitions(X, labels, ordered_unique_labels).
Функция принимает:
X: двумерный вещественный массивnp.ndarray(или список списков) размера(N, p), где , ;labels: одномерный целочисленный массивnp.ndarray(или список чисел) длины с метками кластеров объектов;ordered_unique_labels: последовательность уникальных меток кластеров в заданном порядке аудита.
Требования к поведению функции:
- Вычислить индивидуальный коэффициент силуэта для каждого объекта выборки с помощью
sklearn.metrics.silhouette_samples. Если в кластере содержится ровно один объект (синглтон), его силуэт согласно соглашению библиотеки должен быть равен . - Рассчитать общий средний силуэт по всей выборке как среднее арифметическое элементов вектора силуэтов.
- Подсчитать фактические размеры кластеров (количество объектов выборки) строго в порядке меток из списка
ordered_unique_labels. Обратите внимание: метки могут быть произвольными целыми числами (например,[10, -1, 5]), поэтому нельзя полагаться на отождествление метки с позиционным индексом массива. - Функция должна возвращать словарь со следующими четырьмя ключами:
"sample_silhouettes": одномерный массивnp.ndarrayтипаfloat64длины с индивидуальными коэффициентами силуэта для каждой строки исходного массиваXс сохранением исходного порядка;"mean_silhouette": число типаfloat, равное среднему значению силуэта по всей выборке;"cluster_sizes": список целых чиселlist[int], где каждый элемент — число объектов в кластере с соответствующей меткой изordered_unique_labels;"has_singleton": булево значение типаbool, равноеTrue, если хотя бы один из кластеров состоит ровно из одного объекта, иFalseв противном случае.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Сигнатура функции:
def evaluate_clustering_partitions(
X: np.ndarray,
labels: np.ndarray,
ordered_unique_labels: list[int]
) -> dict:
Функция возвращает словарь указанной структуры.
Пример использования
import numpy as np
X = np.array([
[0.0, 0.0],
[0.0, 1.0],
[10.0, 10.0],
[10.0, 11.0],
[20.0, 20.0]
], dtype=float)
labels = np.array([1, 1, 5, 5, 99])
ordered_unique_labels = [5, 1, 99]
result = evaluate_clustering_partitions(X, labels, ordered_unique_labels)
print("mean_silhouette:", round(result["mean_silhouette"], 4))
print("cluster_sizes:", result["cluster_sizes"])
print("has_singleton:", result["has_singleton"])
Результат:
mean_silhouette: 0.7424
cluster_sizes: [2, 2, 1]
has_singleton: True
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
