Search
TEST 03
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
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
K-means je shlukovací algoritmus, jehož cílem je nalezení takových shluků jednotlivých pozorování, které budou minimalizovat vzdálenost ke středům shluků.
Algoritmus k-means
Vstup: Množina pozorování $T = \{\mathbf{x_1}, ..., \mathbf{x_n}\}$, počet shluků K, maximální počet iterací. Výstup: Množina prototypů shluků $\{\mathbf{c_1}, ..., \mathbf{c_K}\}$
Inicializace: Nastavíme středy $\{\mathbf{c_1}, ..., \mathbf{c_K}\}$ na různé náhodně vybrané vstupní pozorování $\mathbf{x_i}$.
Kroky:
Opakuj body 1 a 2, dokud se přiřazení do tříd mění a ještě nebyl překročen stanovený maximální počet iterací.
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).
kruhy.csv
tvary.csv
k
kc <- kmeans(data_bez_class, pocet shluku) print(kc)
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ů 1 až n. 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ů).
kmeans
1
n
cl$withinss
result
Praktická úloha 1 Pro tuto úlohu si stáhněte soubor snsdata.txt s daty získaných z profilů sociální sítě 30 000 amerických teenagerů. Tento dataset obsahuje infomaci o ročníku střední školy (celkem 4 ročníky), pohlaví, věku a počtu přátel studenta. Dále byl profil každého ze studentů zpracován metodami text miningu a zaznamenán počet výskytů každého z 36 vytipovaných klíčových slov.
age
Použijte funkci aggregate() pro výpočet statistiky nad skupinami.
aggregate()
aggregate(data = teens, age ~ gradyear, mean, na.rm = TRUE)
ave()
kmeans()
set.seed(2345)
aggregate
Bishop, C.: Pattern Recognition and Machine Learning, Springer, 2011
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)
Vyzkoušejte hierarchické shlukování na datovém souboru zvirata.csv a známých iris
zvirata.csv
iris
hc <- hclust(dist(zvirata[,2:14]), method="complete") plot(hc, hang = -1, labels=zvirata[,1]) help(cutree)
dendextend
library(dendextend) library(magrittr) dend <- zvirata[,2:14] %>% dist %>% hclust(method = "complete") %>% as.dendrogram dend %>% set("labels", zvirata[,1]) %>% set("labels_col", value = c("green", "blue"), k=2) %>% plot
magrittr
Standardní R kód pro vytváření dendrogramu
data <- scale(USArrests) dist.res <- dist(data) hc <- hclust(dist.res, method = "ward.D2") dend <- as.dendrogram(hc) plot(dend)
R kód pro vytváření dendrogramu pomocí řetězového operátoru
dend <- USArrests[1:5,] %>% # data scale %>% # Scale the data dist %>% # calculate a distance matrix, hclust(method = "ward.D2") %>% # Hierarchical clustering as.dendrogram # Turn the object into a dendrogram. plot(dend)
Úloha 2 Uvažujte následujících 7 datových záznamů, z nichž se každý skládá ze 2 příznaků: $p_1 = (0.5, 2.0)$, $p_2=(2.5, 3.0)$, $p_3=(4.2, 0.7)$, $p_4=(5.5, 0.3)$, $p_5=(4.8, 3.5)$, $p_6 = (7.0, 2.5)$, $p_7=(8.5, 2.8)$. Matice Eukleidovských vzdáleností mezi jednotlivými body je uvedena v následující tabulce: <latex> \begin{table}[ht] \centering \begin{tabular}{rrrrrrrr}
\hline
& $p_1$ & $p_2$ & $p_3$ & $p_4$ & $p_5$ & $p_6$ & $p_7$
$p_1$ & 0.00 & 2.24 & 3.92 & 5.28 & 4.55 & 6.52 & 8.04
$p_2$ & 2.24 & 0.00 & 2.86 & 4.04 & 2.35 & 4.53 & 6.00 \\ $p_3$ & 3.92 & 2.86 & 0.00 & 1.36 & 2.86 & 3.33 & 4.79 \\ $p_4$ & 5.28 & 4.04 & 1.36 & 0.00 & 3.28 & 2.66 & 3.91 \\ $p_5$ & 4.55 & 2.35 & 2.86 & 3.28 & 0.00 & 2.42 & 3.77 \\ $p_6$ & 6.52 & 4.53 & 3.33 & 2.66 & 2.42 & 0.00 & 1.53 \\ $p_7$ & 8.04 & 6.00 & 4.79 & 3.91 & 3.77 & 1.53 & 0.00 \\ \hline
\end{tabular} \end{table} </latex>
R skript z hodiny: 04_skript_shlukovani.r.txt