class: center, middle, inverse, title-slide # Unsupervised learning ### Maschinelles Lernen mit R
The R Bootcamp
### Oktober 2020 --- layout: true <div class="my-footer"> <span style="text-align:center"> <span> <img src="https://raw.githubusercontent.com/therbootcamp/therbootcamp.github.io/master/_sessions/_image/by-sa.png" height=14 style="vertical-align: middle"/> </span> <a href="https://therbootcamp.github.io/"> <span style="padding-left:82px"> <font color="#7E7E7E"> www.therbootcamp.com </font> </span> </a> <a href="https://therbootcamp.github.io/"> <font color="#7E7E7E"> Maschinelles Lernen mit R | Oktober 2020 </font> </a> </span> </div> --- <br><br> # Unsupervised learning .pull-left45[ <ul> <li class="m1"><span>Ziel des Unsupervised learning ist die Identifikation <high>versteckter Muster</high> in den <high>Ähnlichkeiten</high> zwischen Cases oder Features.</span></li><br> <li class="m2"><span>Man unterscheidet zwei Unterbereiche: <high>Clusteranalyse</high> und <high>Dimensionsreduktion</high>.</span></li><br> </ul> ] .pull-right45[ <p align = "center"> <img src="image/unsupervised.jpg"><br> <font style="font-size:10px">from <a href="https://www.c-span.org/organization/?9764/Copley-News-Service">c-span.org</a></font> </p> ] --- .pull-left35[ # Zwei Kernbereiche des UL <ul> <li class="m1"><span><b>Dimensionsreduktion</b></span></li> <ul> <li><span>Basiert auf den Ähnlichkeiten der <high>Features</high>.</span></li> <li><span>Dient der <high>Identifikation der relevanten Dimensionen</high> in den Daten und ist ein Kernbestandteil des Deep Learnings.</span></li> </ul><br> <li class="m2"><span><b>Clusteranalyse</b></span></li> <ul> <li><span>Basiert auf den Ähnlichkeiten der <high>Cases</high>.</span></li> <li><span>Dient der <high>Identifikation von Gruppen und Ausreissern</high> in den Daten.</span></li> </ul> </ul> ] .pull-right55[ <br> <p align = "center"> <img src="image/types.png" height=520px><br> </p> ] --- .pull-left4[ # Gapminder <ul> <li class="m1"><span>Hans Rosling's Gapminder Projekt kartographiert die <high>gesundheitliche und ökonomische Entwicklung in den Ländern</high> der Welt.</span></li> <li class="m2"><span>Gibt es klar abgrenzbare Klassen von Ländern</high>: z.B. <high>Entwickelte versus Entwicklungsländer</high>.</span></li> </ul> <p align = "center" style="margin-top:55px"> <img src="image/rosling.png" height=200px><br> <font style="font-size:10px">Hans Rosling, 1948-2017, adapted from <a href="https://www.volkskrant.nl/cultuur-media/hans-rosling-68-volksverheffer-met-rocksterstatus~b3746a58/?referer=https%3A%2F%2Fwww.google.com%2F">volkskrant.nl</a></font> </p> ] .pull-right5[ <br> <p align = "center"> <img src="image/gapminder.png" height=520px><br> <font style="font-size:10px">adapted from <a href="https://www.ullstein-buchverlage.de/nc/buch/details/factfulness-9783548060415.html">Factfulness, Hans Rosling, Ullstein</a></font> </p> ] --- .pull-left4[ # Gapminder <ul> <li class="m1"><span>Hans Rosling's Gapminder Projekt kartographiert die <high>gesundheitlichz und ökonomische Entwicklung in den Ländern</high> der Welt.</span></li> <li class="m2"><span>Gibt es klar abgrenzbare Klassen von Ländern</high>: z.B. <high>Entwickelte versus Entwicklungsländer</high>.</span></li> </ul> <p align = "center" style="margin-top:55px"> <img src="image/rosling.png" height=200px><br> <font style="font-size:10px">Hans Rosling, 1948-2017, adapted from <a href="https://www.volkskrant.nl/cultuur-media/hans-rosling-68-volksverheffer-met-rocksterstatus~b3746a58/?referer=https%3A%2F%2Fwww.google.com%2F">volkskrant.nl</a></font> </p> ] .pull-right5[ <br> <p align = "center"> <img src="image/data.gif"><br> <font style="font-size:10px">data from <a href="https://cran.r-project.org/web/packages/gapminder/README.html">gapminder</a></font> </p> ] --- .pull-left4[ # Gap in 1952 <ul> <li class="m1"><span>Gibt es <high>in 1952 Klassen von Ländern</high> gemäss Lebenserwartung und BIP pro Kopf in 1952?</span></li><br> <li class="m2"><span>Verfahren:</span></li><br> <ul> <li><span><high><i>k</i>-means</high></span></li><br> <li><span><high>DBSCAN</high></span></li><br> <li><span><high>Gaussian mixtures</high></span></li> </ul> </ul> ] .pull-right5[ <br> <p align = "center"> <img src="image/gap1952.png"><br> </p> ] --- .pull-left4[ # <i>k</i>-means <ul> <li class="m1"><span>Das Standardverfahren für Clusteranalyse.</span></li><br> <li class="m2"><span><b>Algorithmus</b></span></li><br> <ol class=""> <li><span>Zufällige <high>Startpunkte</high> für die Clusterzentroide wählen.</span></li><br> <li><span>Cases dem nächstgelegenen <high>Klassenzentroid zuweisen</high>.</span></li><br> <li><span><high>Neue Clusterzentroide</high> als Mittel aller Cases eines Clusters berechnen.</span></li> </ol> </ul> ] .pull-right5[ <br> <p align = "center"> <img src="image/kmeans.gif"><br> </p> ] --- .pull-left4[ # <i>k</i>-means <ul> <li class="m1"><span>Das Standardverfahren für Clusteranalyse.</span></li><br> <li class="m2"><span><b>Algorithmus</b></span></li><br> <ol class=""> <li><span>Zufällige <high>Startpunkte</high> für die Clusterzentroide wählen.</span></li><br> <li><span>Cases dem nächstgelegenen <high>Klassenzentroid zuweisen</high>.</span></li><br> <li><span><high>Neue Clusterzentroide</high> als Mittel aller Cases eines Clusters berechnen.</span></li> </ol> </ul> ] .pull-right5[ <br> ```r # berechne k-means gap_kmeans <- kmeans(gap1952, centers = 3) # zeige Inhalte names(gap_kmeans) ``` ``` ## [1] "cluster" "centers" "totss" ## [4] "withinss" "tot.withinss" "betweenss" ## [7] "size" "iter" "ifault" ``` ```r # zeige Cluster gap_kmeans$cluster ``` ``` ## [1] 3 3 3 1 1 2 1 2 3 2 3 1 3 3 3 3 3 3 3 3 2 3 ## [23] 3 1 3 3 3 3 3 1 3 1 1 2 2 1 3 1 3 1 3 3 3 1 ## [45] 2 1 3 2 3 1 3 3 3 3 3 1 1 2 3 3 1 1 1 1 1 1 ## [67] 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3 1 3 1 3 3 3 3 ## [89] 3 2 2 1 3 3 2 3 3 3 3 1 3 1 1 1 1 1 3 3 1 3 ## [111] 1 3 3 1 1 3 1 1 3 3 3 2 2 3 3 3 3 3 1 3 3 3 ## [133] 2 2 1 2 3 3 3 3 3 ``` ] --- .pull-left4[ # <i>k</i>-selection <ul> <li class="m1"><span>Es gibt <high>kein richtiges <i>k</i></high>!.</span></li><br> <li class="m2"><span>Durch Abwägung folgender zwei Aspekte können <high>angemessene <i>k</i></high> identifziert werden:</span></li> <ul> <li><span><i>k</i> sollte <high>möglichst klein</high> sein.</span></li> <li><span>Mit <i>k</i> sollte das Modell die <high>Daten möglichst gut beschreiben</high>.</span></li> </ul><br> <li class="m3"><span><b>Ansätze</b></span></li> <ul> <li><span>Ellbogen der <high>Binnenvarianz</high>.</span></li> <li><span>Gap-Statistik.</span></li> <li><span>Slope-Statistik.</span></li> <li><span>Cluster-Instabilität.</span></li> <li><span>etc.</span></li> </ul> </ul> </ul> ] .pull-right5[ <br> <p align = "center"> <img src="image/k-selection1.gif"><br> <img src="image/k-selection2.gif"><br> </p> ] --- .pull-left4[ # <i>k</i>-selection <ul> <li class="m1"><span>Es gibt <high>kein richtiges <i>k</i></high>!.</span></li><br> <li class="m2"><span>Durch Abwägung folgender zwei Aspekte können <high>angemessene <i>k</i></high> identifziert werden:</span></li> <ul> <li><span><i>k</i> sollte <high>möglichst klein</high> sein.</span></li> <li><span>Mit <i>k</i> sollte das Modell die <high>Daten möglichst gut beschreiben</high>.</span></li> </ul><br> <li class="m3"><span><b>Ansätze</b></span></li> <ul> <li><span>Ellbogen der <high>Binnenvarianz</high>.</span></li> <li><span>Gap-Statistik.</span></li> <li><span>Slope-Statistik.</span></li> <li><span>Cluster-Instabilität.</span></li> <li><span>etc.</span></li> </ul> </ul> </ul> ] .pull-right5[ <br><br><br><br> ```r # lade cstab library(cstab) # berechne k-sel gap_ksel <- cDistance(as.matrix(gap1952), kseq = 2:10, method = "kmeans") # zeige geschätze Clusteranzahl gap_ksel$k_Gap ``` ``` ## [1] 1 ``` ```r gap_ksel$k_Slope ``` ``` ## [1] 2 ``` ] --- .pull-left4[ # <i>k</i>-selection <ul> <li class="m1"><span>Es gibt <high>kein richtiges <i>k</i></high>!.</span></li><br> <li class="m2"><span>Durch Abwägung folgender zwei Aspekte können <high>angemessene <i>k</i></high> identifziert werden:</span></li> <ul> <li><span><i>k</i> sollte <high>möglichst klein</high> sein.</span></li> <li><span>Mit <i>k</i> sollte das Modell die <high>Daten möglichst gut beschreiben</high>.</span></li> </ul><br> <li class="m3"><span><b>Ansätze</b></span></li> <ul> <li><span>Ellbogen der <high>Binnenvarianz</high>.</span></li> <li><span>Gap-Statistik.</span></li> <li><span>Slope-Statistik.</span></li> <li><span>Cluster-Instabilität.</span></li> <li><span>etc.</span></li> </ul> </ul> </ul> ] .pull-right5[ <br><br><br><br> ```r # lade cstab library(cstab) # berechne k-sel gap_ksel <- cStability(as.matrix(gap1952), kseq = 2:10, method = "kmeans") ``` ```r # zeige geschätze Clusteranzahl gap_ksel$k_instab ``` ``` ## [1] 2 ``` ] --- .pull-left4[ # DBSCAN <ul> <li class="m1"><span>DBSCAN = Density-Based Spatial Clustering of Applications with Noise.</span></li><br> <li class="m2"><span><b>Algorithmus</b></span></li><br> <ol> <li><span>Für jeden Punkt Anzahl anderer <high>Punkte im Abstand von <b>ε</b></high> überprüfen:<br>a. N = 0 <b>→</b> <high>Ausreisser</high><br>b. N ≥ <i>minPts</i> <b>→</b> <high>Kernpunkt</high><br>c. <i>minPts</i> > N > 0 <b>→</b> <high>unbestimmt</high></span></li><br> <li><span><high>Kernpunkte</high> mit Abstand < <b>ε</b>; zueinander zu Clustern verbinden.</span></li><br> <li><span><high>Unbestimmte Punkte</high> mit Abstand < <b>ε</b>; zu Kernpunkten dem Cluster hinzufügen, sonst Ausreisser.</span></li> </ol> </ul> ] .pull-right5[ <br> <p align = "center"> <font style="font-size:20px;font-weight:900">ε = .2</font> <img src="image/dbscan_1.gif"><br> </p> ] --- .pull-left4[ # DBSCAN <ul> <li class="m1"><span>DBSCAN = Density-Based Spatial Clustering of Applications with Noise.</span></li><br> <li class="m2"><span><b>Algorithmus</b></span></li><br> <ol> <li><span>Für jeden Punkt Anzahl anderer <high>Punkte im Abstand von <b>ε</b></high> überprüfen:<br>a. N = 0 <b>→</b> <high>Ausreisser</high><br>b. N ≥ <i>minPts</i> <b>→</b> <high>Kernpunkt</high><br>c. <i>minPts</i> > N > 0 <b>→</b> <high>unbestimmt</high></span></li><br> <li><span><high>Kernpunkte</high> mit Abstand < <b>ε</b>; zueinander zu Clustern verbinden.</span></li><br> <li><span><high>Unbestimmte Punkte</high> mit Abstand < <b>ε</b>; zu Kernpunkten dem Cluster hinzufügen, sonst Ausreisser.</span></li> </ol> </ul> ] .pull-right5[ <br> <p align = "center"> <font style="font-size:20px;font-weight:900">ε = .3</font> <img src="image/dbscan_2.gif"><br> </p> ] --- .pull-left4[ # DBSCAN <ul> <li class="m1"><span>DBSCAN = Density-Based Spatial Clustering of Applications with Noise.</span></li><br> <li class="m2"><span><b>Algorithmus</b></span></li><br> <ol> <li><span>Für jeden Punkt Anzahl anderer <high>Punkte im Abstand von <b>ε</b></high> überprüfen:<br>a. N = 0 <b>→</b> <high>Ausreisser</high><br>b. N ≥ <i>minPts</i> <b>→</b> <high>Kernpunkt</high><br>c. <i>minPts</i> > N > 0 <b>→</b> <high>unbestimmt</high></span></li><br> <li><span><high>Kernpunkte</high> mit Abstand < <b>ε</b>; zueinander zu Clustern verbinden.</span></li><br> <li><span><high>Unbestimmte Punkte</high> mit Abstand < <b>ε</b>; zu Kernpunkten dem Cluster hinzufügen, sonst Ausreisser.</span></li> </ol> </ul> ] .pull-right5[ <br><br><br><br> ```r # lade dbscan library(dbscan) # berechne dbscan gap_dbscan <- dbscan(scale(gap1952), eps = .2) # zeige Ergebnis gap_dbscan ``` ``` ## DBSCAN clustering for 141 objects. ## Parameters: eps = 0.2, minPts = 5 ## The clustering contains 2 cluster(s) and 57 noise points. ## ## 0 1 2 ## 57 72 12 ## ## Available fields: cluster, eps, minPts ``` ] --- .pull-left4[ # Eigenschaften von DBSCAN <ul> <li class="m1"><span><b>Vorteile</b></span></li> <ul> <li><span><high>Identifiziert <i>k</i></high> eigenständig.</span></li> <li><span>Kann <high>"komplexe" Cluster</high> identifizieren.</span></li> <li><span>Eignet sich für die Erkennung von <high>Anomalien</high>.</span></li> </ul> <li class="m2"><span><b>Nachteile</b>.</span></li> <ul> <li><span>Reagiert <high>sehr sensibel</high> auf Änderungen der Parameter.</span></li> <li><span>Schwierigkeiten mit <high>Clustern ungleicher Dichte</high>.</span></li> </ul> </ul> ] .pull-right5[ <p align = "center"> <img src="image/dbscan_adv1.gif"><br> <img src="image/dbscan_adv2.gif"><br> </p> ] --- .pull-left4[ # Eigenschaften von DBSCAN <ul> <li class="m1"><span><b>Vorteile</b></span></li> <ul> <li><span><high>Identifiziert <i>k</i></high> eigenständig.</span></li> <li><span>Kann <high>"komplexe" Cluster</high> identifizieren.</span></li> <li><span>Eignet sich für die Erkennung von <high>Anomalien</high>.</span></li> </ul><br> <li class="m2"><span><b>Nachteile</b>.</span></li> <ul> <li><span>Reagiert <high>sehr sensibel</high> auf Änderungen der Parameter.</span></li> <li><span>Schwierigkeiten mit <high>Clustern ungleicher Dichte</high>.</span></li> </ul> </ul> ] .pull-right5[ <p align = "center"> <img src="image/dbscan_adv3.gif"><br> <img src="image/dbscan_adv4.gif"><br> </p> ] --- .pull-left4[ # Eigenschaften von DBSCAN <ul> <li class="m1"><span><b>Vorteile</b></span></li> <ul> <li><span><high>Identifiziert <i>k</i></high> eigenständig.</span></li> <li><span>Kann <high>"komplexe" Cluster</high> identifizieren.</span></li> <li><span>Eignet sich für die Erkennung von <high>Anomalien</high>.</span></li> </ul><br> <li class="m2"><span><b>Nachteile</b>.</span></li> <ul> <li><span>Reagiert <high>sehr sensibel</high> auf Änderungen der Parameter.</span></li> <li><span>Schwierigkeiten mit <high>Clustern ungleicher Dichte</high>.</span></li> </ul> </ul> ] .pull-right5[ <p align = "center"> <img src="image/dbscan_adv5.gif"><br> <img src="image/dbscan_adv6.gif"><br> </p> ] --- .pull-left4[ # Gaussian mixtures <ul> <li class="m1"><span>Eine probabilistische <high>Erweiterung des <i>k</i>-means Algorithmus</high> auf Basis multivariater Normalverteilungen</span></li> <li class="m2"><span>Guter Umgang mit Clustern verschiedener <high>Orientierungen und Dichten</high></span></li> <li class="m3"><span>Einfache Schätzung <i>k</i> über <high>Modellvergleiche</high></span></li> <li class="m4"><span><high>Komplexe Topologien</high> bereiten Gaussian mixtures jedoch Schwierigkeiten</span></li> </ul> ] .pull-right5[ <br> <p align = "center"> <img src="image/mclust1.png"><br> </p> ] --- .pull-left4[ # Gaussian mixtures <ul> <li class="m1"><span>Eine probabilistische <high>Erweiterung des <i>k</i>-means Algorithmus</high> auf Basis multivariater Normalverteilungen</span></li> <li class="m2"><span>Guter Umgang mit Clustern verschiedener <high>Orientierungen und Dichten</high></span></li> <li class="m3"><span>Einfache Schätzung <i>k</i> über <high>Modellvergleiche</high></span></li> <li class="m4"><span><high>Komplexe Topologien</high> bereiten Gaussian mixtures jedoch Schwierigkeiten</span></li> </ul> ] .pull-right5[ <br> <p align = "center"> <img src="image/mclust2.png"><br> </p> ] --- .pull-left4[ # Gaussian mixtures <ul> <li class="m1"><span>Eine probabilistische <high>Erweiterung des <i>k</i>-means Algorithmus</high> auf Basis multivariater Normalverteilungen</span></li> <li class="m2"><span>Guter Umgang mit Clustern verschiedener <high>Orientierungen und Dichten</high></span></li> <li class="m3"><span>Einfache Schätzung <i>k</i> über <high>Modellvergleiche</high></span></li> <li class="m4"><span><high>Komplexe Topologien</high> bereiten Gaussian mixtures jedoch Schwierigkeiten</span></li> </ul> ] .pull-right5[ <br><br><br><br> ```r # lade gaussian mixture library(mclust) # berechne gaussian mixture gap_mclust <- Mclust(gap1952) # zeige Ergebnis gap_mclust ``` ``` ## 'Mclust' model object: (VVE,3) ## ## Available components: ## [1] "call" "data" ## [3] "modelName" "n" ## [5] "d" "G" ## [7] "BIC" "loglik" ## [9] "df" "bic" ## [11] "icl" "hypvol" ## [13] "parameters" "z" ## [15] "classification" "uncertainty" ``` ] --- .pull-left4[ # Gaussian mixtures <ul> <li class="m1"><span>Eine probabilistische <high>Erweiterung des <i>k</i>-means Algorithmus</high> auf Basis multivariater Normalverteilungen</span></li> <li class="m2"><span>Guter Umgang mit Clustern verschiedener <high>Orientierungen und Dichten</high></span></li> <li class="m3"><span>Einfache Schätzung <i>k</i> über <high>Modellvergleiche</high></span></li> <li class="m4"><span><high>Komplexe Topologien</high> bereiten Gaussian mixtures jedoch Schwierigkeiten</span></li> </ul> ] .pull-right5[ <br><br><br><br> ```r # lade gaussian mixture library(mclust) # berechne gaussian mixture gap_mclust <- Mclust(gap1952) # zeige Ergebnis gap_mclust$classification ``` ``` ## [1] 1 2 2 2 3 3 3 2 1 3 1 2 2 1 2 2 1 1 1 1 3 1 ## [23] 1 2 1 2 1 1 2 2 1 2 2 3 3 2 1 2 1 2 1 1 1 3 ## [45] 3 2 1 3 1 3 2 1 1 1 2 2 3 3 1 1 2 2 3 3 3 2 ## [67] 3 1 1 2 1 2 1 1 2 1 1 2 1 1 2 2 1 2 1 1 1 2 ## [89] 1 3 3 2 1 1 3 1 1 2 3 2 1 2 2 3 2 2 1 1 2 1 ## [111] 2 1 2 3 3 1 2 3 2 1 1 3 3 2 2 1 2 1 2 1 2 1 ## [133] 3 3 3 2 1 1 1 1 1 ``` ] --- class: middle, center <h1><a href=https://therbootcamp.github.io/ML_2020Oct/_sessions/Unsupervised/Unsupervised_practical.html>Practical</a></h1>