SciPy - Cụm
K-means clusteringlà một phương pháp để tìm các cụm và trung tâm cụm trong một tập hợp dữ liệu chưa được gắn nhãn. Theo trực giác, chúng ta có thể nghĩ về một cụm - bao gồm một nhóm các điểm dữ liệu, có khoảng cách giữa các điểm là nhỏ so với khoảng cách đến các điểm bên ngoài cụm. Cho trước một tập K tâm ban đầu, thuật toán K-mean lặp lại hai bước sau:
Đối với mỗi trung tâm, tập hợp con của các điểm đào tạo (cụm của nó) gần với nó được xác định hơn bất kỳ trung tâm nào khác.
Giá trị trung bình của mỗi đối tượng cho các điểm dữ liệu trong mỗi cụm được tính toán và vectơ trung bình này trở thành trung tâm mới cho cụm đó.
Hai bước này được lặp đi lặp lại cho đến khi các tâm không còn di chuyển hoặc các nhiệm vụ không còn thay đổi. Sau đó, một điểm mớixcó thể được gán cho cụm của nguyên mẫu gần nhất. Thư viện SciPy cung cấp một cách triển khai tốt thuật toán K-Means thông qua gói cụm. Hãy để chúng tôi hiểu cách sử dụng nó.
Triển khai K-Means trong SciPy
Chúng ta sẽ hiểu cách triển khai K-Means trong SciPy.
Nhập K-Means
Chúng ta sẽ thấy việc triển khai và sử dụng từng hàm được nhập.
from SciPy.cluster.vq import kmeans,vq,whiten
Tạo dữ liệu
Chúng ta phải mô phỏng một số dữ liệu để khám phá sự phân cụm.
from numpy import vstack,array
from numpy.random import rand
# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))
Bây giờ, chúng ta phải kiểm tra dữ liệu. Chương trình trên sẽ tạo ra kết quả sau.
array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
[ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
[ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
…………….
Chuẩn hóa một nhóm quan sát trên cơ sở từng đối tượng địa lý. Trước khi chạy K-Means, sẽ có lợi khi bán lại từng kích thước tính năng của bộ quan sát với việc làm trắng. Mỗi đặc điểm được chia cho độ lệch chuẩn của nó trên tất cả các quan sát để tạo ra phương sai đơn vị.
Làm trắng dữ liệu
Chúng ta phải sử dụng đoạn mã sau để làm trắng dữ liệu.
# whitening of data
data = whiten(data)
Tính toán K-Means với ba cụm
Bây giờ chúng ta hãy tính K-Means với ba cụm bằng cách sử dụng đoạn mã sau.
# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)
Đoạn mã trên thực hiện K-Means trên một tập các vectơ quan sát tạo thành K cụm. Thuật toán K-Means điều chỉnh các trọng tâm cho đến khi không thể thực hiện đủ tiến trình, tức là sự thay đổi về độ méo, vì lần lặp cuối cùng nhỏ hơn một số ngưỡng. Ở đây, chúng ta có thể quan sát trung tâm của cụm bằng cách in biến centroid bằng cách sử dụng mã được đưa ra bên dưới.
print(centroids)
Đoạn mã trên sẽ tạo ra kết quả sau.
print(centroids)[ [ 2.26034702 1.43924335 1.3697022 ]
[ 2.63788572 2.81446462 2.85163854]
[ 0.73507256 1.30801855 1.44477558] ]
Gán mỗi giá trị cho một cụm bằng cách sử dụng mã được cung cấp bên dưới.
# assign each sample to a cluster
clx,_ = vq(data,centroids)
Các vq hàm so sánh từng vectơ quan sát trong 'M' với 'N' obsmảng với các trung tâm và chỉ định quan sát cho cụm gần nhất. Nó trả về cụm của mỗi quan sát và sự biến dạng. Chúng tôi cũng có thể kiểm tra độ méo. Hãy để chúng tôi kiểm tra cụm của mỗi quan sát bằng cách sử dụng mã sau.
# check clusters of observation
print clx
Đoạn mã trên sẽ tạo ra kết quả sau.
array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)
Các giá trị khác biệt 0, 1, 2 của mảng trên chỉ ra các cụm.