Menu
CoddyTech

64 измерения

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

В этой главе PCA применяется к рукописным цифрам. К её концу ты сожмёшь скан до нескольких чисел и восстановишь его:

Одна рукописная цифра 9, восстановленная пять раз: из 2 чисел — размытое серое изображение, из 5 и 10 — грубая 9, из 20 — чёткая 9, а последней — настоящий скан размером 64 пикселя

Сначала посмотри. Скан состоит из 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; она только окрашивает точки. И всё же каждая цифра собирается в собственном участке: структура была в пикселях.

challenge icon

Задание

Средне

Приложение для обучения детей письму хочет узнать, какие цифры дети могут перепутать. Программа считывает несколько цифр, введённых подряд, например 358, в chosen.

  1. Сожми все 1,797 сканов до 2 чисел каждый с помощью PCA и помести их в points.
  2. Построй диаграмму рассеяния для сканов каждой выбранной цифры, обозначив их этой цифрой. Добавь легенду и отобрази диаграмму.
  3. Вызови 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")

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

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

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

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