Phân cụm K-Means bằng phương pháp Elbow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

K-Means Clustering với phương pháp Elbow

K-mean clustering là một thuật toán học tập không giám sát, nhóm dữ liệu dựa trên khoảng cách euclide của mỗi điểm đến một điểm trung tâm được gọi là Tâm. Các trọng tâm được xác định bởi tất cả các điểm nằm trong cùng một cụm. Đầu tiên, thuật toán chọn các điểm ngẫu nhiên làm trọng tâm và sau đó lặp lại điều chỉnh chúng cho đến khi hội tụ đầy đủ.

Một điều quan trọng cần nhớ khi sử dụng K-mean, đó là số lượng các cụm là một siêu tham số, nó sẽ được xác định trước khi chạy mô hình.

K-means có thể được triển khai bằng Scikit-Learn chỉ với 3 dòng mã. Scikit-learning cũng đã có sẵn một phương pháp tối ưu hóa centroid, kmeans ++, điều đó giúp mô hình hội tụ nhanh hơn.

Để áp dụng thuật toán phân cụm K-mean, hãy tải Chim cánh cụt Palmer tập dữ liệu, chọn các cột sẽ được nhóm lại và sử dụng Seaborn để vẽ biểu đồ phân tán với các cụm được mã hóa màu.

Chú thích: Bạn có thể tải xuống tập dữ liệu từ đây Link.

Hãy nhập các thư viện và tải tập dữ liệu Penguins, cắt nó thành các cột đã chọn và loại bỏ các hàng có dữ liệu bị thiếu (chỉ có 2):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('penguins.csv')
print(df.shape) 
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)

Chúng tôi có thể sử dụng phương pháp Elbow để có chỉ báo về các cụm cho dữ liệu của chúng tôi. Nó bao gồm việc giải thích một biểu đồ đường có hình khuỷu tay. Số lượng các cụm là các khúc khuỷu tay. Trục x của âm mưu là số cụm và trục y là Tổng bình phương trong cụm (WCSS) cho mỗi số cụm:

wcss = []

for i in range(1, 11):
    clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering.fit(df)
    wcss.append(clustering.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);

Phương pháp khuỷu tay cho biết dữ liệu của chúng tôi có 2 cụm. Hãy vẽ biểu đồ dữ liệu trước và sau khi phân nhóm:

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');

Phân cụm K-Means bằng phương pháp Elbow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Ví dụ này cho thấy cách phương pháp Elbow chỉ là tham chiếu khi được sử dụng để chọn số lượng cụm. Chúng tôi đã biết rằng chúng tôi có 3 loại chim cánh cụt trong tập dữ liệu, nhưng nếu chúng tôi xác định số lượng của chúng bằng cách sử dụng phương pháp Elbow, 2 cụm sẽ là kết quả của chúng tôi.

Vì K-mean nhạy cảm với phương sai dữ liệu, hãy xem thống kê mô tả của các cột mà chúng ta đang phân nhóm:

df.describe().T 

Kết quả này trong:

 					count 	mean 		std 		min 	25% 	50% 	75% 	max
bill_length_mm 		342.0 	43.921930 	5.459584 	32.1 	39.225 	44.45 	48.5 	59.6
flipper_length_mm 	342.0 	200.915205 	14.061714 	172.0 	190.000 197.00 	213.0 	231.0

Lưu ý rằng giá trị trung bình khác xa độ lệch chuẩn (std), điều này cho thấy phương sai cao. Hãy cố gắng giảm nó bằng cách chia tỷ lệ dữ liệu với Standard Scaler:

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
scaled = ss.fit_transform(df)

Bây giờ, hãy lặp lại quy trình phương pháp Elbow cho dữ liệu được chia tỷ lệ:

wcss_sc = []

for i in range(1, 11):
    clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering_sc.fit(scaled)
    wcss_sc.append(clustering_sc.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);

Phân cụm K-Means bằng phương pháp Elbow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Lần này, số lượng cụm được đề xuất là 3. Chúng tôi có thể vẽ lại dữ liệu với các nhãn cụm cùng với hai biểu đồ cũ để so sánh:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');

Phân cụm K-Means bằng phương pháp Elbow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Khi sử dụng K-means Clustering, bạn cần xác định trước số lượng các cụm. Như chúng ta đã thấy khi sử dụng một phương pháp để chọn k số lượng cụm, kết quả chỉ là gợi ý và có thể bị ảnh hưởng bởi lượng phương sai trong dữ liệu. Điều quan trọng là phải tiến hành phân tích chuyên sâu và tạo ra nhiều hơn một mô hình với các _k_s khác nhau khi phân cụm.

Nếu không có dấu hiệu trước về số lượng cụm trong dữ liệu, hãy trực quan hóa nó, kiểm tra nó và giải thích nó để xem liệu kết quả phân nhóm có hợp lý hay không. Nếu không, hãy phân cụm lại. Ngoài ra, hãy xem xét thêm một số liệu và khởi tạo các mô hình phân nhóm khác nhau - đối với K-means, hãy xem điểm số hình bóng và có thể là Phân cụm phân cấp để xem kết quả có giữ nguyên không.

Dấu thời gian:

Thêm từ xếp chồng lên nhau