Menu
CoddyTech

Метод локтя

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

Постройте график зависимости inertia от k. Пока каждый новый центр разделяет настоящую группу, inertia резко падает, а затем кривая выравнивается. Изгиб, «локоть», указывает на подходящее значение k:

Две кривые зависимости inertia от k from 1 to 8. Слева — яблоки: резкое падение до k = 3, затем почти ровная линия с пунктирной отметкой на 3. Справа — точки без групп: плавная кривая без изгиба

Практическое правило: остановитесь, когда добавление ещё одного центра уменьшает inertia_ менее чем на четверть. Уменьшение для яблок: 56%, затем 69%, а потом всего 15%. Значит, k = 3:

ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")

Плавная кривая без изгибов означает, что четких групп нет. На следующем уроке появится второй судья.

challenge icon

Задание

Легко

Приложение для растений сортирует комнатные растения по планам ухода с учётом потребности в свете и воде. В стартовом коде есть значения инерции для k from 1 to 8, график и cutoff.

  1. Двигаясь вверх от k = 1, остановись там, где следующий k уменьшает инерцию меньше чем на cutoff. Выведи это k.
  2. Построй график зависимости инерции от k с точками, пунктирной вертикальной линией на значении твоего k и покажи график.

Для другого приложения, cutoff 0.25:

Care plans: 3

Кривая инерции с заголовком Elbow: Care Plans для k from 1 to 8, с точкой для каждого k: резкое падение до k = 3, затем почти ровная линия и пунктирная вертикальная линия на 3

Затем Coddy опишет твой график.

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# Не изменяйте строки ниже
rng = np.random.default_rng(17)
# Четыре вида растений: типичная потребность в свете и воде, а также количество растений
kinds = [(8.5, 2, 35), (2.5, 7.5, 30), (5, 5, 30), (8, 8, 25)]
parts = []
for l, w, n in kinds:
    parts.append(np.column_stack([rng.normal(l, 0.8, n), rng.normal(w, 0.8, n)]))
# 120 комнатных растений, по одной строке на каждое: потребность в свете и воде по шкале от 1 до 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Инерция для k от 1 до 8, из Inertia
ks = list(range(1, 9))
inertias = []
for k in ks:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(plants)
    inertias.append(km.inertia_)

cutoff = float(input())
fig, ax = plt.subplots()
ax.set_title("Elbow: Care Plans")
ax.set_xlabel("k")
ax.set_ylabel("Inertia")

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

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

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

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