Clustering K Means com R

Traduzido de: K Means Clustering in R

Autor:

O que é k-means?

K-means é um algoritmo de aprendizagem não supervisionada que agrupa dados com base em sua similaridade. Aprendizagem não supervisionada significa que não há resultado a ser previsto, e o algoritmo apenas tenta encontrar padrões nos dados. No k-means, temos que especificar o número de grupos em que desejamos que os dados sejam agrupados. O algoritmo atribui aleatoriamente cada observação para um cluster, e encontra o centróide de cada cluster. Em seguida, o algoritmo segue em dois passos:
• Redistribui pontos de dados para o cluster cujo centróide é mais próximo.
• Calcula novo centróide para cada cluster.
Estes dois passos são repetidos até que a variação dentro do conjunto não possa mais ser reduzida. A variação dentro do cluster é calculada como a soma da distância euclidiana entre os pontos de dados e os os respectivos centróides de clusters.

Explorando os dados

O conjunto de dados da íris contém dados sobre o comprimento das sépalas, largura sepal, comprimento da pétala, e largura das pétalas de flores de diferentes espécies. Vamos ver com o que ele se parece:

library(datasets)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Com um pouco de exploração, descobri que Petal.Length e Petal.Width eram semelhantes entre as mesmas espécies, mas variavam consideravelmente entre as diferentes espécies, como demonstrado a seguir:

library(ggplot2)

ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) + geom_point()

Aqui a plotagem:


Ok, agora que vimos os dados, vamos tentar agrupar-los. Uma vez que as atribuições iniciais de cluster são aleatórias, vamos definir a semente para garantir a reprodutibilidade.

set.seed(20)
irisCluster <- kmeans(iris[, 3:4], 3, nstart = 20)
irisCluster
K-means clustering com 3 clusters de tamanhos 46, 54, 50

Cluster significa:
  Petal.Length Petal.Width
1     5.626087    2.047826
2     4.292593    1.359259
3     1.462000    0.246000

Clustering vector:
  [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 [35] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [69] 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1
[103] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 2 2 1 1 1 1 1 1 1 1
[137] 1 1 2 1 1 1 1 1 1 1 1 1 1 1

Soma dos quadrados dentro dos cluster, por cluster:
[1] 15.16348 14.22741  2.02200
 (between_SS / total_SS =  94.3 %)

Componentes disponíveis:

[1] "cluster"      "centers"      "totss"        "withinss"    
[5] "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"

Uma vez que sabemos que existem 3 espécies envolvidas, pedimos ao algoritmo para agrupar os dados em 3 clusters, e uma vez que as atribuições de partida são aleatórias, especificamos iniciar = 20. Isto significa que R tentará 20 diferentes atribuições de partida aleatória e, em seguida, selecionará aquela com a menor variação dentro do cluster.
Podemos ver os centróides de cluster, os clusters a que cada ponto de dados foi atribuído, e a variação dentro do cluster.
Vamos comparar os clusters com as espécies:

table(irisCluster$cluster, iris$Species)
    setosa versicolor virginica
  1      0          2        44
  2      0         48         6
  3     50          0         0

Como podemos ver, os dados pertencentes às espécies setosa foram agrupados no conjunto 3, versicolor no grupo 2, e virginica no conjunto 1. O algoritmo classificou erroneamente dois pontos de dados pertencentes a versicolor e seis pontos de dados pertencentes a virginica.

Também podemos plotar os dados para ver os clusters:irisCluster$cluster <-

irisCluster$cluster <- as.factor(irisCluster$cluster)
ggplot(iris, aes(Petal.Length, Petal.Width, color = iris$cluster)) + geom_point()

Aqui a plotagem:

O que nos leva ao final do artigo. Espero que tenha gostado!


Veja também:


 

1 comentário em “Clustering K Means com R”

Deixe uma resposta