Menu
CoddyTech

Центры в реальных единицах

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

Центр кластера — это его типичный представитель. K-means нашёл центры парка развлечений в масштабированных данных, поэтому они выражены в виде z-оценок. Те же центры до и после:

Два графика посетителей парка развлечений с центрами 3 кластеров, отмеченными крестиками. Слева — масштабированные оси: центры находятся на таких значениях, как 0.8, 1.3. Справа — реальные единицы измерения: те же центры при 6.8 часах и 13.9 аттракционах, 6.0 и 6.2, 2.4 и 3.0

Сохрани масштабатор: он запоминает среднее значение и разброс каждого признака, а inverse_transform отменяет масштабирование:

scaler = StandardScaler()
km.fit(scaler.fit_transform(park))
centers = scaler.inverse_transform(km.cluster_centers_)
print(centers.round(1))

Здесь выводятся часы, поездки и возраст, по одной строке на кластер:

[[ 6.   6.2 38.4]
 [ 2.4  3.  45.8]
 [ 6.8 13.9 20.7]]

Центр кластера 2 был равен 0.8 и 1.3. Теперь это 6.8 часа и 13.9 поездки: та же точка, но в единицах, понятных человеку.

challenge icon

Задание

Средне

Производитель перчаток преобразует кластеры рук в 4 размера перчаток. В начальном коде масштабируются 150 рук, они объединяются в кластеры, а рука клиента считывается в new_hand.

  1. Найди кластер, к которому присоединится новая рука: сначала масштабируй её.
  2. Преобразуй центры обратно в см.
  3. Выведи центр этого кластера с точностью до 1 десятичного знака, как показано ниже.

Для другого производителя перчаток:

Your glove size: hand 20.3 cm, palm 8.9 cm, finger 8.6 cm

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

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# 150 рук, измеренных изготовителем перчаток, в см: длина кисти, ширина ладони, длина среднего пальца
hands = pd.read_csv("hands.csv")
scaler = StandardScaler()
scaled = scaler.fit_transform(hands)
# По одному кластеру на каждый размер перчаток
km = KMeans(n_clusters=4, n_init=10, random_state=0)
km.fit(scaled)

# Кисть нового клиента в виде таблицы с одной строкой и теми же столбцами
new_hand = pd.DataFrame({
    "hand_cm": [float(input())],
    "palm_cm": [float(input())],
    "finger_cm": [float(input())],
})

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

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

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

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