<table width = 900 border = 0><tr><td>
# <b>NMST539 | Cvičenie 10</b>

## <b>Zhluková analýza</b>
### <font color = "#880000"><b>LS 2020/2021 |  04/05/21 | (online výuka)</b></font>
###### <a href = "cvicenie2021_10.Rmd">zdrojový Rmd súbor (kódovanie UTF8)</a>

**************


<b>Outline desiateho cvičenia:</b> 

<ul>
<li>základy zhlukovej analýzy v programe R;</li>
<li>princípy hierarchického a nehierarchického zhlukovania;</li>
<li>K-means algoritmus;</li>
</ul><br>


<b>Štatisticky program R</b> je k dispozícii (GNU public licence) na adrese <a href = "https://www.r-project.org">https://www.r-project.org</a><br><br>

<b>RStudio</b> -- "user-friendly" interface (jeden z mnohých, ktoré na internete nájdete): <a href = "https://www.rstudio.com">RStudio</a>.<br><br>

<b>Užitočné návody a manuály pre prácu s programom R:</b><br>

<ul>
<li>Bína, V., Komárek, A. a Komárková, L.: <i>Jak na jazyk R.</i>  (<a href = "NMFM301/Rmanual2.pdf">PDF súbor</a>)</li>
<li>Komárek, A.: <i>Základy práce s R.</i>  (<a href = "http://msekce.karlin.mff.cuni.cz/~komarek/vyuka/dataRko/Rmanual1.pdf">PDF súbor</a>)</li>
<li>Kulich, M.: <i>Velmi stručný úvod do R.</i> (<a href = "NMFM301/uvodr.pdf" >PDF súbor</a>)</li>
<li>De Vries, A. a Meys, J.: <i>R for Dummies.</i> (ISBN-13: 978-1119055808) </li>		
</ul><br>


<b>Odborná literatúra:</b><br>
<ul>
<li>Hardle, W. and Simar.L.: Applied Multivariate Statistical Analysis. Springer, 2015</li>
<li>Mardia, K., Kent, J., and Bibby, J.:Multivariate Analysis, Academic Press, 1979.</li>
</ul>

<br><br>


**************

#### <font color = "#880000"><b>1. Základné princípy zhlukovej analýzy</b></font>

Zhluková analýza (Cluster Analysis, CA) je štatistická metóda určená k rozlíšeniu jednotlivých objektov (pozorováni) pomocou vytvorenia 
určitého počtu konkrétnych a disjunktných zhlukov (tzv. clustrov), do ktorých sú pozorovania jednoznačne priradené na základe určitej miery podobnosti/nepodobnosti. Táto miera vzájomnej podobnosti/nepodobnosti je väčšinou meraná pomocou konkrétnej metriky (tzv. proximity measure) -- t.j. napr. nejakej vhodnej vzdialenosti -- v programe R k tomuto účelu slúži funkcia `dist()`. 
Je ale nutné pripomenúť, že zhluková analýza nepredstavuje jednú konkrétnu metódu klasifikácie subjektov (pozorovaní) do skupín (clustrov), 
ale jedná sa o súhrnné označenie množstva rôznych postupov a algoritmov, ktoré sú určené k tomuto účelu. Zaroveň je nutné zdôrazniť základný 
a principiálny rozdiel medzi zhlukovaním a medzi diskrimináciou/klasifikáciou (resp. zhlukovou analýzou a diskriminačnou a klasifikačnou analýzou). 


 <ul>
  <li><b>Zhlukovanie</b> funguje bez apriornej informácie o skutočnom zaradení subjektov do jednotlivých skupín. Skupiny pozorovaní (zhluky) sú neznáme a cielom zhlukovacieho algoritmu je využiť mieru podobnosti a nepodobnosti medzi objektami a tieto zhluky 
  definovať (a k ním priradiť príslušné pozorovania). </li>
 
 <li><b>Klasifikácia</b> funguje na princípe datového súboru, u ktorého je priradenie pozorovaní do jednotlivých skupín predom známe (tzv. group label) a cieľom je pochopiť princíp priradenia jednotlivých pozorovaní do jednotlivých skupín, aby bolo možné následne nové pozorovanie bez 'group label' zaradiť do správnej kategórie.</li>
 </ul>
 
 
 Z teoretického hľadiska rozlišujeme dva základne postupy (algoritmické princípy) v zhlukovaní: 

 <ul>
  <li><b>Hierarchické algoritmy</b> - priradenie subjektov do jednotlivých skupín je stabilné a v priebehu 
  algoritmu sa už nemení. </li>
  
  <li><b>Nehierarchické (tzv. partitioning) algoritmy</b> -  priradenie subjektov do jednotlivých skupín sa 
  môže v priebehu algoritmu meniť. </li>
 

 </ul>

