Phần 8: Unsupervised Learning: Clustering phần 1 – Lập trình AI bằng Python

Các thuật toán học máy không theo dõi không có bất kỳ người theo dõi nào và cung cấp bất kỳ loại hướng dẫn nào. Đó là nguyên nhân vì sao chúng liên kết chặt chẽ với cái mà những người gọi là trí tuệ nhân tạo thực sự.
Trong học tập không theo dõi, sẽ không có câu trả lời chính xác và không có giáo viên hướng dẫn. Các thuật toán cần khám phá mô hình thú vị trong dữ liệu để học.
1. Clustering là gì?
Về căn bản, nó là 1 loại cách học không theo dõi và là kỹ thuật thông dụng để phân tích dữ liệu thống kê được dùng trong khá nhiều lĩnh vực. Phân cụm chủ yếu là nhiệm vụ chia tập hợp các quan sát thành các tập con, được gọi là các cụm, theo cách sao cho các quan sát trong cùng 1 cụm giống nhau theo 1 nghĩa và chúng khác với những quan sát trong các cụm khác. Nói 1 cách dễ hiểu, ta có thể cho rằng rằng mục tiêu chính của phân cụm là nhóm dữ liệu trên cơ sở giống nhau và khác biệt.
Ví dụ sau đây sẽ cho ta hình dung rõ thêm :
3. Thuật toán Clustering :
Cùng nhau tìm hiểu qua một số thuật toán trong clustering information
a. Okay-Means
Thuật toán phân cụm Okay-imply là 1 trong các thuật toán nổi danh để phân nhóm dữ liệu. Chúng ta cần giả định rằng số lượng các cụm được biết trước. Đây còn được gọi là phân cụm phẳng. Nó là 1 thuật toán phân cụm lặp đi lặp lại. Những bước thực hiện cho thuật toán này :
- Xác định số lượng nhóm con Okay mong đợi
- Cố định số lượng các cụm và chỉ định ngẫu nhiên từng điểm dữ liệu
Nói theo cách khác, ta cần phân loại dữ liệu của chính mình dựa vào số lượng các cụm.
Trong bước này, các trọng tâm cụm sẽ được tính toán.
Vì đây chính là 1 thuật toán lặp lại, nên ta cần update vị trí của Okay centroid với mỗi lần lặp lại cho tới khi ta tìm thấy optima toàn cục hay nói theo cách khác là các centroid đạt tới vị trí tối ưu của chúng.
Đoạn mã sau sẽ giúp thực hiện thuật toán phân cụm Okay-imply trong Python. Tôi sẽ sử dụng mô-đun Scikit-learning.
Import thư viện hỗ trợ :
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import OkayMeans
Dòng code sau sẽ giúp tạo tập dữ liệu 2 chiều, chứa 4 đốm màu, bằng cách sử dụng make_blob từ bundle sklearn.dataset.
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples = 500, facilities = 4,
cluster_std = 0.40, random_state = 0)
Ta bắt đầu visualize dataset như dưới đây :
plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.present()
Tại đây, tôi đang khởi tạo kmeans thành thuật toán OkayMeans, với tham số bắt buộc là n_clusters (số lượng cluster).
kmeans = OkayMeans(n_clusters = 4)
Ta bắt đầu prepare mannequin Okay-means với dữ liệu đầu vào
kmeans.match(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')
facilities = kmeans.cluster_centers_
Đoạn mã được cung cấp phía dưới sẽ giúp ta vẽ và hình dung các phát hiện của máy dựa vào dữ liệu của chính mình và cách lắp ráp theo số lượng cụm sẽ được tìm thấy.
plt.scatter(facilities[:, 0], facilities[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.present()
b. Thuật toán Mean Shift :
Nó là 1 thuật toán phân cụm thông dụng và mạnh mẽ khác được dùng trong học không theo dõi. Nó không đưa ra bất kỳ giả định nào do vậy nó là 1 thuật toán phi tham số. Nó còn được gọi là phân cụm phân cấp hay phân tích cụm dịch chuyển trung bình.Bao gồm những bước căn bản sau :
- Trước hết, ta cần bắt đầu với những điểm dữ liệu được gán cho 1 cụm riêng của chúng.
- Hiện tại, mô hình sẽ tính toán các trung tâm và update vị trí của các trung tâm mới.
- Bằng việc lặp lại quá trình này, chúng tôi di chuyển gần đỉnh của cụm, tức là về phía vùng có mật độ cao hơn.
- Thuật toán này dừng lại ở giai đoạn mà các centroid không di chuyển nữa.
Với sự giúp đỡ của đoạn mã sau, mình đang triển khai thuật toán phân cụm Mean Shift trong Python. Tôi sẽ sử dụng mô-đun Scikit-learning.
import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import type
type.use("ggplot")
Đoạn mã sau sẽ giúp tạo tập dữ liệu 2 chiều, chứa 4 đốm màu, bằng cách sử dụng make_blob từ bundle sklearn.dataset.
from sklearn.datasets.samples_generator import make_blobs
Chúng ta sẽ có thể hình dung tập dữ liệu bằng đoạn mã sau
facilities = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, facilities = facilities, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.present()
Hiện tại, ta cần đào tạo mô hình cụm Mean Shift với dữ liệu đầu vào.
ms = MeanShift()
ms.match(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
Đoạn mã sau sẽ in các trung tâm cụm và số lượng cụm dự kiến theo dữ liệu đầu vào:
print(cluster_centers)
n_clusters_ = len(np.distinctive(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2
Đoạn mã được đưa ra sau đây sẽ giúp vẽ biểu đồ và trực quan hóa các phát hiện của máy dựa vào dữ liệu đầu vào, và trang bị theo số lượng cụm sẽ được tìm thấy.
colours = 10*(*1*)
for i in vary(len(X)):
plt.plot(X[i][0], X[i][1], colours[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
marker = "x",coloration = 'ok', s = 150, linewidths = 5, zorder = 10)
plt.present()