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)