Bloemsoorten onderscheiden met K-means in R

Iris is een bloem die voorkomt in verschillende kleuren. Ze komt voor in bijna alle kleuren van de regenboog, op echt rood na.

Kunnen we de verschillende soorten onderscheiden met clusteren?  We gaan hiervoor het K-means algoritme gebruiken.

Clusteren is unsupervised machine learning

K-means is een vorm van unsupervised machine learning. Dit algoritme wordt gebruikt voor segmenteren van data in gelijksoortige groepen, de clusters. Het aantal groepen waarin je de data wilt verdelen is de variabele k. Een bekende toepassing van clusteren is klant segmentatie voor marketing.

De term unsupervised houdt in dat het algoritme wél de clusters bepaald maar niet het optimale aantal clusters. Het gebruik is dus exploratief: met verschillende waarden voor de variabele K ontdek je de juiste cluster verdeling. Er zijn statische methoden beschikbaar die helpen bij het bepalen van het aantal clusters: Elbow, Silhouette en G-means. Deze methoden worden in een volgend artikel beschreven.

Iris dataset

De Iris data is in 1935 verzameld door Edgar Anderson. Edgar heeft voor de soorten setosa, versicolor en virginica de lengte en breedte in centimeters van het kelkblad en bloemblad gemeten. De data is beschikbaar in het ‘datasets’ package. 

 
# dplyr voor data wrangling
require('dplyr')
# package datasets is een standaard package in R
iris.df <- datasets::iris summary(iris.df)

K-means toepassen

We gebruiken K-means om de bloemen te verdelen in groepen met vergelijkbare lengte en breedte maten van de kelk- en bloembladen. De variabele soort is identificerend en wordt dus niet meegegeven aan het algorithme ‘kmeans’. Variabele k, gewenst aantal cluster, stellen we in op 3.

Alle variabelen zijn in centimeters. We volstaan met het doorgeven van de ruwe data zonder pre-processing zoals centreren of normaliseren.

 
k <- 3 
iterMax <- 20 
fit <- kmeans(
               iris.df %>% select(-c('Species'))
               ,centers = k
               ,iter.max = iterMax)

Valideren

In dit artikel volstaan we met een eenvoudige validatie van de resultaten. Hieronder staat de code om variatie in de Iris data, dat verklaard wordt door de clusters bepaald met K-means, te berekenen en voor het tonen van een kruistabel met de soorten en de bepaalde clusters.

 
# Within cluster sum of squares by cluster:
round(fit$betweenss / fit$totss,4) * 100
# Kruistabel: 
table(iris.df$Species, fit$cluster)

We hebben 88,43% van de variatie in de data met K-means kunnen verklaren. Stetosa is correct geïdentificeerd terwijl Verginica in 28% van de gevallen in hetzelfde cluster valt als Versicolor.

Whats next?

In een volgend artikel gaan we verder in op het bepalen van het optimaal aantal clusters met methoden zoals Elbow, Silhouette en G-means.