You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/cs/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb

640 lines
28 KiB

{
"nbformat": 4,
"nbformat_minor": 0,
"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"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-09-04T08:06:44+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "cs"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Prozkoumejte shlukování metodou K-Means pomocí R a principů tidy dat.\n",
"\n",
"### [**Kvíz před lekcí**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"V této lekci se naučíte, jak vytvářet shluky pomocí balíčku Tidymodels a dalších balíčků z ekosystému R (říkejme jim přátelé 🧑‍🤝‍🧑) a nigerijského hudebního datasetu, který jste si dříve importovali. Probereme základy metody K-Means pro shlukování. Mějte na paměti, že jak jste se naučili v předchozí lekci, existuje mnoho způsobů, jak pracovat se shluky, a metoda, kterou použijete, závisí na vašich datech. Vyzkoušíme metodu K-Means, protože je to nejběžnější technika shlukování. Pojďme začít!\n",
"\n",
"Pojmy, o kterých se dozvíte:\n",
"\n",
"- Silhouette skóre\n",
"\n",
"- Metoda lokte\n",
"\n",
"- Inerční moment\n",
"\n",
"- Variance\n",
"\n",
"### **Úvod**\n",
"\n",
"[Shlukování metodou K-Means](https://wikipedia.org/wiki/K-means_clustering) je metoda pocházející z oblasti zpracování signálů. Používá se k rozdělení a seskupení dat do `k shluků` na základě podobností jejich vlastností.\n",
"\n",
"Shluky lze vizualizovat jako [Voronoiovy diagramy](https://wikipedia.org/wiki/Voronoi_diagram), které zahrnují bod (nebo „semínko“) a jeho odpovídající oblast.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika od Jen Looper</figcaption>\n",
"\n",
"\n",
"Shlukování metodou K-Means zahrnuje následující kroky:\n",
"\n",
"1. Datový vědec nejprve určí požadovaný počet shluků, které mají být vytvořeny.\n",
"\n",
"2. Algoritmus poté náhodně vybere K pozorování z datové sady, která budou sloužit jako počáteční středy shluků (tj. centroidy).\n",
"\n",
"3. Každé z ostatních pozorování je následně přiřazeno k nejbližšímu centroidu.\n",
"\n",
"4. Poté se vypočítá nový průměr každého shluku a centroid se přesune na tento průměr.\n",
"\n",
"5. Jakmile jsou středy přepočítány, každé pozorování se znovu zkontroluje, zda by nemohlo být blíže jinému shluku. Všechna pozorování jsou znovu přiřazena pomocí aktualizovaných průměrů shluků. Kroky přiřazení shluků a aktualizace centroidů se iterativně opakují, dokud se přiřazení shluků nepřestane měnit (tj. dokud není dosaženo konvergence). Algoritmus obvykle končí, když každá nová iterace vede k zanedbatelnému pohybu centroidů a shluky se stanou statickými.\n",
"\n",
"<div>\n",
"\n",
"> Všimněte si, že kvůli náhodnosti počátečních k pozorování použitých jako výchozí centroidy můžeme pokaždé, když aplikujeme tento postup, získat mírně odlišné výsledky. Z tohoto důvodu většina algoritmů používá několik *náhodných startů* a vybírá iteraci s nejnižší hodnotou WCSS. Proto se důrazně doporučuje vždy spouštět metodu K-Means s několika hodnotami *nstart*, aby se předešlo *nežádoucímu lokálnímu optimu.*\n",
"\n",
"</div>\n",
"\n",
"Tato krátká animace využívající [ilustrace](https://github.com/allisonhorst/stats-illustrations) od Allison Horst vysvětluje proces shlukování:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Ilustrace od @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Základní otázka, která při shlukování vyvstává, zní: jak zjistíte, na kolik shluků máte svá data rozdělit? Jednou z nevýhod metody K-Means je skutečnost, že musíte určit `k`, tedy počet `centroidů`. Naštěstí vám `metoda lokte` pomůže odhadnout dobrý výchozí počet `k`. Za chvíli si to vyzkoušíte.\n",
"\n",
"### \n",
"\n",
"**Předpoklady**\n",
"\n",
"Navážeme přesně tam, kde jsme skončili v [předchozí lekci](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), kde jsme analyzovali datovou sadu, vytvořili spoustu vizualizací a filtrovali datovou sadu na pozorování, která nás zajímají. Určitě si ji projděte!\n",
"\n",
"Budeme potřebovat několik balíčků, abychom mohli začít s tímto modulem. Můžete si je nainstalovat pomocí: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Alternativně níže uvedený skript zkontroluje, zda máte balíčky potřebné k dokončení tohoto modulu, a v případě, že některé chybí, je pro vás nainstaluje.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ah_tBi58LXyi"
},
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "7e--UCUTLXym"
},
"source": [
"Pojďme rovnou na věc!\n",
"\n",
"## 1. Tanec s daty: Zúžení na 3 nejoblíbenější hudební žánry\n",
"\n",
"Toto je rekapitulace toho, co jsme dělali v předchozí lekci. Pojďme si trochu pohrát s daty!\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ycamx7GGLXyn"
},
"source": [
"# Load the core tidyverse and make it available in your current R session\n",
"library(tidyverse)\n",
"\n",
"# Import the data into a tibble\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
"\n",
"# Narrow down to top 3 popular genres\n",
"nigerian_songs <- df %>% \n",
" # Concentrate on top 3 genres\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
" # Remove unclassified observations\n",
" filter(popularity != 0)\n",
"\n",
"\n",
"\n",
"# Visualize popular genres using bar plots\n",
"theme_set(theme_light())\n",
"nigerian_songs %>%\n",
" count(artist_top_genre) %>%\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
" fill = artist_top_genre)) +\n",
" geom_col(alpha = 0.8) +\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
" ggtitle(\"Top genres\") +\n",
" theme(plot.title = element_text(hjust = 0.5))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "b5h5zmkPLXyp"
},
"source": [
"🤩 To šlo dobře!\n",
"\n",
"## 2. Další průzkum dat.\n",
"\n",
"Jak čistá jsou tato data? Podívejme se na odlehlé hodnoty pomocí krabicových grafů. Zaměříme se na číselné sloupce s menším počtem odlehlých hodnot (i když byste mohli odlehlé hodnoty odstranit). Krabicové grafy mohou ukázat rozsah dat a pomohou vybrat, které sloupce použít. Všimněte si, že krabicové grafy neukazují rozptyl, což je důležitý prvek pro dobře seskupitelná data. Další informace naleznete v [této diskusi](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot).\n",
"\n",
"[Krabicové grafy](https://en.wikipedia.org/wiki/Box_plot) se používají k grafickému znázornění rozložení `číselných` dat, takže začněme *výběrem* všech číselných sloupců spolu s oblíbenými hudebními žánry.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HhNreJKLLXyq"
},
"source": [
"# Select top genre column and all other numeric columns\n",
"df_numeric <- nigerian_songs %>% \n",
" select(artist_top_genre, where(is.numeric)) \n",
"\n",
"# Display the data\n",
"df_numeric %>% \n",
" slice_head(n = 5)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "uYXrwJRaLXyq"
},
"source": [
"Podívejte se, jak výběrový pomocník `where` usnadňuje tento proces 💁? Prozkoumejte další podobné funkce [zde](https://tidyselect.r-lib.org/).\n",
"\n",
"Protože budeme vytvářet krabicové grafy pro každou číselnou vlastnost a chceme se vyhnout použití smyček, přeformátujeme naše data do *delšího* formátu, který nám umožní využít `facets` - podgrafy, z nichž každý zobrazuje jednu podmnožinu dat.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gd5bR3f8LXys"
},
"source": [
"# Pivot data from wide to long\n",
"df_numeric_long <- df_numeric %>% \n",
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
"\n",
"# Print out data\n",
"df_numeric_long %>% \n",
" slice_head(n = 15)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-7tE1swnLXyv"
},
"source": [
"Mnohem delší! Teď je čas na nějaké `ggplots`! Tak jaký `geom` použijeme?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "r88bIsyuLXyy"
},
"source": [
"# Make a box plot\n",
"df_numeric_long %>% \n",
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
" geom_boxplot() +\n",
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
" theme(legend.position = \"none\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYVyKIUELXyz"
},
"source": [
"Teď můžeme vidět, že tato data jsou trochu hlučná: při pohledu na jednotlivé sloupce jako boxploty můžete vidět odlehlé hodnoty. Mohli byste projít dataset a tyto odlehlé hodnoty odstranit, ale to by data značně zredukovalo.\n",
"\n",
"Prozatím si vybereme, které sloupce použijeme pro náš cvičný úkol shlukování. Vybereme číselné sloupce s podobnými rozsahy. Mohli bychom zakódovat `artist_top_genre` jako číselné hodnoty, ale prozatím ho vynecháme.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-wkpINyZLXy0"
},
"source": [
"# Select variables with similar ranges\n",
"df_numeric_select <- df_numeric %>% \n",
" select(popularity, danceability, acousticness, loudness, energy) \n",
"\n",
"# Normalize data\n",
"# df_numeric_select <- scale(df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "D7dLzgpqLXy1"
},
"source": [
"## 3. Výpočet k-means shlukování v R\n",
"\n",
"K-means můžeme vypočítat v R pomocí vestavěné funkce `kmeans`, viz `help(\"kmeans()\")`. Funkce `kmeans()` přijímá datový rámec, který obsahuje pouze číselné sloupce, jako svůj hlavní argument.\n",
"\n",
"Prvním krokem při použití k-means shlukování je specifikace počtu shluků (k), které budou vytvořeny ve finálním řešení. Víme, že máme 3 hudební žánry, které jsme vyčlenili z datasetu, takže zkusme 3:\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "uC4EQ5w7LXy5"
},
"source": [
"set.seed(2056)\n",
"# Kmeans clustering for 3 clusters\n",
"kclust <- kmeans(\n",
" df_numeric_select,\n",
" # Specify the number of clusters\n",
" centers = 3,\n",
" # How many random initial configurations\n",
" nstart = 25\n",
")\n",
"\n",
"# Display clustering object\n",
"kclust\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hzfhscWrLXy-"
},
"source": [
"Objekt kmeans obsahuje několik informací, které jsou dobře vysvětleny v `help(\"kmeans()\")`. Prozatím se zaměříme na několik z nich. Vidíme, že data byla rozdělena do 3 klastrů o velikostech 65, 110, 111. Výstup také obsahuje středové body (průměry) pro 3 skupiny napříč 5 proměnnými.\n",
"\n",
"Vektor klastrů představuje přiřazení klastru pro každé pozorování. Použijme funkci `augment`, abychom přidali přiřazení klastru do původního datového souboru.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "0XwwpFGQLXy_"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"augment(kclust, df_numeric_select) %>% \n",
" relocate(.cluster) %>% \n",
" slice_head(n = 10)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "NXIVXXACLXzA"
},
"source": [
"Perfektní, právě jsme rozdělili náš datový soubor do 3 skupin. Takže, jak dobré je naše shlukování 🤷? Podívejme se na `Silhouette skóre`.\n",
"\n",
"### **Silhouette skóre**\n",
"\n",
"[Silhouette analýza](https://en.wikipedia.org/wiki/Silhouette_(clustering)) může být použita ke studiu vzdálenosti mezi výslednými shluky. Toto skóre se pohybuje od -1 do 1, a pokud je skóre blízko 1, shluk je hustý a dobře oddělený od ostatních shluků. Hodnota blízko 0 představuje překrývající se shluky se vzorky velmi blízko rozhodovací hranice sousedních shluků. [zdroj](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Metoda průměrného silhouette skóre počítá průměrné silhouette skóre pozorování pro různé hodnoty *k*. Vysoké průměrné silhouette skóre naznačuje dobré shlukování.\n",
"\n",
"Funkce `silhouette` v balíčku cluster slouží k výpočtu průměrné šířky silhouette.\n",
"\n",
"> Silhouette lze vypočítat pomocí jakékoli [vzdálenostní](https://en.wikipedia.org/wiki/Distance \"Distance\") metriky, jako je [Euklidovská vzdálenost](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") nebo [Manhattanská vzdálenost](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), které jsme probírali v [předchozí lekci](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb).\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jn0McL28LXzB"
},
"source": [
"# Load cluster package\n",
"library(cluster)\n",
"\n",
"# Compute average silhouette score\n",
"ss <- silhouette(kclust$cluster,\n",
" # Compute euclidean distance\n",
" dist = dist(df_numeric_select))\n",
"mean(ss[, 3])\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QyQRn97nLXzC"
},
"source": [
"Náš skóre je **.549**, tedy přesně uprostřed. To naznačuje, že naše data nejsou obzvlášť vhodná pro tento typ shlukování. Podívejme se, zda můžeme tento předpoklad vizuálně potvrdit. Balíček [factoextra](https://rpkgs.datanovia.com/factoextra/index.html) poskytuje funkce (`fviz_cluster()`) pro vizualizaci shlukování.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7a6Km1_FLXzD"
},
"source": [
"library(factoextra)\n",
"\n",
"# Visualize clustering results\n",
"fviz_cluster(kclust, df_numeric_select)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "IBwCWt-0LXzD"
},
"source": [
"Překrývání v klastrech naznačuje, že naše data nejsou příliš vhodná pro tento typ klastrování, ale pojďme pokračovat.\n",
"\n",
"## 4. Určení optimálního počtu klastrů\n",
"\n",
"Základní otázka, která často vyvstává při klastrování metodou K-Means, je tato: bez známých třídních štítků, jak zjistíte, na kolik klastrů rozdělit svá data?\n",
"\n",
"Jedním ze způsobů, jak to zjistit, je použít vzorek dat k `vytvoření série modelů klastrování` s postupně se zvyšujícím počtem klastrů (např. od 1 do 10) a vyhodnotit metriky klastrování, jako je **Silhouette skóre.**\n",
"\n",
"Určeme optimální počet klastrů výpočtem algoritmu klastrování pro různé hodnoty *k* a vyhodnocením **součtu čtverců uvnitř klastrů** (WCSS). Celkový součet čtverců uvnitř klastrů (WCSS) měří kompaktnost klastrování a chceme, aby byl co nejmenší, přičemž nižší hodnoty znamenají, že datové body jsou blíže u sebe.\n",
"\n",
"Prozkoumejme vliv různých voleb hodnoty `k`, od 1 do 10, na toto klastrování.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hSeIiylDLXzE"
},
"source": [
"# Create a series of clustering models\n",
"kclusts <- tibble(k = 1:10) %>% \n",
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
" # Farm out clustering metrics eg WCSS\n",
" glanced = map(model, ~ glance(.x))) %>% \n",
" unnest(cols = glanced)\n",
" \n",
"\n",
"# View clustering rsulsts\n",
"kclusts\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "m7rS2U1eLXzE"
},
"source": [
"Nyní, když máme celkový součet čtverců uvnitř klastrů (tot.withinss) pro každý algoritmus shlukování s centrem *k*, použijeme [metodu lokte](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) k nalezení optimálního počtu klastrů. Tato metoda spočívá v zakreslení WCSS jako funkce počtu klastrů a výběru [lokte křivky](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") jako počtu klastrů, které použijeme.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_DjHGItLXzF"
},
"source": [
"set.seed(2056)\n",
"# Use elbow method to determine optimum number of clusters\n",
"kclusts %>% \n",
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "pLYyt5XSLXzG"
},
"source": [
"Graf ukazuje výrazné snížení WCSS (tedy větší *soudržnost*), když se počet klastrů zvýší z jednoho na dva, a další znatelné snížení při přechodu ze dvou na tři klastry. Poté je snížení méně výrazné, což vede k vytvoření `lokte` 💪 na grafu přibližně u tří klastrů. To je dobrý náznak, že existují dva až tři poměrně dobře oddělené klastry datových bodů.\n",
"\n",
"Nyní můžeme přistoupit k extrakci modelu klastrování, kde `k = 3`:\n",
"\n",
"> `pull()`: používá se k extrakci jednoho sloupce\n",
">\n",
"> `pluck()`: používá se k indexování datových struktur, jako jsou seznamy\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "JP_JPKBILXzG"
},
"source": [
"# Extract k = 3 clustering\n",
"final_kmeans <- kclusts %>% \n",
" filter(k == 3) %>% \n",
" pull(model) %>% \n",
" pluck(1)\n",
"\n",
"\n",
"final_kmeans\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "l_PDTu8tLXzI"
},
"source": [
"Skvělé! Pojďme si vizualizovat získané clustery. Máte chuť na trochu interaktivity s použitím `plotly`?\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "dNcleFe-LXzJ"
},
"source": [
"# Add predicted cluster assignment to data set\n",
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
"\n",
"# Plot cluster assignments\n",
"clust_plt <- results %>% \n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
" geom_point(size = 2, alpha = 0.8) +\n",
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
"\n",
"ggplotly(clust_plt)\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6JUM_51VLXzK"
},
"source": [
"Možná bychom očekávali, že každý klastr (reprezentovaný různými barvami) bude mít odlišné žánry (reprezentované různými tvary).\n",
"\n",
"Podívejme se na přesnost modelu.\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HdIMUGq7LXzL"
},
"source": [
"# Assign genres to predefined integers\n",
"label_count <- results %>% \n",
" group_by(artist_top_genre) %>% \n",
" mutate(id = cur_group_id()) %>% \n",
" ungroup() %>% \n",
" summarise(correct_labels = sum(.cluster == id))\n",
"\n",
"\n",
"# Print results \n",
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
"\n",
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C50wvaAOLXzM"
},
"source": [
"Přesnost tohoto modelu není špatná, ale ani skvělá. Může to být způsobeno tím, že data nejsou vhodná pro K-Means Clustering. Tato data jsou příliš nevyvážená, málo korelovaná a mezi hodnotami sloupců je příliš velká variabilita, což ztěžuje jejich seskupování. Ve skutečnosti jsou vytvořené clustery pravděpodobně silně ovlivněny nebo zkresleny třemi kategoriemi žánrů, které jsme výše definovali.\n",
"\n",
"Nicméně, i tak to byl skvělý proces učení!\n",
"\n",
"V dokumentaci Scikit-learn můžete vidět, že model jako tento, s clustery, které nejsou příliš dobře vymezené, má problém s „variabilitou“:\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika ze Scikit-learn</figcaption>\n",
"\n",
"\n",
"\n",
"## **Variabilita**\n",
"\n",
"Variabilita je definována jako „průměr čtverců odchylek od průměru“ [zdroj](https://www.mathsisfun.com/data/standard-deviation.html). V kontextu tohoto problému seskupování to znamená, že hodnoty v našem datasetu mají tendenci se od průměru odchylovat až příliš.\n",
"\n",
"✅ Toto je skvělý moment k zamyšlení nad všemi způsoby, jak tento problém vyřešit. Můžete data ještě více upravit? Použít jiné sloupce? Nebo jiný algoritmus? Tip: Zkuste [škálovat svá data](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/), abyste je normalizovali, a otestujte jiné sloupce.\n",
"\n",
"> Vyzkoušejte tento '[kalkulátor variability](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', abyste lépe pochopili tento koncept.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Výzva**\n",
"\n",
"Stravte nějaký čas s tímto notebookem a upravujte parametry. Dokážete zlepšit přesnost modelu tím, že data více vyčistíte (například odstraněním odlehlých hodnot)? Můžete použít váhy, abyste některým vzorkům dat přidali větší důležitost. Co dalšího můžete udělat, abyste vytvořili lepší clustery?\n",
"\n",
"Tip: Zkuste škálovat svá data. V notebooku je zakomentovaný kód, který přidává standardní škálování, aby se hodnoty sloupců více podobaly z hlediska rozsahu. Zjistíte, že i když skóre siluety klesne, „zlom“ v grafu lokte se vyhladí. To je proto, že ponechání dat neškálovaných umožňuje, aby data s menší variabilitou měla větší váhu. Přečtěte si o tomto problému více [zde](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
"\n",
"## [**Kvíz po přednášce**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
"\n",
"## **Opakování a samostudium**\n",
"\n",
"- Podívejte se na simulátor K-Means [například tento](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Tento nástroj můžete použít k vizualizaci vzorků datových bodů a určení jejich centroidů. Můžete upravit náhodnost dat, počet clusterů a počet centroidů. Pomáhá vám to získat představu o tom, jak lze data seskupit?\n",
"\n",
"- Podívejte se také na [tento materiál o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) ze Stanfordu.\n",
"\n",
"Chcete si vyzkoušet své nově nabyté dovednosti v seskupování na datasetech, které se dobře hodí pro K-Means clustering? Podívejte se na:\n",
"\n",
"- [Trénování a hodnocení modelů seskupování](https://rpubs.com/eR_ic/clustering) pomocí Tidymodels a dalších nástrojů\n",
"\n",
"- [Analýza clusterů pomocí K-means](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-means clustering s principy tidy dat](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Úkol**\n",
"\n",
"[Vyzkoušejte různé metody seskupování](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
"\n",
"## PODĚKOVÁNÍ:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper) za vytvoření původní verze tohoto modulu v Pythonu ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za vytvoření úžasných ilustrací, které dělají R přívětivějším a poutavějším. Další ilustrace najdete v její [galerii](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"Přejeme příjemné učení,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>Ilustrace od @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože se snažíme o přesnost, mějte na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádné nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
]
}
]
}