Menu
CoddyTech

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:

Bản đồ ban đêm của một thung lũng: một thị trấn dài uốn cong, một thị trấn hình tròn và một ngôi làng nhỏ, mỗi nơi có màu sắc và ký hiệu riêng, cùng 10 ánh đèn đơn độc được đánh dấu bằng dấu x màu xám ở giữa các nơi đó

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 đó:

Hai biểu đồ về cùng 200 con hải cẩu trên hai bãi cát cong. Bên trái, k-means chia chúng thành nửa bên trái và nửa bên phải. Bên phải, DBSCAN tìm ra toàn bộ từng bãi cát, với một vòng tròn nhỏ có nhãn eps quanh một con hải cẩu

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.

challenge icon

Thử thách

Trung bình

Trê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.

  1. Huấn luyện DBSCAN với eps đó và min_samples=5, lưu các nhóm người vào labels.
  2. In ra số nhóm người mà chương trình tìm thấy.
  3. 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: 3

Biểu đồ có tiêu đề Skaters on the Lake: đường trượt hình chữ S uốn lượn với 150 người trượt băng màu xanh dương, một nhóm tròn gồm 30 người màu cam phía trên khúc cua bên trái và một nhóm 22 người màu xanh lá cây phía dưới khúc cua bên phải, cùng chú giải về kích thước các nhóm

Coddy 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
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