Học máy - Phân cụm theo cấp bậc
Trên trang này, W3schools.com hợp tác với Học viện Khoa học Dữ liệu NYC để cung cấp nội dung đào tạo kỹ thuật số cho sinh viên của chúng tôi.
Phân cụm theo cấp bậc
Phân cụm theo cấp bậc là một phương pháp học không giám sát để phân cụm các điểm dữ liệu. Thuật toán xây dựng các cụm bằng cách đo lường sự khác biệt giữa các dữ liệu. Học không giám sát có nghĩa là một mô hình không cần phải được đào tạo và chúng ta không cần biến "mục tiêu". Phương pháp này có thể được sử dụng trên bất kỳ dữ liệu nào để trực quan hóa và giải thích mối quan hệ giữa các điểm dữ liệu riêng lẻ.
Ở đây, chúng ta sẽ sử dụng phân cụm theo cấp bậc để nhóm các điểm dữ liệu và trực quan hóa các cụm bằng cách sử dụng cả sơ đồ dendrogram và biểu đồ phân tán.
Làm thế nào nó hoạt động?
Chúng tôi sẽ sử dụng Phân cụm kết tụ, một loại phân cụm phân cấp theo cách tiếp cận từ dưới lên. Chúng tôi bắt đầu bằng cách coi mỗi điểm dữ liệu là cụm riêng của nó. Sau đó, chúng tôi nối các cụm có khoảng cách ngắn nhất giữa chúng lại với nhau để tạo ra các cụm lớn hơn. Bước này được lặp lại cho đến khi một cụm lớn được hình thành chứa tất cả các điểm dữ liệu.
Phân cụm theo cấp bậc yêu cầu chúng ta phải quyết định cả phương pháp khoảng cách và liên kết. Chúng tôi sẽ sử dụng khoảng cách Euclide và phương pháp liên kết Ward, nhằm cố gắng giảm thiểu phương sai giữa các cụm.
Ví dụ
Bắt đầu bằng cách trực quan hóa một số điểm dữ liệu:
import numpy as np
import matplotlib.pyplot as plt
x = [4, 5, 10, 4,
3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
plt.scatter(x, y)
plt.show()
Kết quả
Chạy ví dụ »QUẢNG CÁO
Bây giờ chúng tôi tính toán liên kết phường bằng khoảng cách euclide và trực quan hóa nó bằng chương trình dendrogram:
Ví dụ
import numpy as np
import matplotlib.pyplot as plt
from
scipy.cluster.hierarchy import dendrogram, linkage
x = [4, 5, 10, 4, 3,
11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
data = list(zip(x, y))
linkage_data = linkage(data, method='ward',
metric='euclidean')
dendrogram(linkage_data)
plt.show()
Kết quả
Chạy ví dụ »Ví dụ
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster
import AgglomerativeClustering
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
data = list(zip(x, y))
hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean',
linkage='ward')
labels = hierarchical_cluster.fit_predict(data)
plt.scatter(x, y, c=labels)
plt.show()
Kết quả
Chạy ví dụ »Ví dụ giải thích
Nhập các mô-đun bạn cần.
import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.cluster import AgglomerativeClustering
Bạn có thể tìm hiểu về mô-đun Matplotlib trong "Hướng dẫn Matplotlib của chúng tôi.
Bạn có thể tìm hiểu về mô-đun SciPy trong Hướng dẫn SciPy của chúng tôi.
NumPy là thư viện để làm việc với mảng và ma trận trong Python, bạn có thể tìm hiểu về mô-đun NumPy trong Hướng dẫn NumPy của chúng tôi.
scikit-learn là một thư viện phổ biến dành cho học máy.
Tạo các mảng giống với hai biến trong tập dữ liệu. Lưu ý rằng mặc dù chúng tôi chỉ sử dụng hai biến ở đây nhưng phương pháp này sẽ hoạt động với bất kỳ số lượng biến nào:
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
Biến dữ liệu thành một tập hợp các điểm:
data = list(zip(x, y))
print(data)
Kết quả:
[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (6, 22), (10, 21), (12, 21)]
Tính toán mối liên kết giữa tất cả các điểm khác nhau. Ở đây, chúng tôi sử dụng thước đo khoảng cách euclide đơn giản và liên kết của Ward, nhằm tìm cách giảm thiểu phương sai giữa các cụm.
linkage_data = linkage(data, method='ward', metric='euclidean')
Cuối cùng, vẽ kết quả dưới dạng dendrogram. Biểu đồ này sẽ cho chúng ta thấy thứ bậc của các cụm từ dưới cùng (các điểm riêng lẻ) đến trên cùng (một cụm duy nhất bao gồm tất cả các điểm dữ liệu).
plt.show()
cho phép chúng ta trực quan hóa chương trình dendro thay vì chỉ dữ liệu liên kết thô.
dendrogram(linkage_data)
plt.show()
Kết quả:
Thư viện scikit-learn cho phép chúng ta sử dụng phân cụm theo cấp bậc theo một cách khác. Đầu tiên, chúng ta khởi tạo lớp AgglomerativeClustering
với 2 cụm, sử dụng cùng khoảng cách Euclide và liên kết Ward.
hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
Phương thức .fit_predict
có thể được gọi trên dữ liệu của chúng tôi để tính toán các cụm bằng cách sử dụng các tham số đã xác định trên số cụm đã chọn của chúng tôi.
labels = hierarchical_cluster.fit_predict(data) print(labels)
Kết quả:
[0 0 1 0 0 1 1 0 1 1]
Cuối cùng, nếu chúng ta vẽ đồ thị cùng một dữ liệu và tô màu các điểm bằng cách sử dụng nhãn được gán cho từng chỉ mục bằng phương pháp phân cụm theo cấp bậc, chúng ta có thể thấy cụm mà mỗi điểm được gán cho:
plt.scatter(x, y, c=labels)
plt.show()
Kết quả: