64개 차원 살펴보기
Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 29번째.
이 장에서는 손글씨 숫자에 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에 저장합니다.
- PCA를 사용해 스캔 1,797개를 각각 숫자 2개로 압축하여
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")
# 아래에 코드를 작성하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
비지도 학습의 모든 레슨
직접 연습해 보세요: 온라인 Python 컴파일러