Menu
CoddyTech

Инерция

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

Эта глава посвящена выбору k. К концу главы ты выберешь его для доставок пекарни и нанесёшь зоны на карту:

Карта точек доставки в городе: восток по горизонтали в км, север по вертикали в метрах; точки разделены на три зоны по 45, 40 и 25 остановок, в центре каждой — чёрная звезда

Сначала рассмотрим оценку. Inertia суммирует квадраты расстояний от каждой точки до её центра: значение небольшое, когда точки близко к своим центрам.

36 яблок в трёх группах, каждое соединено тонкой серой линией с чёрным центром-звездой своей группы. Inertia возводит длину каждой линии в квадрат и суммирует их

KMeans хранит это в inertia_. Для 180 яблок:

for k in [1, 2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, round(km.inertia_))

Это выводит:

1 1718
2 752
3 230
4 196

Больше центров, короче спицы: inertia всегда уменьшается с ростом k. Если для каждой точки есть свой центр, она равна 0, поэтому наименьшее значение — не лучший вариант.

challenge icon

Задание

Легко

Гончарная мастерская упаковывает вазы в коробки нескольких размеров. Для каждой вазы выбирают ближайший размер; инерция показывает, насколько плохо они подходят. Программа считывает budget — максимально допустимое несоответствие.

  1. Пробуйте k = 1, 2, 3 и так далее: обучайте KMeans на vases и выводите инерцию для каждого k, округлив её.
  2. Остановитесь на первом k, для которого инерция укладывается в бюджет, и выведите его.

Для другой гончарной мастерской:

k = 1, inertia 15120
k = 2, inertia 4811
k = 3, inertia 1290
Box sizes needed: 3

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

import numpy as np
from sklearn.cluster import KMeans

# Не меняйте строки ниже
rng = np.random.default_rng(8)
# Четыре вида ваз: типичные высота и ширина в см, а также количество каждого вида
kinds = [(15, 8, 25), (38, 13, 25), (22, 22, 20), (58, 26, 10)]
parts = []
for h, w, n in kinds:
    parts.append(np.column_stack([rng.normal(h, 2.5, n), rng.normal(w, 2, n)]))
# 80 ваз, по одной в каждой строке: высота и ширина в см
vases = np.round(np.concatenate(parts), 1)

# Максимальная допустимая для гончарной мастерской неоднородность, выраженная через инерцию
budget = int(input())

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

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

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

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