Traduzido de: K Means Clustering in R
Autor: Teja Kodali
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:
- Guia de acesso rápido – Python para Data Science – Matplotlib
- Guia de Acesso Rápido ao Pandas
- Mercado de pagamentos
Thank you for helping out, wonderful information.