Scikit Learn - Các phương pháp phân cụm

Ở đây, chúng ta sẽ nghiên cứu về các phương pháp phân cụm trong Sklearn sẽ giúp xác định bất kỳ sự giống nhau nào trong các mẫu dữ liệu.

Phương pháp phân cụm, một trong những phương pháp ML không giám sát hữu ích nhất, được sử dụng để tìm các mẫu tương tự & mối quan hệ giữa các mẫu dữ liệu. Sau đó, họ phân cụm các mẫu đó thành các nhóm có sự giống nhau dựa trên các tính năng. Phân cụm xác định việc phân nhóm nội tại giữa các dữ liệu không được gắn nhãn hiện tại, đó là lý do tại sao nó quan trọng.

Thư viện Scikit-learning có sklearn.clusterđể thực hiện phân cụm dữ liệu không được gắn nhãn. Trong mô-đun này, scikit-leran có các phương pháp phân nhóm sau:

KMeans

Thuật toán này tính toán các centroid và lặp lại cho đến khi nó tìm thấy centroid tối ưu. Nó yêu cầu số lượng cụm phải được chỉ định, đó là lý do tại sao nó giả định rằng chúng đã được biết đến. Logic chính của thuật toán này là tập hợp các mẫu tách dữ liệu thành n nhóm có phương sai bằng nhau bằng cách giảm thiểu tiêu chí được gọi là quán tính. Số lượng các cụm được xác định bằng thuật toán được biểu diễn bằng 'K.

Scikit-learning có sklearn.cluster.KMeansmô-đun để thực hiện phân cụm K-Means. Trong khi tính toán trung tâm cụm và giá trị quán tính, tham số có tênsample_weight cho phép sklearn.cluster.KMeans để gán thêm trọng lượng cho một số mẫu.

Tuyên truyền sở thích

Thuật toán này dựa trên khái niệm 'truyền thông điệp' giữa các cặp mẫu khác nhau cho đến khi hội tụ. Nó không yêu cầu số lượng cụm phải được chỉ định trước khi chạy thuật toán. Thuật toán có độ phức tạp về thời gian của thứ tự (2), đây là nhược điểm lớn nhất của nó.

Scikit-learning có sklearn.cluster.AffinityPropagation mô-đun để thực hiện phân cụm Truyền bá mối quan hệ.

Dịch chuyển trung bình

Thuật toán này chủ yếu phát hiện ra blobsvới mật độ mẫu mịn. Nó chỉ định lặp đi lặp lại các điểm dữ liệu cho các cụm bằng cách dịch chuyển các điểm về phía mật độ điểm dữ liệu cao nhất. Thay vì dựa vào một tham số có tênbandwidth ra lệnh cho kích thước của khu vực cần tìm kiếm, nó sẽ tự động đặt số lượng cụm.

Scikit-learning có sklearn.cluster.MeanShift để thực hiện phân cụm Mean Shift.

Phân cụm quang phổ

Trước khi phân cụm, thuật toán này về cơ bản sử dụng các giá trị riêng tức là phổ của ma trận tương tự của dữ liệu để thực hiện việc giảm kích thước ở các chiều ít hơn. Việc sử dụng thuật toán này không được khuyến khích khi có số lượng lớn các cụm.

Scikit-learning có sklearn.cluster.SpectralClustering module để thực hiện phân cụm Quang phổ.

Phân cụm phân cấp

Thuật toán này xây dựng các cụm lồng nhau bằng cách hợp nhất hoặc tách các cụm liên tiếp. Hệ thống phân cấp cụm này được biểu diễn dưới dạng dendrogram tức là cây. Nó bao gồm hai loại sau:

Agglomerative hierarchical algorithms- Trong loại thuật toán phân cấp này, mọi điểm dữ liệu được coi như một cụm duy nhất. Sau đó, nó liên tiếp kết tụ các cặp cụm. Điều này sử dụng cách tiếp cận từ dưới lên.

Divisive hierarchical algorithms- Trong thuật toán phân cấp này, tất cả các điểm dữ liệu được coi như một cụm lớn. Trong quá trình phân cụm này bao gồm việc phân chia, bằng cách sử dụng cách tiếp cận từ trên xuống, một cụm lớn thành các cụm nhỏ khác nhau.

Scikit-learning có sklearn.cluster.AgglomerativeClustering mô-đun để thực hiện phân cụm Agglomerative Hierarchical.

DBSCAN

Nó là viết tắt của “Density-based spatial clustering of applications with noise”. Thuật toán này dựa trên khái niệm trực quan về "cụm" & "nhiễu" rằng các cụm là các vùng dày đặc có mật độ thấp hơn trong không gian dữ liệu, được phân tách bằng các vùng có mật độ thấp hơn của các điểm dữ liệu.

Scikit-learning có sklearn.cluster.DBSCANđể thực hiện phân cụm DBSCAN. Có hai tham số quan trọng là min_samples và eps được sử dụng bởi thuật toán này để xác định mật độ.