<br>


Finálný výsledok zhlukovacieho algoritmu je ovplyvnený konkrétnou voľbou vzdialenosti (proximity measure) a
a konrkétnou voľbou zhlukovacieho algoritmu. K dispozícii je množstvo rôznych zhlukovacích algoritmov, ktoré 
pracuju na rôznych principoch. Výstupom z algoritmu je ale zakaždym priradenie jednotlivých pozorovaní do 
určitého počtu disjunktných zhlukov (clustrov). Zhlukovacie algoritmy môžeme rozdeliť napr. následovne: 
<br>

<ul>
<li>Hierarchické algoritmy</li>
<li>Partitioning algoritmy</li>
<li>Algoritmy založené na strede zhlukov (tzv. centroid based)</li>
<li>Algoritmy založene na distribúcii (tzv. distribution based)</li>
<li>Algoritmy založené na hustote (tzv. density based)</li>
<li>alebo iné... </li>
</ul>


#### <font color = "#880000"><b>Poznámka</b></font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
Zhluková analýza patrí prevažne do exploratívnej časti štatistických metód. V určitom zmysle je ale možné zhlukovanie chápať aj ako 
metódu redukcie dimenzionality. Z interpretačného hľadiska má zmysel hľadať počet jednotlivých zhlukov tak, aby 
zhluky umožňovali zmysluplnú intepretáciu. Po určení konkrétnych zhlukov je následne možné jednotlivé pozorovania reprezentovať pomocou ich príslušnosti do zhlukov (redukcia dimenzionality -- t.j. namiesto pôvodných premenných využiť novú kategorickú premennú -- tzv. group label).
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br><br>


#### <font color = "#880000"><b>2. Hierarchické zhlukovanie</b></font>

<b>Hierarchické aglomeratívne zhlukovanie</b> funguje na princípe 'zdola-hore', kedy sa najprv vytvárajú malé zhluky (jednoprvkové zhluky 
na začiatku algoritmu), ktoré sa následne v postupnosti krokov zlučujú do väčších zhlukov, až je vytvorený jeden celkový zhluk obsahujúci všetky pozorovania. Pri zlučovaní menších zhlukov v jednotlivých krokoch sa využíva princíp vzájomnej podobnosti (medzi pozorovaniami navzájom, medzi pozorovaniami a zhlukmi, resp. medzi zhlukmi navzájom), definovaný na základe použitej vzdialenosti, resp. proximity measure.  
Aglomeratívne hierarchické algoritmy sú výpočetne veľmi jednoduché najme vďaka faktu, že podobnosť (resp. vzdialenosť) medzi zhlukmi 
v jednotlivých krokoch je možné napočítať z matice vzdialenosti v predchádzajích krokoch (vstupom pre algoritmus je teda matica vzdialenosti medzi pôvodnýcmi pozorovaniami, z ktorých každé tvorí vlastný, samostatný zhluk, cluster).<br><br>

<b>Hierarchické deliace algoritmy</b> pracujú na princípe 'zhora-dole', kedy je najprv vytvorený jeden komplexný zhluk obsahujúci 
všetky pozorovania dohromady a následne v jednotlivých krokoch dochádza k deleniu existujúcich zhlukov, opäť na princípe 
vzájomnej nepodobnosti medzi zhlukmi (resp. medzi zhlukmi a pozorovaniami). Deliace (divisive) aglomeratívne algoritmy bývajú 
výpočetne náročné, nakoľko celková hierarchia rôznych delení musí byť vybudovaná za účelom dosiahnutia finálneho delenia. <br><br>

Výstup zhlukovacieho algoritmu je možné graficky vizualizovať, čo výrazne pomôže pri voľbe finálneho počtu zhlukov. 
Na druhu stranu, vizualizácia je praktický neinformatívna, ak sa jedná o zhlukovanie väčšieho počtu pozorovaní. Klučovým problémom teda zostáva voľba finálneho počtu zhlukov. .<br><br>


Pre ilustráciu zhlukovania v programe R využijeme datový súbor `mtcars`. 

```{r, warning = F, message = F}
data <- mtcars
attach(data)
head(data)
```

Využijeme všetky premenné, ktoré sú v datovom súbore `mtcars` k dispozícii a najrpv spočítame maticu 
vzdialenosti medzi jednotlivými pozorovaniami pomocou funkcie  `mtcars`. Použijeme defaultne nastavenie 
funkcie -- teda Euklidovskú vzdialenosť.<br><br>


```{r}
D <- dist(mtcars) ### for the euclidian distance by default
```

Následne použijeme maticu vzdialenosti $\mathbb{D}$ ako vstup pre hierarchický aglomeratívny algoritmus -- funkcia `hclust()` v programe R (funkcia je k dispozícii pod štandardnou inštaláciou programu R). Podrobnosti v helpe funkcie> `?hclust()`.

```{r, warning=F, message = F, fig.width=10, fig.height=8}
HC1 <- hclust(D)
plot(HC1, xlab = "Observations", ylab = "Proximity measure")
```

Defaultnou zhlukovacou metódou implementovanou vo funkcii  `hclust()` je tzv. 'complete linkage' prístup, 
ktorý využíva pri vytváraní skupín princíp najvzdialenejišieho suseda. Ďalšie metódy sú k dispozícii 
pod voľbou dodatočného parametru 'method': <br><br>

<ul>
<li>'method = 'complete' (najvzdialenejší sused | default)</li>
<li>'method = 'single' (najbližší sused)</li>
<li>'method = 'average' (priemer zhluku, resp. kompromis medzi najvzdialenejším a najbližším susedom)</li>
<li>'method = 'median' (robustná verzia metódy s priemerom)</li>
<li>'method = 'centroid' (postup na základe geometrickej vzdialenosti)</li>
<li>'method = 'mcquitty' (vážena verzia metódy priemerov)</li>
<li>'method = 'ward.D' (postup založený na najmenšom náraste tzv. measure of heterogeneity)</li>
</ul>

<br><br>

Rôzne zhlukovacie algoritmy sú k dispozícii aj v dodatočných rozšíreniach a R balíčkoch. Napr. knižnica 'sparcl'  (inštalácia pomocou príkazu `install.packages('sparcl')`), ktoráá ponúka funkciu `ColorDendrogram()`. <br><br>

Ak je k dispozícii informácia o konečnom počete zhlukov, je možné počet zhlukov definovať nasledujúcim spôsobom: 

```{r, warning=F, message = F, fig.width=10, fig.height=8}
plot(HC1, xlab = "Observations", ylab = "Proximity measure")
groups <- cutree(HC1, k=3)
rect.hclust(HC1, k=3, border="red")
```

Ekvivalentná verzia, pouze vylepšená z vizuálneho hľadiska:

```{r, warning=F, message = F, fig.width=10, fig.height=8}
plot(HC1, xlab = "Observations", ylab = "Proximity measure", hang = -1)
groups <- cutree(HC1, k=3)
rect.hclust(HC1, k=3, border="red")
```

alebo: 

```{r, warning=F, message = F, fig.width=10, fig.height=8}
cutHC1 = cutree(HC1, 3)
labelColors = c("red", "green", "blue")

# function to get color labels
colLab <- function(n) {
    if (is.leaf(n)) {
        a <- attributes(n)
        labCol <- labelColors[cutHC1[which(names(cutHC1) == a$label)]]
        attr(n, "nodePar") <- c(a$nodePar, lab.col = labCol)
    }
    n
}
# using dendrapply
clusDendro = dendrapply(as.dendrogram(HC1), colLab)
plot(clusDendro, main = "Cool Dendrogram", type = "triangle")
```


