Menu
CoddyTech

64개 차원 살펴보기

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 29번째.

이 장에서는 손글씨 숫자에 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까지입니다.

두 성분을 기준으로 점으로 표시된 숫자 스캔 결과. 각 숫자는 중심에 라벨이 표시되어 있습니다. 0은 아래쪽에, 4는 맨 오른쪽에, 3은 맨 왼쪽에 있으며, 나머지 숫자는 그 사이의 영역에 있고 일부는 겹칩니다.

PCA는 y를 본 적이 없습니다. 점에 색을 입힐 뿐입니다. 그런데도 각 숫자는 저마다의 영역에 모여 있습니다. 구조는 픽셀에 있었습니다.

challenge icon

챌린지

중급

어린이용 필기 앱에서 아이들이 어떤 숫자를 헷갈릴 수 있는지 알고 싶어 합니다. 프로그램은 358처럼 숫자 몇 개를 이어서 입력받아 chosen에 저장합니다.

  1. PCA를 사용해 스캔 1,797개를 각각 숫자 2개로 압축하여 points에 저장합니다.
  2. 선택한 각 숫자의 스캔을 산점도로 표시하고, 숫자를 레이블로 붙입니다. 범례를 추가하고 그래프를 표시합니다.
  3. report_closest(points, y, chosen)를 호출합니다.

046을 입력하면 다음과 같이 출력됩니다.

Closest on the map: 4 and 6 (13.6 apart)

그리고 이 그래프를 그립니다. 그런 다음 Coddy가 그래프를 설명합니다.

Digits that look alike라는 제목의 산점도와 범례: 0은 왼쪽 아래에, 6은 가운데 아래에, 4는 오른쪽 위에 있으며, 6은 4에 맞닿아 있음

직접 해보기

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 컴파일러