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:
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.
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.
Thử thách
Trung bìnhMộ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.
- Nén toàn bộ 1,797 bản quét thành 2 con số bằng PCA, đưa vào
points. - 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 đồ.
- 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:
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
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
1Tìm các nhóm
Học không cần nhãnĐo độ tương đồngTự thực hiện K-MeansK-Means trong scikit-learnÔn tập: thành viên phòng gym7PCA trong thực tế
Quan sát 64 chiềuCác thành phần như mẫu hìnhNén và dựng lạiPCA trước khi xây dựng mô hìnhÔn tập: máy quét khuôn mặt10Dự án: Khám phá chữ số
Quan sát các chữ sốThu gọn bằng PCAPhân cụm chữ sốĐặt tên cho các cụmTìm những chữ số khác biệt2Chọn k
Quán tínhPhương pháp khuỷu tayĐiểm số SilhouetteChuẩn hóa thang đo trước khi phân cụmÔn tập: Các vùng giao hàngTự luyện tập: Trình biên dịch Python online