Pomocou trochu sofistikovanejšieho kódu je možné v obrázku znázorniť aj 
dodatočné informácie (napr. niektoré premenné) z pôvodného datového súboru (napr. počet prevodových stupňov -- `gear`). 

```{r, warning=F, message = F, fig.width=10, fig.height=8}
local({
  colLab <<- function(n) {
    if(is.leaf(n)) {
      a <- attributes(n)
      i <<- i+1
      attr(n, "edgePar") <-
        c(a$nodePar, list(col = mycols[i], lab.font= i%%3))
    }
    n
  }
  mycols <- mtcars$gear
  i <- 0
})

x.clust.dend1 <- dendrapply(as.dendrogram(HC1), colLab)
plot(x.clust.dend1)
```



<br><br><br>

#### <font color = "#880000"><b>Samostatne</b></font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
 <ul>
 <li>Využijte defaultný zhlukovací algoritmus vo funkcii  `hclust()`, ale pre maticu $\mathbb{D}$ použijte 
 rôzne varianty pre definíciu vzdialenosti. Porovnajte výsledky.</li>
 
 <li>Zvoľte vhodnu vzdialenosti pri aplikovaní funkcie `dist()` a využijte rôzne postupy zhlukovania 
 ktoré sú k dispozícii vo funkcii `hclust()` pod voľbou parametru 'method = ...'. Opäť porovnajte výsledky. </li>
 
 <li>Výsledky ilustrujte a porovnajte pomocou dendogramov.</li>
 
 </ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br><br>



#### <font color = "#880000"><b>2. Nehierarchické zhlukovanie</b></font>

Princíp fugovania nehierarchického zhlukovania sme už uviedli v úvode. 
Najznámejším a asi aj načastejšie používaným nehierarchickým zhlukovacím algoritmom je tzv.  <b>K means algoritmus</b>.
Myšlienka tohto algoritmu spočíva vo vytvorení predom definovaného počtu $K$ zhlukov (clustrov), tak aby bol celkový súčet štvorcov vzdialenosti jednotlivých pozorovaní od stredu im príslušiacého zhluku minimálny. 

Predpokládajme, že pozorovania $\boldsymbol{x}_i$ pre $i = 1,\dots, n$ formujú $K$ rôznych zhlukov v zmysle im príslušných $K$ stredných hodnôt, čo môžeme teoreticky zapísať ako 

$$
E[\boldsymbol{x}_i | k_i] = \boldsymbol{\mu}_{k_{i}},
$$

kde $k_{i} \in \{1, \dots, K\}$. Celkový počet zhlukov je teda $K \in \mathbb{N}$ a tento počet sa v priebehu algoritmu nemení. 
Napríklad, pre $k_i = 1$, dostaneme, že pozorovanie $\boldsymbol{x}_i$ náleži do zhluku č.1, teda jeho stredná hodnota je $\boldsymbol{\mu}_{k_{i}} \equiv \boldsymbol{\mu}_1$.  Jednotlivé parametre stredných hodnôt $\boldsymbol{\mu}_{k}$, pre $k = 1, \dots, K$ sú neznáme parametre, ktorých odhad sa v priebehu algoritmu môže výrazne meniť (odhad totiž závísí od jednotlivých pozorovaní, ktoré sú zaradené do daného zhluku). Výstupom algoritmu je konfigurácia, ktorá pri daných pozorovaniach a pri danom počete zhlukov minimalizuje celkový súčet štvorcov chýb (resp. vzdialenosti od stredu), t.j. výraz

$$
\sum_{k =1}^{K} \sum_{i \in \pi(k)} (\boldsymbol{x}_i - \boldsymbol{\mu}_k)^2
$$

