{ "cells": [ { "cell_type": "markdown", "source": [ "## **Nigeriansk musik hentet fra Spotify - en analyse**\n", "\n", "Clustering er en type [Unsupervised Learning](https://wikipedia.org/wiki/Unsupervised_learning), der antager, at et datasæt er ulabeleret, eller at dets input ikke er matchet med foruddefinerede output. Det bruger forskellige algoritmer til at sortere gennem ulabeleret data og levere grupperinger baseret på mønstre, det identificerer i dataene.\n", "\n", "[**Quiz før forelæsning**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n", "\n", "### **Introduktion**\n", "\n", "[Clustering](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) er meget nyttigt til dataudforskning. Lad os se, om det kan hjælpe med at opdage tendenser og mønstre i den måde, nigerianske lyttere forbruger musik på.\n", "\n", "> ✅ Tag et øjeblik til at tænke over anvendelserne af clustering. I hverdagen sker clustering, når du har en bunke vasketøj og skal sortere familiens tøj 🧦👕👖🩲. I datavidenskab sker clustering, når man forsøger at analysere en brugers præferencer eller bestemme egenskaberne for et ulabeleret datasæt. Clustering hjælper på en måde med at skabe orden i kaos, som en rodet sokkeskuffe.\n", "\n", "I en professionel kontekst kan clustering bruges til at bestemme ting som markedssegmentering, f.eks. hvilke aldersgrupper der køber hvilke varer. En anden anvendelse kunne være at opdage anomalier, måske for at afsløre svindel i et datasæt med kreditkorttransaktioner. Eller du kunne bruge clustering til at identificere tumorer i en samling af medicinske scanninger.\n", "\n", "✅ Tænk et øjeblik over, hvordan du måske har stødt på clustering 'i det virkelige liv', i en bank-, e-handels- eller forretningssammenhæng.\n", "\n", "> 🎓 Interessant nok stammer clusteranalyse fra antropologi og psykologi i 1930'erne. Kan du forestille dig, hvordan det kunne være blevet brugt?\n", "\n", "Alternativt kunne du bruge det til at gruppere søgeresultater - f.eks. efter shoppinglinks, billeder eller anmeldelser. Clustering er nyttigt, når du har et stort datasæt, som du vil reducere og analysere mere detaljeret, så teknikken kan bruges til at lære om data, før andre modeller konstrueres.\n", "\n", "✅ Når dine data er organiseret i klynger, tildeler du dem en cluster-id, og denne teknik kan være nyttig til at bevare et datasæts privatliv; du kan i stedet referere til et datapunkt ved dets cluster-id frem for mere afslørende identificerbare data. Kan du komme på andre grunde til, hvorfor du ville referere til et cluster-id frem for andre elementer i klyngen for at identificere det?\n", "\n", "### Kom godt i gang med clustering\n", "\n", "> 🎓 Hvordan vi skaber klynger har meget at gøre med, hvordan vi samler datapunkterne i grupper. Lad os dykke ned i nogle begreber:\n", ">\n", "> 🎓 ['Transduktiv' vs. 'induktiv'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n", ">\n", "> Transduktiv inferens er afledt af observerede træningscases, der kortlægges til specifikke testcases. Induktiv inferens er afledt af træningscases, der kortlægges til generelle regler, som først derefter anvendes på testcases.\n", ">\n", "> Et eksempel: Forestil dig, at du har et datasæt, der kun delvist er labeleret. Nogle ting er 'plader', nogle 'cd'er', og nogle er blanke. Din opgave er at give labels til de blanke. Hvis du vælger en induktiv tilgang, ville du træne en model til at finde 'plader' og 'cd'er' og anvende disse labels på dine ulabelerede data. Denne tilgang vil have svært ved at klassificere ting, der faktisk er 'kassetter'. En transduktiv tilgang håndterer derimod denne ukendte data mere effektivt, da den arbejder på at gruppere lignende ting sammen og derefter anvender en label på en gruppe. I dette tilfælde kunne klynger afspejle 'runde musikting' og 'firkantede musikting'.\n", ">\n", "> 🎓 ['Ikke-flad' vs. 'flad' geometri](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n", ">\n", "> Afledt af matematisk terminologi refererer ikke-flad vs. flad geometri til målingen af afstande mellem punkter ved enten 'flade' ([Euclidiske](https://wikipedia.org/wiki/Euclidean_geometry)) eller 'ikke-flade' (ikke-Euclidiske) geometriske metoder.\n", ">\n", "> 'Flad' i denne sammenhæng refererer til Euclidisk geometri (dele af det undervises som 'plan' geometri), og ikke-flad refererer til ikke-Euclidisk geometri. Hvad har geometri med maskinlæring at gøre? Som to felter, der er rodfæstet i matematik, skal der være en fælles måde at måle afstande mellem punkter i klynger, og det kan gøres på en 'flad' eller 'ikke-flad' måde, afhængigt af dataens natur. [Euclidiske afstande](https://wikipedia.org/wiki/Euclidean_distance) måles som længden af en linjesegment mellem to punkter. [Ikke-Euclidiske afstande](https://wikipedia.org/wiki/Non-Euclidean_geometry) måles langs en kurve. Hvis dine data, visualiseret, ikke ser ud til at eksistere på en plan, kan du have brug for en specialiseret algoritme til at håndtere det.\n", "\n", "

\n", " \n", "

Infografik af Dasani Madipalli
\n", "\n", "\n", "\n", "> 🎓 ['Afstande'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n", ">\n", "> Klynger defineres af deres afstandsmatrix, f.eks. afstandene mellem punkter. Denne afstand kan måles på flere måder. Euclidiske klynger defineres af gennemsnittet af punktværdierne og indeholder en 'centroid' eller midtpunkt. Afstande måles således ved afstanden til denne centroid. Ikke-Euclidiske afstande refererer til 'clustroids', punktet tættest på andre punkter. Clustroids kan igen defineres på forskellige måder.\n", ">\n", "> 🎓 ['Begrænset'](https://wikipedia.org/wiki/Constrained_clustering)\n", ">\n", "> [Begrænset clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) introducerer 'semi-supervised' læring i denne usupervisede metode. Forholdene mellem punkter markeres som 'kan ikke linkes' eller 'skal linkes', så nogle regler påtvinges datasættet.\n", ">\n", "> Et eksempel: Hvis en algoritme får frit spil på en samling af ulabelerede eller semi-labelerede data, kan de klynger, den producerer, være af dårlig kvalitet. I eksemplet ovenfor kunne klyngerne gruppere 'runde musikting', 'firkantede musikting', 'trekantede ting' og 'kager'. Hvis algoritmen gives nogle begrænsninger eller regler at følge (\"genstanden skal være lavet af plastik\", \"genstanden skal kunne producere musik\"), kan dette hjælpe med at 'begrænse' algoritmen til at træffe bedre valg.\n", ">\n", "> 🎓 'Tæthed'\n", ">\n", "> Data, der er 'støjende', betragtes som 'tæt'. Afstandene mellem punkter i hver af dets klynger kan vise sig, ved undersøgelse, at være mere eller mindre tætte eller 'overfyldte', og derfor skal disse data analyseres med den passende clustering-metode. [Denne artikel](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) demonstrerer forskellen mellem at bruge K-Means clustering vs. HDBSCAN-algoritmer til at udforske et støjende datasæt med ujævn klyngedensitet.\n", "\n", "Uddyb din forståelse af clustering-teknikker i dette [Learn-modul](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n", "\n", "### **Clustering-algoritmer**\n", "\n", "Der findes over 100 clustering-algoritmer, og deres anvendelse afhænger af dataens natur. Lad os diskutere nogle af de vigtigste:\n", "\n", "- **Hierarkisk clustering**. Hvis en genstand klassificeres efter dens nærhed til en nærliggende genstand frem for en længere væk, dannes klynger baseret på deres medlemmers afstand til og fra andre genstande. Hierarkisk clustering er kendetegnet ved gentagne gange at kombinere to klynger.\n", "\n", "\n", "

\n", " \n", "

Infografik af Dasani Madipalli
\n", "\n", "\n", "\n", "- **Centroid clustering**. Denne populære algoritme kræver valg af 'k', eller antallet af klynger, der skal dannes, hvorefter algoritmen bestemmer midtpunktet for en klynge og samler data omkring dette punkt. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) er en populær version af centroid clustering, som opdeler et datasæt i foruddefinerede K-grupper. Centret bestemmes af det nærmeste gennemsnit, deraf navnet. Den kvadrerede afstand fra klyngen minimeres.\n", "\n", "

\n", " \n", "

Infografik af Dasani Madipalli
\n", "\n", "\n", "\n", "- **Distributionsbaseret clustering**. Baseret på statistisk modellering fokuserer distributionsbaseret clustering på at bestemme sandsynligheden for, at et datapunkt tilhører en klynge, og tildeler det derefter. Gaussian mixture-metoder hører til denne type.\n", "\n", "- **Tæthetsbaseret clustering**. Datapunkter tildeles klynger baseret på deres tæthed, eller deres gruppering omkring hinanden. Datapunkter langt fra gruppen betragtes som outliers eller støj. DBSCAN, Mean-shift og OPTICS hører til denne type clustering.\n", "\n", "- **Grid-baseret clustering**. For multidimensionelle datasæt oprettes et gitter, og dataene opdeles blandt gitterets celler, hvilket skaber klynger.\n", "\n", "Den bedste måde at lære om clustering på er at prøve det selv, og det er præcis, hvad du vil gøre i denne øvelse.\n", "\n", "Vi skal bruge nogle pakker for at gennemføre dette modul. Du kan installere dem med: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n", "\n", "Alternativt kan scriptet nedenfor kontrollere, om du har de nødvendige pakker til at fuldføre dette modul og installere dem for dig, hvis nogle mangler.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n", "\r\n", "pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "## Øvelse - grupper dine data\n", "\n", "Gruppering som teknik bliver meget lettere med korrekt visualisering, så lad os starte med at visualisere vores musikdata. Denne øvelse vil hjælpe os med at beslutte, hvilken metode til gruppering vi mest effektivt bør bruge til denne type data.\n", "\n", "Lad os komme i gang med at importere dataene.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Load the core tidyverse and make it available in your current R session\r\n", "library(tidyverse)\r\n", "\r\n", "# Import the data into a tibble\r\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n", "\r\n", "# View the first 5 rows of the data set\r\n", "df %>% \r\n", " slice_head(n = 5)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Nogle gange ønsker vi måske lidt mere information om vores data. Vi kan få et overblik over `data` og `dets struktur` ved at bruge funktionen [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html):\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Glimpse into the data set\r\n", "df %>% \r\n", " glimpse()\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Godt klaret!💪\n", "\n", "Vi kan se, at `glimpse()` giver dig det samlede antal rækker (observationer) og kolonner (variabler), og derefter de første par indgange for hver variabel på en række efter variabelnavnet. Derudover vises *datatypen* for variablen straks efter variabelnavnet inden for `< >`.\n", "\n", "`DataExplorer::introduce()` kan opsummere denne information på en pæn måde:\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Describe basic information for our data\r\n", "df %>% \r\n", " introduce()\r\n", "\r\n", "# A visual display of the same\r\n", "df %>% \r\n", " plot_intro()\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Fantastisk! Vi har lige lært, at vores data ikke har nogen manglende værdier.\n", "\n", "Mens vi er i gang, kan vi udforske almindelige statistikker for central tendens (f.eks. [gennemsnit](https://en.wikipedia.org/wiki/Arithmetic_mean) og [median](https://en.wikipedia.org/wiki/Median)) og spredningsmål (f.eks. [standardafvigelse](https://en.wikipedia.org/wiki/Standard_deviation)) ved hjælp af `summarytools::descr()`.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Describe common statistics\r\n", "df %>% \r\n", " descr(stats = \"common\")\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Lad os se på de generelle værdier i dataene. Bemærk, at popularitet kan være `0`, hvilket viser sange, der ikke har nogen rangering. Dem fjerner vi snart.\n", "\n", "> 🤔 Hvis vi arbejder med clustering, en usuperviseret metode, der ikke kræver mærkede data, hvorfor viser vi så disse data med labels? I dataudforskningsfasen er de nyttige, men de er ikke nødvendige for, at clustering-algoritmerne fungerer.\n", "\n", "### 1. Udforsk populære genrer\n", "\n", "Lad os finde ud af, hvilke genrer 🎶 der er mest populære, ved at tælle, hvor ofte de optræder.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Popular genres\r\n", "top_genres <- df %>% \r\n", " count(artist_top_genre, sort = TRUE) %>% \r\n", "# Encode to categorical and reorder the according to count\r\n", " mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n", "\r\n", "# Print the top genres\r\n", "top_genres\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Det gik godt! De siger, at et billede siger mere end tusind rækker i en data frame (selvom ingen faktisk nogensinde siger det 😅). Men du forstår pointen, ikke?\n", "\n", "En måde at visualisere kategoriske data (tekst- eller faktorvariabler) på er ved hjælp af søjlediagrammer. Lad os lave et søjlediagram over de 10 mest populære genrer:\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Change the default gray theme\r\n", "theme_set(theme_light())\r\n", "\r\n", "# Visualize popular genres\r\n", "top_genres %>%\r\n", " slice(1:10) %>% \r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5),\r\n", " # Rotates the X markers (so we can read them)\r\n", " axis.text.x = element_text(angle = 90))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Nu er det meget nemmere at identificere, at vi har `manglende` genrer 🧐!\n", "\n", "> En god visualisering vil vise dig ting, du ikke forventede, eller rejse nye spørgsmål om dataene - Hadley Wickham og Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n", "\n", "Bemærk, når den øverste genre er beskrevet som `Manglende`, betyder det, at Spotify ikke har klassificeret den, så lad os fjerne den.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Visualize popular genres\r\n", "top_genres %>%\r\n", " filter(artist_top_genre != \"Missing\") %>% \r\n", " slice(1:10) %>% \r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5),\r\n", " # Rotates the X markers (so we can read them)\r\n", " axis.text.x = element_text(angle = 90))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Fra den lille dataudforskning lærer vi, at de tre mest populære genrer dominerer dette datasæt. Lad os fokusere på `afro dancehall`, `afropop` og `nigerian pop`, og derudover filtrere datasættet for at fjerne alt med en popularitetsværdi på 0 (hvilket betyder, at det ikke blev klassificeret med en popularitet i datasættet og kan betragtes som støj for vores formål):\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "nigerian_songs <- df %>% \r\n", " # Concentrate on top 3 genres\r\n", " filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n", " # Remove unclassified observations\r\n", " filter(popularity != 0)\r\n", "\r\n", "\r\n", "\r\n", "# Visualize popular genres\r\n", "nigerian_songs %>%\r\n", " count(artist_top_genre) %>%\r\n", " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n", " fill = artist_top_genre)) +\r\n", " geom_col(alpha = 0.8) +\r\n", " paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n", " ggtitle(\"Top genres\") +\r\n", " theme(plot.title = element_text(hjust = 0.5))\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Lad os undersøge, om der er nogen tydelig lineær sammenhæng mellem de numeriske variabler i vores datasæt. Denne sammenhæng kvantificeres matematisk ved hjælp af [korrelationsstatistikken](https://en.wikipedia.org/wiki/Correlation).\n", "\n", "Korrelationsstatistikken er en værdi mellem -1 og 1, der angiver styrken af en sammenhæng. Værdier over 0 indikerer en *positiv* korrelation (høje værdier for én variabel har tendens til at falde sammen med høje værdier for den anden), mens værdier under 0 indikerer en *negativ* korrelation (høje værdier for én variabel har tendens til at falde sammen med lave værdier for den anden).\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Narrow down to numeric variables and fid correlation\r\n", "corr_mat <- nigerian_songs %>% \r\n", " select(where(is.numeric)) %>% \r\n", " cor()\r\n", "\r\n", "# Visualize correlation matrix\r\n", "corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Dataene er ikke stærkt korrelerede, undtagen mellem `energy` og `loudness`, hvilket giver mening, da høj musik normalt er ret energisk. `Popularity` har en sammenhæng med `release date`, hvilket også giver mening, da nyere sange sandsynligvis er mere populære. Længde og energi ser også ud til at have en korrelation.\n", "\n", "Det bliver interessant at se, hvad en klyngningsalgoritme kan få ud af disse data!\n", "\n", "> 🎓 Bemærk, at korrelation ikke indebærer kausalitet! Vi har bevis for korrelation, men ingen bevis for kausalitet. En [underholdende hjemmeside](https://tylervigen.com/spurious-correlations) har nogle visualiseringer, der understreger dette punkt.\n", "\n", "### 2. Udforsk datafordeling\n", "\n", "Lad os stille nogle mere subtile spørgsmål. Er genrerne markant forskellige i opfattelsen af deres danselighed, baseret på deres popularitet? Lad os undersøge datafordelingen for vores tre mest populære genrer med hensyn til popularitet og danselighed langs en given x- og y-akse ved hjælp af [densitetsgrafer](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves).\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# Perform 2D kernel density estimation\r\n", "density_estimate_2d <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n", " geom_density_2d(bins = 5, size = 1) +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " xlim(-20, 80) +\r\n", " ylim(0, 1.2)\r\n", "\r\n", "# Density plot based on the popularity\r\n", "density_estimate_pop <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n", " geom_density(size = 1, alpha = 0.5) +\r\n", " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " theme(legend.position = \"none\")\r\n", "\r\n", "# Density plot based on the danceability\r\n", "density_estimate_dance <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n", " geom_density(size = 1, alpha = 0.5) +\r\n", " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n", " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n", "\r\n", "\r\n", "# Patch everything together\r\n", "library(patchwork)\r\n", "density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Vi ser, at der er koncentriske cirkler, der stemmer overens, uanset genre. Kunne det være, at nigerianske præferencer konvergerer på et bestemt niveau af dansbarhed for denne genre?\n", "\n", "Generelt er de tre genrer på linje, når det kommer til deres popularitet og dansbarhed. At identificere klynger i disse løst tilpassede data vil være en udfordring. Lad os se, om et scatterplot kan understøtte dette.\n" ], "metadata": {} }, { "cell_type": "code", "execution_count": null, "source": [ "# A scatter plot of popularity and danceability\r\n", "scatter_plot <- nigerian_songs %>% \r\n", " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n", " geom_point(size = 2, alpha = 0.8) +\r\n", " paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n", "\r\n", "# Add a touch of interactivity\r\n", "ggplotly(scatter_plot)\r\n" ], "outputs": [], "metadata": {} }, { "cell_type": "markdown", "source": [ "Et spredningsdiagram af de samme akser viser et lignende mønster af konvergens.\n", "\n", "Generelt kan du bruge spredningsdiagrammer til at vise dataklynger, når du arbejder med clustering, så det er meget nyttigt at mestre denne type visualisering. I den næste lektion vil vi tage disse filtrerede data og bruge k-means clustering til at opdage grupper i dataene, der ser ud til at overlappe på interessante måder.\n", "\n", "## **🚀 Udfordring**\n", "\n", "Som forberedelse til den næste lektion, lav et diagram over de forskellige clustering-algoritmer, du måske opdager og bruger i et produktionsmiljø. Hvilke typer problemer forsøger clustering at løse?\n", "\n", "## [**Quiz efter lektionen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n", "\n", "## **Gennemgang & Selvstudie**\n", "\n", "Før du anvender clustering-algoritmer, som vi har lært, er det en god idé at forstå karakteren af dit datasæt. Læs mere om dette emne [her](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n", "\n", "Uddyb din forståelse af clustering-teknikker:\n", "\n", "- [Træn og evaluer clustering-modeller med Tidymodels og venner](https://rpubs.com/eR_ic/clustering)\n", "\n", "- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n", "\n", "## **Opgave**\n", "\n", "[Undersøg andre visualiseringer for clustering](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n", "\n", "## TAK TIL:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) for at skabe den originale Python-version af dette modul ♥️\n", "\n", "[`Dasani Madipalli`](https://twitter.com/dasani_decoded) for at skabe de fantastiske illustrationer, der gør maskinlæringskoncepter mere forståelige og lettere at forstå.\n", "\n", "God læring,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n" ], "metadata": {} }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.\n" ] } ], "metadata": { "anaconda-cloud": "", "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.1" }, "coopTranslator": { "original_hash": "99c36449cad3708a435f6798cfa39972", "translation_date": "2025-09-04T07:49:27+00:00", "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb", "language_code": "da" } }, "nbformat": 4, "nbformat_minor": 1 }