Menu
CoddyTech

PCA

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 26 trên 51.

PCA tìm hướng có độ phân tán lớn nhất, rồi tìm hướng tốt nhất vuông góc với hướng đó, cứ thế tiếp tục: các thành phần. Với hai điểm dữ liệu rượu vang song sinh:

Hai điểm dữ liệu rượu vang song sinh đã được chuẩn hóa tạo thành một đám mây hướng lên về bên phải, với hai mũi tên đỏ từ tâm: một mũi tên dài, thành phần 1, nằm dọc theo đám mây, và một mũi tên ngắn, thành phần 2, nằm ngang qua đám mây

Bóng chiếu của mỗi hàng lên một vài thành phần đầu tiên trở thành các đặc trưng mới của hàng đó:

from sklearn.decomposition import PCA
scaled = StandardScaler().fit_transform(X)
points = PCA(n_components=2).fit_transform(scaled)
print(X.shape, points.shape)

Với cả 13 phép đo rượu vang, câu lệnh này in ra (178, 13) (178, 2).

Trước tiên, hãy chuẩn hóa tỷ lệ. PCA tập trung vào độ phân tán, nên một đặc trưng có đơn vị lớn, như hàm lượng proline lên đến hàng trăm, sẽ chiếm ưu thế chỉ nhờ độ lớn:

Hai biểu đồ PCA của 178 loại rượu vang. Bên trái, chưa chuẩn hóa: ba giống nho chồng lấn thành một vệt. Bên phải, đã chuẩn hóa trước: ba nhóm rõ ràng

challenge icon

Thử thách

Trung bình

Một phòng thí nghiệm nước kiểm tra các chai nước lấy từ ba suối, mỗi chai có 8 phép đo. Bản đồ 2D có thể giúp phân biệt các suối không? draw_springs(ax, points) tô màu các điểm 2D theo suối.

  1. Chuẩn hóa X, rồi dùng PCA giảm xuống còn 2 thành phần, lưu vào points.
  2. In ra số lượng đặc trưng trước và sau khi giảm.
  3. Vẽ các điểm bằng draw_springs rồi hiển thị biểu đồ.

Với một phòng thí nghiệm khác, có 6 phép đo:

From 6 features to 2

Biểu đồ có tiêu đề Spring Waters in 2D, với thành phần thứ nhất trên trục ngang và thành phần thứ hai trên trục dọc: các chai nước suối alpine ở góc dưới bên trái, volcanic ở góc dưới bên phải, coastal ở phía trên, cùng chú giải

Coddy mô tả bản đồ của bạn.

Tự làm thử

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# Phòng thí nghiệm nước: 8 số đo cho mỗi chai trong số 120 chai từ ba nguồn suối
waters = pd.read_csv("waters.csv")
X = waters.drop(columns="spring")


# Vẽ các điểm 2D, mỗi nguồn suối một nhóm, kèm chú giải
def draw_springs(ax, points):
    for spring in ["alpine", "volcanic", "coastal"]:
        rows = (waters["spring"] == spring).to_numpy()
        ax.scatter(points[rows, 0], points[rows, 1], s=16, label=spring)
    ax.legend()


fig, ax = plt.subplots()
ax.set_title("Spring Waters in 2D")
ax.set_xlabel("First component")
ax.set_ylabel("Second component")

# Viết code của bạn 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