Menu
CoddyTech

Сжимаем и восстанавливаем

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

Оценки компонентов сканирования — это рецепт: начните со среднего сканирования, затем добавьте каждый шаблон, умноженный на его оценку. inverse_transform выполняет рецепт в обратном порядке и восстанавливает 64 пикселя:

pca = PCA(n_components=10).fit(X)
codes = pca.transform(X)                # 10 чисел на каждое сканирование
rebuilt = pca.inverse_transform(codes)  # снова 64 пикселя

Вот три скана, восстановленные с использованием всё большего количества чисел:

0, 3 и 5, каждое восстановлено с использованием 2, 5, 10 и 20 чисел, а затем показан настоящий скан. При использовании 2 чисел все три выглядят как похожие размытия; при использовании 20 каждую цифру можно чётко прочитать

Небольшое количество чисел даёт размытое изображение, близкое к средней цифре; каждый добавленный компонент восстанавливает детали. Уже 20 чисел вместо 64 позволяют чётко её различить.

challenge icon

Задание

Средне

Умная ручка передаёт каждую цифру в виде k чисел PCA, которые считывает программа. Что теряется?

  1. Обучи PCA с k компонентами на X. Сожми все сканы, затем восстанови их в rebuilt.
  2. Выведи приведённые ниже строки; ошибка — это средняя абсолютная разница с X.
  3. Нарисуй самый новый скан, X[-1], на axs[0], а его восстановленную версию — на axs[1]; для обоих используй gray_r. Покажи результат.

Для 7:

Sent: 7 numbers per scan instead of 64
Average pixel error: 1.739

и нарисуй это. Затем Coddy описывает твои панели:

Два изображения размером 8 на 8 рядом: самый новый скан ручки — цифра 8 — и её восстановленная версия из 7 чисел, более размытая 8

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

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA

# 1,797 сканов по 64 пикселя; последний скан пера находится в последней строке
digits = load_digits()
X = digits.data
k = int(input())

# Не изменяйте строки ниже
fig, axs = plt.subplots(1, 2)
axs[0].set_title("Scan")
axs[1].set_title(f"Rebuilt from {k} numbers")

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

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

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

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