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: последовательность уникальных меток кластеров в заданном порядке аудита.

Требования к поведению функции:

  1. Вычислить индивидуальный коэффициент силуэта для каждого объекта выборки с помощью sklearn.metrics.silhouette_samples. Если в кластере содержится ровно один объект (синглтон), его силуэт согласно соглашению библиотеки должен быть равен .
  2. Рассчитать общий средний силуэт по всей выборке как среднее арифметическое элементов вектора силуэтов.
  3. Подсчитать фактические размеры кластеров (количество объектов выборки) строго в порядке меток из списка ordered_unique_labels. Обратите внимание: метки могут быть произвольными целыми числами (например, [10, -1, 5]), поэтому нельзя полагаться на отождествление метки с позиционным индексом массива.
  4. Функция должна возвращать словарь со следующими четырьмя ключами:
  • "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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи