Phân tích dữ liệu lớn - K-Means Clustering
Phân cụm k-means nhằm mục đích phân chia n quan sát thành k cụm trong đó mỗi quan sát thuộc về cụm có giá trị trung bình gần nhất, đóng vai trò như một nguyên mẫu của cụm. Điều này dẫn đến việc phân vùng không gian dữ liệu thành các ô Voronoi.
Cho một tập hợp các quan sát (x 1 , x 2 ,…, x n ) , trong đó mỗi quan sát là một vectơ thực d chiều, phân cụm k-mean nhằm phân chia n quan sát thành k nhóm G = {G 1 , G 2 ,…, G k } để giảm thiểu tổng bình phương trong cụm (WCSS) được xác định như sau:
$$ argmin \: \ sum_ {i = 1} ^ {k} \ sum_ {x \ in S_ {i}} \ song song x - \ mu_ {i} \ song song ^ 2 $$
Công thức sau cho thấy hàm mục tiêu được tối thiểu hóa để tìm các nguyên mẫu tối ưu trong phân cụm k-mean. Trực giác của công thức là chúng ta muốn tìm các nhóm khác với nhau và mỗi thành viên của mỗi nhóm phải tương tự với các thành viên khác của mỗi cụm.
Ví dụ sau minh họa cách chạy thuật toán phân cụm k-mean trong R.
library(ggplot2)
# Prepare Data
data = mtcars
# We need to scale the data to have zero mean and unit variance
data <- scale(data)
# Determine number of clusters
wss <- (nrow(data)-1)*sum(apply(data,2,var))
for (i in 2:dim(data)[2]) {
wss[i] <- sum(kmeans(data, centers = i)$withinss)
}
# Plot the clusters
plot(1:dim(data)[2], wss, type = "b", xlab = "Number of Clusters",
ylab = "Within groups sum of squares")
Để tìm một giá trị tốt cho K, chúng ta có thể vẽ biểu đồ tổng bình phương trong các nhóm cho các giá trị khác nhau của K. Chỉ số này thường giảm khi có nhiều nhóm được thêm vào, chúng tôi muốn tìm một điểm mà sự giảm tổng trong các nhóm số hình vuông bắt đầu giảm dần. Trong biểu đồ, giá trị này được thể hiện tốt nhất bằng K = 6.
Bây giờ giá trị của K đã được xác định, nó là cần thiết để chạy thuật toán với giá trị đó.
# K-Means Cluster Analysis
fit <- kmeans(data, 5) # 5 cluster solution
# get cluster means
aggregate(data,by = list(fit$cluster),FUN = mean)
# append cluster assignment
data <- data.frame(data, fit$cluster)