DBSCAN
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 20 trên 51.
Chương này tìm các đám đông có hình dạng bất kỳ và những điểm không thuộc về đám đông nào. Khi kết thúc chương, bạn sẽ lập bản đồ ánh đèn trong một thung lũng:
Trước hết, các bãi cát của hải cẩu đã khiến k-means thất bại trong bài học Khi k-means thất bại. DBSCAN theo sát các cụm đông đúc thay vào đó:
Một điểm có min_samples điểm (tính cả chính nó) nằm trong eps, bán kính của hình tròn, thuộc một đám đông. Các đám đông lan rộng qua những điểm như vậy. Không cần chọn k:
from sklearn.cluster import DBSCAN
labels = DBSCAN(eps=0.2, min_samples=5).fit_predict(X)
print(labels.max() + 1)Lệnh này in ra 2: các đám đông được đánh số bắt đầu từ 0, vì vậy số lớn nhất cộng thêm 1 sẽ cho biết có bao nhiêu đám đông.
Thử thách
Trung bìnhTrên một hồ đóng băng, những người trượt băng đua nhau trên đường trượt uốn lượn giữa hai hòn đảo, còn một đám đông theo dõi trận khúc côn cầu. k-means sẽ chia đường trượt thành nhiều đoạn. Chương trình đọc eps theo đơn vị mét.
- Huấn luyện DBSCAN với eps đó và
min_samples=5, lưu các nhóm người vàolabels. - In ra số nhóm người mà chương trình tìm thấy.
- Vẽ các nhóm bằng
draw_crowds(ax, X, labels)rồi hiển thị biểu đồ.
Với một hồ khác và eps bằng 3.5:
Crowds found: 3Coddy mô tả biểu đồ của bạn. Sau đó chạy chương trình với eps bằng 8: các nhóm người đã đi đâu?
Tự làm thử
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
# Vị trí của 170 người trượt băng trên mặt hồ đóng băng, tính bằng mét
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())
# Vẽ mỗi nhóm người bằng một màu riêng, kèm nhãn ghi số người trong nhóm
def draw_crowds(ax, X, labels):
for crowd in range(labels.max() + 1):
rows = labels == crowd
ax.scatter(X[rows, 0], X[rows, 1], s=14, label=f"{rows.sum()} skaters")
ax.legend()
fig, ax = plt.subplots()
ax.set_title("Skaters on the Lake")
ax.set_xlabel("East (m)")
ax.set_ylabel("North (m)")
# 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