je najmenší možný, kde $\pi(k) = \{i \in \{1, \dots, n\};~E[\boldsymbol{x}_i | k] = \boldsymbol{\mu}_k\}$ je množina indexov pozorovaní, ktoré patria do zhluku $k \in \{1, \dots, K\}$. Jednotlivé stredné hodnoty majú určitú ''váhu'' (určité zastúpenie) v celkovom súbore pozorovaní (v tzv. celkovej ''mixture'') a pre nové pozorovanie $\boldsymbol{x}$, bez znalosti jeho priradenia do konkrétneho zhluku, možeme pre strednú hodnotu napísať

$$
E[x] = P(k = 1) \mu_1 + \dots + P(k = K) \mu_{K}.
$$


V programe R je pre zhlukovací  K-means algoritmus  určená funkcia `kmeans()`, opäť k dispozícii pod štandardnou inštaláciou programu R. 
Cieľom algoritmu je nájsť, resp. zostrojiť $K \in \mathbb{N}$ disjunktných clustrov (hodnota $K$ je zvolená predom a je vstupom pre K-means algoritmus), tak aby celková variabilia vrámci clustrov (within-cluster variability) bola minimálna. Stredy jednotlivých clustrov, teda parametre $\boldsymbol{\mu}_k$ sú neznáme. <br><br>

Pripomína to klasický problém <b>sliepka-vajce</b> a otázku, čo bolo skôr: ak by sme poznali správne priradenie pozorovaní $\boldsymbol{x}_i$ do jednotlivých clustrov $k_i$, problém nájdenia (odhadnutia) neznámych priemerov $\boldsymbol{\mu}_k$ by bol triviálny. Na druhú stranu, 
ak by sme poznali skutočné hodnoty neznámych parametrov $\boldsymbol{\mu}_k$, úloha priradenia pozorovaní medzi jednotlivé clustre by bola 
opäť triviálna. Riešenie v K-means algoritme sa hľada postupne vo forme iteratívnych krokov. V niektorých prípadoch môže byť algoritmus pomerne časovo náročný. 

<br><br>

Pre ilustráciu opôť využijeme datový súbor `mtcars` a budeme hľadať tri neznáme clustre: 

```{r, fig.width=10}
Kmeans <- kmeans(mtcars, centers = 3)
colVector <- as.numeric(Kmeans$cluster)

plot(mtcars$mpg ~ mtcars$hp, bg = colVector, xlab = "Horse Power", ylab = "Miles per Gallon", pch = 21, col = "black")
points(Kmeans$centers[,1] ~ Kmeans$centers[,4], col = 1:3, pch = 8, cex = 2)
text((mtcars$mpg + 1) ~ mtcars$hp,labels=rownames(mtcars), col=colVector, cex = 0.5)
```

Je asi nutné pripomenúť, že sa opäť dívame na mnohorozmerné data zobrazené prostredníctvom dvojrozmerného $xy$ scatterplotu. Interpretácia zhlukov na základe predchádzajúceho obrázku asi nie je jednoduchá. Situácia sa ale zmení, ak vykreslíme tie isté data a tie isté zhluky prostredníctvom iných dvoch premenných. Dodatočne zahrnieme aj informáciu o počte válcov. 


```{r, fig.width=10}
plot(mtcars$mpg ~ mtcars$disp, bg = colVector, xlab = "Displacement", ylab = "Miles per Gallon", pch = 19 + cyl/2, col = "black")
points(Kmeans$centers[,1] ~ Kmeans$centers[,3], col = "black", pch = 21, cex = 2, bg = 1:3)
text((mtcars$mpg + 1) ~ mtcars$disp,labels=rownames(mtcars), col=colVector, cex = 0.5)
legend(420, 34, legend = c("4 Cylinders", "6 Cylinders", "8 Cylinders"), pch = c(21, 22, 23), bg = "grey")
```

<br><br>



