Menu
CoddyTech

Quan sát 64 chiều

Thuộc phần Học không giám sát trong hành trình Machine Learning của Coddy. Bài học 29 trên 51.

Chương này áp dụng PCA cho các chữ số viết tay. Khi kết thúc chương, bạn sẽ nén một ảnh quét thành vài con số rồi dựng lại ảnh:

Một chữ số 9 viết tay được dựng lại năm lần: từ 2 con số thành một hình mờ màu xám, từ 5 và 10 thành chữ số 9 thô, từ 20 thành chữ số 9 rõ nét, và cuối cùng là ảnh quét 64 pixel thật

Trước tiên, hãy quan sát. Một bản quét có 64 pixel và không biểu đồ nào có 64 trục, vì vậy PCA nén chúng xuống còn 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))

Ở đây không có bộ chuẩn hóa: mọi pixel đều dùng chung một đơn vị, với giá trị mực từ 0 đến 16.

Các bản quét chữ số dưới dạng chấm trên hai thành phần, mỗi chữ số được ghi nhãn ở tâm: các số 0 ở phía dưới, các số 4 ở xa bên phải, các số 3 ở xa bên trái, các chữ số khác nằm thành từng cụm ở giữa, một số cụm chồng lên nhau

PCA chưa từng thấy y; nó chỉ tô màu các chấm. Thế nhưng, mỗi chữ số lại tụ thành một vùng riêng: cấu trúc nằm trong các điểm ảnh.

challenge icon

Thử thách

Trung bình

Một ứng dụng viết tay cho trẻ em muốn biết những chữ số nào trẻ có thể nhầm lẫn. Chương trình đọc một số chữ số được nhập liền nhau như 358 vào chosen.

  1. Nén toàn bộ 1,797 bản quét thành 2 con số bằng PCA, đưa vào points.
  2. Vẽ các bản quét của từng chữ số đã chọn thành biểu đồ phân tán, gắn nhãn bằng chữ số đó. Thêm chú giải rồi hiển thị biểu đồ.
  3. Gọi report_closest(points, y, chosen).

Với 046, chương trình in ra:

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

và vẽ biểu đồ này. Sau đó, Coddy mô tả biểu đồ của bạn:

Biểu đồ phân tán có tiêu đề Các chữ số trông giống nhau cùng chú giải: các số 0 ở thấp bên trái, các số 6 ở thấp ở giữa, các số 4 ở cao bên phải, các số 6 nằm sát các số 4

Tự làm thử

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


# Từ Measuring Similarity: in ra hai chữ số đã chọn có tâm gần nhau nhất trên bản đồ
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 ảnh quét: mỗi ảnh có 64 pixel trong X, chữ số được vẽ nằm trong y
digits = load_digits()
X = digits.data
y = digits.target

# Các chữ số cần so sánh, nhập liền nhau như 358
chosen = []
for ch in input():
    chosen.append(int(ch))

# Đừng thay đổi các dòng bên dưới
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# Viết code bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học không giám sát

Tự luyện tập: Trình biên dịch Python online