Menu
CoddyTech

Агломеративные модели

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 17 из 51.

Автомобили занимают две парковки, между которыми вдоль дороги выстроилась вереница машин. Два способа объединить их в 2 кластера:

Две диаграммы с одними и теми же 102 автомобилями. Слева, метод Уорда: северная парковка и южная парковка — это два кластера из 53 и 49 автомобилей, дорога разделена между ними. Справа, метод одиночной связи: один кластер из 101 автомобиля и 1 одинокий автомобиль

scikit-learn выполняет объединение. Укажите, где остановиться, с помощью n_clusters:

from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters=2, linkage="ward")
labels = model.fit_predict(X)

linkage определяет расстояние между двумя группами:

  • "ward", значение по умолчанию: сохраняет группы компактными
  • "complete": расстояние между самой удалённой парой элементов
  • "average": среднее расстояние между всеми парами
  • "single": расстояние между самой близкой парой элементов

Single следует цепочкам: здесь дорога поглощает обе автостоянки. Ward формирует компактные, равномерные группы.

challenge icon

Задание

Средне

Земляника растёт на трёх участках, а ещё несколько растений — вдоль тропинки. Какой метод связывания обнаружит эти участки? plants содержит их координаты.

  1. Для каждого метода связывания из linkages раздели растения на 3 группы.
  2. Выведи размеры групп в виде списка, начиная с самой большой.
  3. Если в самой большой группе больше половины растений, добавь chained.

Для другого луга:

ward: [40, 38, 31]
complete: [41, 37, 31]
average: [41, 37, 31]
single: [86, 22, 1] chained

Попробуйте сами

import numpy as np
import pandas as pd
from sklearn.cluster import AgglomerativeClustering

# Расположение 109 кустов лесной земляники на лугу (в метрах): три группы и тропинка
rng = np.random.default_rng(4)
plants = np.round(np.concatenate([
    rng.normal([2, 3], 0.8, size=(40, 2)),
    rng.normal([9, 4], 1.0, size=(35, 2)),
    rng.normal([6, 10], 0.9, size=(25, 2)),
    np.column_stack([np.linspace(3, 8, 9), np.linspace(3.2, 4, 9)]) + rng.normal(0, 0.15, size=(9, 2)),
]), 2)
linkages = ["ward", "complete", "average", "single"]

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python