#### <font color = "#880000">Poznámka</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
 <ul>
 <li>Z popisu algoritmov je zrejme, že škálovanie hraje podstatnú rolu: ak nahradíme niektorú premennú, napr. $X_{j}$ novou premennou $2 X_{j}$ (t.j. preškálujeme a použijeme polovičné měřítko), tak potom príslušná dimenzia sa započíta dvojnásobne pri určovaní vzdialenosti medzi pozorovaniami. Následne to bude mať aj vplyv na priradenie pozorovaní do zhlukov.</li>
 
 <li>Doporučuje sa používať štandardizované data.  Pre centroidy jednotlivých zhlukov $\mu_{k j}$ pre $k = 1, \dots, K$ a pôvodné premenné $j = 1, \dots, p$ môžeme clustre interpretovať v zmysle štandardných odchýliek od marginálných priemerov.
 Aplikujte K-means algoritmus analogicky ako v predchádzajúcom prípade, ale najprv štandardizujte data. Výsledky porovnajte. </li>
 
 
 <li>Zhluková analýza pripomína v určitom zmysle zhlukové modely -- tzv. mixture models -- na ktoré sa pozrieme za dva týždne. </li>
 </ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br><br>




Využijeme ešte jeden ilustračný príklad. Data reprezentujú konzumáciu proteinu v Európe. 

```{r}
protein <- read.csv("http://msekce.karlin.mff.cuni.cz/~maciak/NMST539/protein.csv", header = T, row.names=1)
sprotein <- scale(protein) 
head(protein)
```

Pre K-means algoritmus použijeme len informáciu o konzumácii bieleho a červeného mäsa -- t.j. prvé dve premenné z pôvodných dat (ktoré 
pre použitie zhlukovacieho algoritmu štandardizujeme). 

```{r, fig.width = 10}
subset<-sprotein[,(1:2)]
plot(subset,pch=19,col=4,cex=0.2)
text(subset,labels=rownames(protein))
```

Definujeme tri zhluky a pomocou K-means algoritmu sa pokusíme roztriediť Európske krajiny podľa miery konzumácie bieleho a červeného mäsa. 

```{r, fig.width=10}
grpMeat<- kmeans(subset, center=3, nstart=10)

plot(subset,pch=19,col=4,cex=0.2)
text(subset,labels=rownames(protein), col=grpMeat$cluster+1)
means<-grpMeat$centers
points(means,col=c(2,3,4),cex=2,pch=4)
```



Celkový počet clustrov bol zvolený predom. V niektorých prípadoch ale chýba táto informácia a nie je jednoduché počet clustrov zvoliť predom. Pre voľbu počtu clustrov sa doporučujú rôzne postupy: 

<ul>
<li>Zhluková analýza sa často využíva ako exploratívnýy nástroj. Z tohto pohľadu je užitočné voliť hodnotu $K$ tak, aby 
celkový počet clustrov dával zmysel z hľadiska interpretácie. </li>

<li>Iný postup pre voľbu $K \in \mathbb{N}$  je  založený na rôznych modeloch, kedy sa zhlukovací algoritmus aplikuje pre postupnosť hodnôt $K_1 < K_2 < \dots, K_M$ a výsledne sa zvolí model, ktorý dáva najlepšie výsledky (napr. z pohľadu vhodne zvoleného tzv. ''model selection'' kritéria). </li>

<li>Využiť lze napr. BIC alebo AIC kritérium (alebo im podobné), prípadne aplikovať tzv. krížove overovanie (cross-validation). 
Cekový počet stupňov voľnosti (resp. parametrov) je $K \times p$, kde $K$ je počet zhlukov a $p \in \mathbb{N}$ je počet premenných v pôvodných datach (t.j. jeden neznámy parameter pro strednú hodnotu každého zhluku v každej dimenzii). </li>
</ul>

<br><br>

Celkový súčet štvorcov pre data o konzumácii bieleho a červeného mäsa a tri clustr (K-means algoritmus): 

```{r}
mean_overall<-apply(subset,2,mean)
means_between<-(t(means)-mean_overall)^2
sum(t(means_between)*grpMeat$size)
```

Variabilitu vrámci jednotlivých clustrov môžeme vizualizovať: 

```{r, fig.width = 10}
grpMeat<- kmeans(subset, center=3, nstart=10)

plot(subset,pch=19,col=4,cex=0.2)
text(subset,labels=rownames(protein), col=grpMeat$cluster+1)
means<-grpMeat$centers
points(means,col=c(2,3,4),cex=2,pch=4)

for(i in (1:nrow(protein))){  
	if (grpMeat$cluster[i]==1){
		lines(c(subset[i,1],means[1,1]), c(subset[i,2],means[1,2]),col=2)
	}
	if (grpMeat$cluster[i]==2){
		lines(c(subset[i,1],means[2,1]), c(subset[i,2],means[2,2]),col=3)
	}
	if (grpMeat$cluster[i]==3){
		lines(c(subset[i,1],means[3,1]), c(subset[i,2],means[3,2]),col=4)
	}}
```

Analogicky, variabilita medzi jednotlivými clustrami: 

```{r, fig.width=10}
plot(subset,pch=19,col=grpMeat$cluster+1,cex=0.2)

means<-grpMeat$centers
points(means,col=c(2,3,4),cex=2,pch=4)
points(mean_overall[1],mean_overall[2],pch=4,lwd=3)

lines(c(mean_overall[1],means[3,1]), c(mean_overall[2],means[3,2]), col=4)
lines(c(mean_overall[1],means[2,1]), c(mean_overall[2],means[2,2]), col=3)
lines(c(mean_overall[1],means[1,1]), c(mean_overall[2],means[1,2]), col=2)

text(c(10,12,9),c(10,8,6),grpMeat$size)
```


Celkový súčet štvorcov je (podobne ako v prípade lineárnej regresie) rozložený do troch hlavných častí: variabilita vrámci jednotlivých clustrov (within clusters sum of squares)


```{r}
grpMeat$tot.withinss
```

variabilita medzi jednotlivými zhlukmi (between clusters sum of squares)

```{r}
grpMeat$betweenss
```

a na záver, celková variabilita dat (total sum of squares) definovaná ako súčet predchádzajúcich dvoch kvantít

```{r}
grpMeat$tot.withinss+grpMeat$betweenss
```

```{r, fig.width = 10}
plot(subset,pch=19,col=4,cex=0.2)
text(subset,labels=rownames(protein), col=grpMeat$cluster+1)
means<-apply(subset, 2, mean)
points(means[1], means[2],bg="black",cex=2,pch=21)

for(i in (1:nrow(subset))){  
	lines(c(subset[i,1],means[1]), c(subset[i,2],means[2]),col="black", lty = 3)
}
```

<br><br>

#### <font color = "#880000">Samostatne</font>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
 <ul>
  <li>Aplikujte K-means algoritmus s inými počiatočnými hodnotami. Aký to ma vplyv na výsledné zhluky?  </li>
 <li>Pomocou internetu preskúmajte ďalšie možností zhlukovej analýzy, ktoré sú v rôznych R knižniciach 
 a rozšíreniach.  </li>
 </ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br><br>




<br><br>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<hr size="3" width="100%" noshade style="color:#440000" align="left" /><br><br> 

## <font color = "#880000"><b>Domáca (samostatná) úloha </b></font>
### (Deadline: Cvičenie č.11 / 11.05.2021)

<hr size="3" width="100%" noshade style="color:#440000" align="left" />

<ul>
<li>Vyberte si vhodný datový súbor (napr. data, ktoré ste uvažovali v prvej, štvrtej, alebo predchádzajúcich troch úlohach); </li>

<li>Použijte K-means algoritmus a pomocou vhodného rozhodovacieho kritéria rozhodnite o počte zhlukov. Následne využijte hierarchický 
aglomeratívny zlukovací algoritmus a zvoľte stejný počet zhlukov, ako pri K-means algoritme. Porovnajte výsledky a jednotlivé zhluky. </li>

<li> Riešenie umiestnite na svoju webovú stránku, <font color = "red">najneskôr v utorok, 11.05.2021, do 14:00</font>.</li>
</ul>
<hr size="3" width="100%" noshade style="color:#440000" align="left" />
<br><br>

<br><br>

</td></tr></table>
<br><br><br>