Análise de Big Data - clustering K-Means

O agrupamento k-means visa particionar n observações em k clusters em que cada observação pertence ao cluster com a média mais próxima, servindo como um protótipo do cluster. Isso resulta em um particionamento do espaço de dados em células Voronoi.

Dado um conjunto de observações (x 1 , x 2 , ..., x n ) , onde cada observação é um vetor real d-dimensional, o agrupamento de k-médias visa particionar as n observações em k grupos G = {G 1 , G 2 ,…, G k } de modo a minimizar a soma dos quadrados dentro do cluster (WCSS) definida como segue -

$$ argmin \: \ sum_ {i = 1} ^ {k} \ sum_ {x \ in S_ {i}} \ parallel x - \ mu_ {i} \ parallel ^ 2 $$

A última fórmula mostra a função objetivo que é minimizada para encontrar os protótipos ótimos no agrupamento de k-means. A intuição da fórmula é que gostaríamos de encontrar grupos que sejam diferentes entre si e cada membro de cada grupo deve ser semelhante aos outros membros de cada cluster.

O exemplo a seguir demonstra como executar o algoritmo de agrupamento k-means em 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")

Para encontrar um bom valor para K, podemos plotar a soma dos quadrados dentro dos grupos para diferentes valores de K. Esta métrica normalmente diminui à medida que mais grupos são adicionados, gostaríamos de encontrar um ponto onde a diminuição na soma dos grupos de quadrados começa a diminuir lentamente. No gráfico, esse valor é melhor representado por K = 6.

Agora que o valor de K foi definido, é necessário executar o algoritmo com esse valor.

# 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)