Giá trị cao hơn của tham số min_samples hoặc giá trị thấp hơn của tham số eps sẽ cho biết mật độ điểm dữ liệu cao hơn cần thiết để tạo thành một cụm.

QUANG HỌC

Nó là viết tắt của “Ordering points to identify the clustering structure”. Thuật toán này cũng tìm các cụm dựa trên mật độ trong dữ liệu không gian. Logic làm việc cơ bản của nó giống như DBSCAN.

Nó giải quyết một điểm yếu chính của thuật toán DBSCAN - vấn đề phát hiện các cụm có ý nghĩa trong dữ liệu có mật độ khác nhau - bằng cách sắp xếp thứ tự các điểm của cơ sở dữ liệu theo cách mà các điểm gần nhất về mặt không gian trở thành hàng xóm trong thứ tự.

Scikit-learning có sklearn.cluster.OPTICS module để thực hiện phân cụm OPTICS.

CHIM

Nó là viết tắt của cụm từ Giảm và phân cụm lặp đi lặp lại Balanced bằng cách sử dụng cấu trúc phân cấp. Nó được sử dụng để thực hiện phân cụm phân cấp trên các tập dữ liệu lớn. Nó xây dựng một cái cây có tênCFT I E Characteristics Feature Tree, đối với dữ liệu đã cho.

Ưu điểm của CFT là các nút dữ liệu được gọi là nút CF (Tính năng Đặc điểm) giữ thông tin cần thiết cho việc phân cụm, điều này ngăn chặn nhu cầu giữ toàn bộ dữ liệu đầu vào trong bộ nhớ.

Scikit-learning có sklearn.cluster.Birch module để thực hiện phân cụm BIRCH.

So sánh các thuật toán phân cụm

Bảng sau sẽ đưa ra một so sánh (dựa trên các tham số, khả năng mở rộng và số liệu) của các thuật toán phân cụm trong scikit-learning.

Sr.No Tên thuật toán Thông số Khả năng mở rộng Số liệu được sử dụng
1 K-Means Số cụm N_samples rất lớn Khoảng cách giữa các điểm.
2 Tuyên truyền sở thích Giảm xóc Nó không thể mở rộng với n_samples Khoảng cách đồ thị
3 Mean-Shift Băng thông Nó không thể mở rộng với n_samples. Khoảng cách giữa các điểm.
4 Phân cụm quang phổ Số cụm Mức độ mở rộng trung bình với n_samples. Mức độ mở rộng nhỏ với n_clusters. Khoảng cách đồ thị
5 Phân cụm phân cấp Ngưỡng khoảng cách hoặc Số cụm N_samples lớn n_clusters lớn Khoảng cách giữa các điểm.
6 DBSCAN Kích thước của vùng lân cận N_samples rất lớn và n_clusters vừa. Khoảng cách điểm gần nhất
7 QUANG HỌC Tư cách thành viên nhóm tối thiểu N_samples rất lớn và n_clusters lớn. Khoảng cách giữa các điểm.
số 8 CHIM Hệ số ngưỡng, phân nhánh N_samples lớn n_clusters lớn Khoảng cách Euclide giữa các điểm.

K-Means Clustering trên bộ dữ liệu Scikit-learning Digit

Trong ví dụ này, chúng tôi sẽ áp dụng phân cụm K-mean trên tập dữ liệu chữ số. Thuật toán này sẽ xác định các chữ số tương tự mà không cần sử dụng thông tin nhãn gốc. Việc thực hiện được thực hiện trên sổ ghi chép Jupyter.

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape

Đầu ra

1797, 64)

Kết quả này cho thấy tập dữ liệu chữ số đang có 1797 mẫu với 64 tính năng.

Thí dụ

Bây giờ, thực hiện phân cụm K-Means như sau:

kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape

Đầu ra

(10, 64)

Kết quả này cho thấy K-mean clustering đã tạo ra 10 cụm với 64 tính năng.

Thí dụ

fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks = [], yticks = [])
axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)

Đầu ra

Đầu ra bên dưới có hình ảnh hiển thị các trung tâm cụm được học bởi K-Means Clustering.

Tiếp theo, tập lệnh Python bên dưới sẽ khớp các nhãn cụm đã học (bởi K-Means) với các nhãn thực được tìm thấy trong chúng -

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
mask = (clusters == i)
labels[mask] = mode(digits.target[mask])[0]

Chúng tôi cũng có thể kiểm tra độ chính xác với sự trợ giúp của lệnh được đề cập bên dưới.

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)

Đầu ra

0.7935447968836951

Hoàn thành ví dụ triển khai

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np

from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
digits = load_digits()
digits.data.shape
kmeans = KMeans(n_clusters = 10, random_state = 0)
clusters = kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
fig, ax = plt.subplots(2, 5, figsize = (8, 3))
centers = kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
   axi.set(xticks=[], yticks = [])
   axi.imshow(center, interpolation = 'nearest', cmap = plt.cm.binary)
from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
   mask = (clusters == i)
   labels[mask] = mode(digits.target[mask])[0]
from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)