Tổng quan
Bài viết này là về phân cụm bằng Python. Trong bài viết này, chúng ta sẽ xem xét hai phương pháp phân cụm khác nhau.
Đầu tiên là phân cụm KMeans và thứ hai là phân cụm MeanShift. Phân cụm KMeans là ứng dụng khai thác dữ liệu phân vùng n quan sát thành các cụm k. Mỗi quan sát thuộc về cụm với giá trị trung bình gần nhất. Trong phân cụm KMeans, bạn có thể chỉ định số lượng cụm được tạo, trong khi đó trong cụm MeanShift, số cụm được tự động phát hiện dựa trên số lượng mật độ trung tâm được tìm thấy trong dữ liệu. Thuật toán MeanShift chuyển các điểm dữ liệu lặp đi lặp lại theo chế độ, đây là mật độ điểm dữ liệu cao nhất. Nó cũng được gọi là thuật toán tìm kiếm chế độ.
Cơ sở
Phân cụm KMeans có thể đạt được bằng cách sử dụng lớp KMeans trong sklearn.cluster. Một số thông số của KMeans như sau:
- n_clusters: Số lượng cụm trọng tâm được tạo. Mặc định là 8.
- n_jobs: Số lượng công việc chạy song song. -1 có nghĩa là sử dụng tất cả các bộ xử lý. Mặc định là None.
- n_init: Số lần thuật toán sẽ chạy với các hạt trọng tâm khác. Mặc định là 10.
- verbose: Hiển thị thông tin về ước tính nếu được đặt thành 1.
- Có thể đạt được phân cụm MeanShift bằng cách sử dụng lớp MeanShift trong sklearn.cluster. Một số tham số MeanShift như sau:
- n_jobs: Số lượng công việc được chạy song song. -1 có nghĩa là sử dụng tất cả các bộ xử lý. Mặc định là None.
- bandwidth: Băng thông được sử dụng. Nếu không được chỉ định, nó được ước tính bằng cách sử dụng sklearn.estimate_bandwidth.
- verbose: Hiển thị thông tin về ước tính nếu được đặt thành 1.
Để chứng minh phân cụm, chúng ta có thể sử dụng dữ liệu mẫu được cung cấp bởi bộ dữ liệu iris trong gói sklearn.cluster. Bộ dữ liệu iris gồm 150 mẫu (50 mỗi) của 3 loại hoa iris ( Setosa, Versicolorvà Virginica) được lưu trữ 150x4 numpy.ndarray. Các hàng đại diện cho các mẫu và các cột đại diện cho Chiều dài Sepal, Chiều rộng Sepal, Chiều dài cánh hoa và Chiều rộng cánh hoa.
Cách sử dụng Code
Để thực hiện phân cụm, chúng ta có thể sử dụng dữ liệu mẫu được cung cấp bởi bộ dữ liệu iris.
Đầu tiên, chúng ta sẽ thấy việc thực hiện phân cụm KMeans.
Chúng ta có thể tải tập dữ liệu iris như sau:
from sklearn import datasets
iris=datasets.load_iris()
Sau đó, chúng ta cần trích xuất dữ liệu sepal và petal như sau:
sepal_data=iris.data[:,:2]
petal_data=iris.data[:,2:4]
Sau đó, chúng ta tạo hai đối tượng KMeans phù hợp với dữ liệu sepal và petal như sau:
from sklearn.cluster import KMeans
km1=KMeans(n_clusters=3,n_jobs=-1)
km1.fit(sepal_data)
km2=KMeans(n_clusters=3,n_jobs=-1)
km2.fit(petal_data)
Bước tiếp theo là xác định trọng tâm và nhãn của sepals và petals.
centroids_sepals=km1.cluster_centers_
labels_sepals=km1.labels_
centroids_petals=km2.cluster_centers_
labels_petals=km2.labels_
Để trực quan hóa các cụm, chúng ta có thể tạo các biểu đồ phân tán đại diện cho các cụm sepal và petal.
Vì vậy, đầu tiên chúng ta tạo đối tượng figure như sau:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
Chúng ta có thể tạo bốn ô con để hiển thị dữ liệu sepal theo hai chiều và ba chiều. Các ô con được tạo dưới dạng ma trận 2 nhân 2 với hàng đầu tiên biểu thị thông tin sepal và hàng thứ hai thể hiện thông tin petal. Cột đầu tiên của mỗi hàng hiển thị biểu đồ phân tán 2 chiều và cột thứ hai hiển thị biểu đồ phân tán 3 chiều. Hai chữ số đầu tiên của tham số đầu tiên của hàm add_subplot() đại diện cho số lượng hàng và số cột và chữ số thứ ba biểu thị số thứ tự của biểu đồ con hiện tại. Tham số thứ hai (tùy chọn) đại diện cho chế độ chiếu.
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222,projection="3d")
ax3=fig.add_subplot(223)
ax4=fig.add_subplot(224,projection="3d")
Để vẽ biểu đồ phân tán (dữ liệu và centroid), chúng ta có thể sử dụng mã sau:
ax1.scatter(sepal_data[:,0],sepal_data[:,1],c=labels_sepals,s=50)
ax1.scatter(centroids_sepals[:,0],centroids_sepals[:,1],c="red",s=100)
ax2.scatter(sepal_data[:,0],sepal_data[:,1],c=labels_sepals,s=50)
ax2.scatter(centroids_sepals[:,0],centroids_sepals[:,1],c="red",s=100)
ax3.scatter(petal_data[:,0],petal_data[:,1],c=labels_petals,s=50)
ax3.scatter(centroids_petals[:,0],centroids_petals[:,1],c="red",s=100)
ax4.scatter(petal_data[:,0],petal_data[:,1],c=labels_petals,s=50)
ax4.scatter(centroids_petals[:,0],centroids_petals[:,1],c="red",s=100)
Các nhãn cho trục x và y của các ô con có thể được đặt bằng cách sử dụng thuộc feature_namestính của dữ liệu iristập như sau:
ax1.set(xlabel=iris.feature_names[0],ylabel=iris.feature_names[1])
ax2.set(xlabel=iris.feature_names[0],ylabel=iris.feature_names[1])
ax3.set(xlabel=iris.feature_names[2],ylabel=iris.feature_names[3])
ax4.set(xlabel=iris.feature_names[2],ylabel=iris.feature_names[3])
Đoạn mã sau có thể được sử dụng để đặt màu nền của các ô con thành green:
ax1.set_facecolor("green")
ax2.set_facecolor("green")
ax3.set_facecolor("green")
ax4.set_facecolor("green")
Cuối cùng, chúng ta có thể hiển thị biểu đồ như sau:
plt.show()
Chạy đoạn mã trên hiển thị đầu ra sau:
Sau đây là việc thực hiện các cụm MeanShift.
Chúng ta tạo hai đối tượng MeanShift và phù hợp với dữ liệu sepal và petal như sau:
from sklearn.cluster import MeanShift
ms1=MeanShift(n_jobs=-1).fit(sepal_data)
centroids_sepals=ms1.cluster_centers_
labels_sepals=ms1.labels_
ms2=MeanShift(n_jobs=-1).fit(petal_data)
centroids_petals=ms2.cluster_centers_
labels_petals=ms2.labels_
Các bước khác tương tự như phân cụm KMeans. Sau đây là đầu ra của phân cụm MeanShift:
Lưu ý rằng trong phân cụm MeanShift, số lượng cụm được xác định tự động bằng thuật toán MeanShift.
Các mô-đun scipy.cluster.vq cung cấp chức năng kmeans2 để thực hiện phân cụm kmeans. Nhưng nó đòi hỏi dữ liệu phải được chuẩn hóa trước khi phân cụm. Chúng ta có thể bình thường hóa dữ liệu bằng cách sử dụng chức năng whiten. Chúng ta có thể thực hiện phân cụm kmeans bằng mô-đun scipy.cluster.vq như sau:
from sklearn import datasets
from scipy.cluster.vq import kmeans2,whiten
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
iris=datasets.load_iris()
sepal_data=iris.data[:,0:2]
petal_data=iris.data[:,2:4]
sepal_data_w=whiten(sepal_data)
petal_data_w=whiten(petal_data)
centroids_sepals,labels_sepals=kmeans2(k=3,data=sepal_data_w)
centroids_petals,labels_petals=kmeans2(k=3,data=petal_data_w)
fig=plt.figure()
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222,projection="3d")
ax3=fig.add_subplot(223)
ax4=fig.add_subplot(224,projection="3d")
ax1.scatter(sepal_data_w[:,0],sepal_data_w[:,1],c=labels_sepals,s=50)
ax1.scatter(centroids_sepals[:,0],centroids_sepals[:,1],c="red",s=100)
ax2.scatter(sepal_data_w[:,0],sepal_data_w[:,1],c=labels_sepals,s=50)
ax2.scatter(centroids_sepals[:,0],centroids_sepals[:,1],c="red",s=100)
ax3.scatter(petal_data_w[:,0],petal_data_w[:,1],c=labels_petals,s=50)
ax3.scatter(centroids_petals[:,0],centroids_petals[:,1],c="red",s=100)
ax4.scatter(petal_data_w[:,0],petal_data_w[:,1],c=labels_petals,s=50)
ax4.scatter(centroids_petals[:,0],centroids_petals[:,1],c="red",s=100)
ax1.set(xlabel=iris.feature_names[0],ylabel=iris.feature_names[1])
ax2.set(xlabel=iris.feature_names[0],ylabel=iris.feature_names[1])
ax3.set(xlabel=iris.feature_names[2],ylabel=iris.feature_names[3])
ax4.set(xlabel=iris.feature_names[2],ylabel=iris.feature_names[3])
ax1.set_facecolor("green")
ax2.set_facecolor("green")
ax3.set_facecolor("green")
ax4.set_facecolor("green")
plt.show()
Đoạn mã trên tạo ra đầu ra sau: