Học máy - K-mean
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.
K-nghĩa là
K-mean 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 lặp đi lặp lại việc chia các điểm dữ liệu thành K cụm bằng cách giảm thiểu phương sai trong mỗi cụm.
Ở đây, chúng tôi sẽ chỉ cho bạn cách ước tính giá trị tốt nhất cho K bằng phương pháp khuỷu tay, sau đó sử dụng phân cụm K-mean để nhóm các điểm dữ liệu thành các cụm.
Làm thế nào nó hoạt động?
Đầu tiên, mỗi điểm dữ liệu được gán ngẫu nhiên vào một trong K cụm. Sau đó, chúng tôi tính toán trọng tâm (về mặt chức năng là trung tâm) của mỗi cụm và gán lại từng điểm dữ liệu cho cụm có trọng tâm gần nhất. Chúng tôi lặp lại quá trình này cho đến khi việc gán cụm cho từng điểm dữ liệu không còn thay đổi nữa.
Phân cụm K-mean yêu cầu chúng ta chọn K, số cụm mà chúng ta muốn nhóm dữ liệu vào. Phương pháp khuỷu tay cho phép chúng ta vẽ đồ thị quán tính (một thước đo dựa trên khoảng cách) và trực quan hóa điểm mà tại đó nó bắt đầu giảm tuyến tính. Điểm này được gọi là "elow" và là ước tính tốt cho giá trị tốt nhất của K dựa trên dữ liệu của chúng tôi.
Ví dụ
Bắt đầu bằng cách trực quan hóa một số điểm dữ liệu:
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 ta sử dụng phương pháp khuỷu tay để hình dung các khoảng trống cho các giá trị khác nhau của K:
Ví dụ
from sklearn.cluster import KMeans
data = list(zip(x, y))
inertias = []
for i in range(1,11):
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
Kết quả
Chạy ví dụ »Phương pháp khuỷu tay cho thấy 2 là giá trị tốt cho K, vì vậy chúng tôi đào tạo lại và hình dung kết quả:
Ví dụ
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.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 matplotlib.pyplot as plt
from sklearn.cluster import KMeans
Bạn có thể tìm hiểu về mô-đun Matplotlib trong "Hướng dẫn Matplotlib 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ìm giá trị tốt nhất cho K, chúng tôi cần chạy K-means trên dữ liệu của mình cho một loạt các giá trị có thể có. Chúng tôi chỉ có 10 điểm dữ liệu, vì vậy số cụm tối đa là 10. Vì vậy, với mỗi giá trị K trong phạm vi (1,11), chúng tôi huấn luyện mô hình K-mean và vẽ đồ thị xen kẽ tại số cụm đó:
inertias = []
for i in range(1,11):
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()
Kết quả:
Chúng ta có thể thấy rằng "khuỷu tay" trên biểu đồ trên (nơi đường giữa trở nên tuyến tính hơn) có K=2. Sau đó, chúng tôi có thể điều chỉnh thuật toán K-means của mình một lần nữa và vẽ biểu đồ các cụm khác nhau được gán cho dữ liệu:
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
Kết quả: