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)