Big Data Analytics - K-Means Clustering
Pengelompokan k-means bertujuan untuk mempartisi n pengamatan menjadi k cluster di mana setiap pengamatan termasuk dalam cluster dengan mean terdekat, yang berfungsi sebagai prototipe cluster. Ini menghasilkan partisi ruang data menjadi sel Voronoi.
Diberikan himpunan pengamatan (x 1 , x 2 ,…, x n ) , di mana setiap pengamatan adalah vektor nyata berdimensi d, pengelompokan k-means bertujuan untuk membagi n pengamatan ke dalam kelompok k G = {G 1 , G 2 ,…, G k } untuk meminimalkan jumlah kuadrat dalam klaster (WCSS) yang didefinisikan sebagai berikut -
$$ argmin \: \ sum_ {i = 1} ^ {k} \ sum_ {x \ in S_ {i}} \ parallel x - \ mu_ {i} \ parallel ^ 2 $$
Rumus selanjutnya menunjukkan fungsi tujuan yang diminimalkan untuk menemukan prototipe yang optimal dalam k-means clustering. Intuisi rumusnya adalah kami ingin menemukan grup yang berbeda satu sama lain dan setiap anggota dari setiap grup harus serupa dengan anggota lain dari setiap cluster.
Contoh berikut menunjukkan cara menjalankan algoritme pengelompokan k-means di 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")
Untuk menemukan nilai yang baik untuk K, kita dapat memplot jumlah kuadrat dalam grup untuk nilai K yang berbeda. Metrik ini biasanya menurun saat lebih banyak grup ditambahkan, kami ingin mencari titik di mana penurunan jumlah grup dalam kotak mulai menurun perlahan. Dalam plot, nilai ini paling baik diwakili oleh K = 6.
Sekarang nilai K telah ditentukan, itu diperlukan untuk menjalankan algoritma dengan nilai tersebut.
# 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)