Cvičení 4 - Shluková analýza

Test: https://goo.gl/forms/1nRnCPNxmsQ1891K3

V dnešním cvičení opět využijeme několik souborů s daty - všechny jsou v následujícím souboru cviceni_10_shluky.zip

Shluková analýza

  1. Co je shluková analýza?
  2. Jaký je rozdíl mezi hierarchickými a nehierarchickými metodami?
  3. Vysvětlete princip algoritmu k-means.
  4. Vysvětlete proč je nutná normalizace dat při shlukování.

Příprava dat

Při shlukování je vždy nutné přemýšlet o normalizaci dat.

mydata <- na.omit(mydata) # smazání chybějících hodnot
mydata <- scale(mydata) # normalizace dat

Tvary shluků

Vyzkoušejte postupně algoritmus k-means na datových souborech kruhy.csv a tvary.csv. Pozor, nezapomeňte vyloučit atribut class ze shlukování. Atribut class použijte pouze pro vizualizaci shluků. Zvolte počet shluků roven 3 (parametr k=3).

kc <- kmeans(data_bez_class, pocet shluku)
print(kc)

Počet shluků

U algoritmu k-means je nutné nastavit počet shluků. Ukážeme si, jak je možné počet shluků volit.

Vyzkoušejte následující funkci v R.

cluster_num_plot <- function(data,n){
  result <- vector(length=n-1)
  for(i in 2:n){
    cl <- kmeans(data, i)
    result[i-1] <- sum(cl$withinss)
  }
  plot(2:n,result,xlab="počet shluků", ylab="průměrná vzdálenost")
}

Funkce provede postupně shlukování metodou kmeans pro počet shluků 1n. Kvalitu shlukování odhadneme pomocí parametru cl$withinss (průměrnou vzdálenost uvnitř všech shluků) a uložíme do vektoru result. Následně vykreslíme závislost počtu shluků na objektivní funkci (použijeme právě průměrnou vzdálenost uvnitř všech shluků).

Gaussian mixture model estimated by expectation maximization algorithm

Gaussian mixture model je flexibilnější než algoritmus k-means. Porovnejte výsledky shlukování pomocí k-means a pomocí GMM EM na datech tvary.csv.

library(mclust)
cl_gmm <- Mclust(data,G=pocet_shluku)
summary(cl_gmm)
plot(cl_gmm)

Hierarchické shlukování

Vyzkoušejte hierarchické shlukování na datovém souboru zvirata.csv a známých iris

hc <- hclust(dist(zvirata[,2:14]), method="complete")
plot(hc, hang = -1, labels=zvirata[,1])

help(cutree)