Big Data Analytics - klastrowanie K-Means
Klastrowanie k-średnich ma na celu podzielenie n obserwacji na k skupień, w których każda obserwacja należy do klastra o najbliższej średniej, służąc jako prototyp klastra. Powoduje to podzielenie przestrzeni danych na komórki Woronoja.
Biorąc pod uwagę zbiór obserwacji (x 1 , x 2 ,…, x n ) , gdzie każda obserwacja jest d-wymiarowym wektorem rzeczywistym, grupowanie k-średnich ma na celu podzielenie n obserwacji na k grup G = {G 1 , G 2 ,…, G k } tak, aby zminimalizować sumę kwadratów wewnątrz klastra (WCSS) zdefiniowaną w następujący sposób -
$$ argmin \: \ sum_ {i = 1} ^ {k} \ sum_ {x \ in S_ {i}} \ parallel x - \ mu_ {i} \ parallel ^ 2 $$
Późniejsza formuła przedstawia zminimalizowaną funkcję celu w celu znalezienia optymalnych prototypów w grupowaniu k-średnich. Intuicja formuły jest taka, że chcielibyśmy znaleźć grupy różniące się od siebie i każdy członek każdej grupy powinien być podobny do innych członków każdego klastra.
Poniższy przykład pokazuje, jak uruchomić algorytm grupowania k-średnich w języku 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")
Aby znaleźć dobrą wartość K, możemy wykreślić sumę kwadratów wewnątrz grup dla różnych wartości K. Ta metryka zwykle maleje wraz z dodawaniem większej liczby grup. Chcielibyśmy znaleźć punkt, w którym spadek sumy wewnątrz grup kwadratów zaczyna się powoli zmniejszać. Na wykresie wartość tę najlepiej reprezentuje K = 6.
Teraz, gdy wartość K została zdefiniowana, konieczne jest uruchomienie algorytmu z tą wartością.
# 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)