64 измерения
Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 29 из 51.
В этой главе PCA применяется к рукописным цифрам. К её концу ты сожмёшь скан до нескольких чисел и восстановишь его:
Сначала посмотри. Скан состоит из 64 пикселей, и ни на одной диаграмме нет 64 осей, поэтому PCA сжимает их до 2:
digits = load_digits()
X = digits.data
y = digits.target
points = PCA(n_components=2).fit_transform(X)
for d in range(10):
ax.scatter(points[y == d, 0], points[y == d, 1], label=str(d))Здесь нет масштабировщика: для каждого пикселя используется одна единица измерения, значение пикселя — от 0 до 16.
PCA не видела y; она только окрашивает точки. И всё же каждая цифра собирается в собственном участке: структура была в пикселях.
Задание
СреднеПриложение для обучения детей письму хочет узнать, какие цифры дети могут перепутать. Программа считывает несколько цифр, введённых подряд, например 358, в chosen.
- Сожми все 1,797 сканов до 2 чисел каждый с помощью PCA и помести их в
points. - Построй диаграмму рассеяния для сканов каждой выбранной цифры, обозначив их этой цифрой. Добавь легенду и отобрази диаграмму.
- Вызови
report_closest(points, y, chosen).
Для 046 программа выводит:
Closest on the map: 4 and 6 (13.6 apart)и строит эту диаграмму. Затем Coddy описывает её:
Попробуйте сами
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
# Из Measuring Similarity: выводит две выбранные цифры, центры которых ближе всего друг к другу на карте
def report_closest(points, y, chosen):
best = -1
for i in range(len(chosen)):
for j in range(i + 1, len(chosen)):
a = points[y == chosen[i]].mean(axis=0)
b = points[y == chosen[j]].mean(axis=0)
dist = np.sqrt(((a - b) ** 2).sum())
if best == -1 or dist < best:
best = dist
pair = (chosen[i], chosen[j])
print(f"Closest on the map: {pair[0]} and {pair[1]} ({best:.1f} apart)")
# 1,797 изображений: по 64 пикселя в X, нарисованная цифра — в y
digits = load_digits()
X = digits.data
y = digits.target
# Цифры для сравнения, введённые подряд, например 358
chosen = []
for ch in input():
chosen.append(int(ch))
# Не изменяйте строки ниже
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение без учителя
1Поиск групп
Обучение без метокИзмерение сходстваK-Means вручнуюK-Means в scikit-learnПовторение: участники спортзала4Иерархическая кластеризация
Пошаговое объединениеАгломеративные моделиДендрограммыПовторение: породы собак7PCA на практике
64 измеренияКомпоненты как закономерностиСжимаем и восстанавливаемPCA перед обучением моделиПовторение: сканер лиц2Выбор k
ИнерцияМетод локтяОценки силуэтаМасштабирование перед кластеризациейПовторение: зоны доставкиПотренируйтесь самостоятельно: Онлайн-компилятор Python