{ "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:12:54+00:00", "source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb", "language_code": "hr" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "GULATlQXLXyR" }, "source": [ "## Istraživanje K-Means klasteriranja koristeći R i principe urednih podataka.\n", "\n", "### [**Kviz prije predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n", "\n", "U ovoj lekciji naučit ćete kako kreirati klastere koristeći paket Tidymodels i druge pakete iz R ekosustava (nazvat ćemo ih prijateljima 🧑‍🤝‍🧑), te nigerijski glazbeni skup podataka koji ste ranije uvezli. Pokrit ćemo osnove K-Means metode za klasteriranje. Imajte na umu da, kao što ste naučili u prethodnoj lekciji, postoji mnogo načina za rad s klasterima, a metoda koju koristite ovisi o vašim podacima. Isprobat ćemo K-Means jer je to najčešće korištena tehnika klasteriranja. Krenimo!\n", "\n", "Pojmovi koje ćete naučiti:\n", "\n", "- Silhouette ocjenjivanje\n", "\n", "- Metoda lakta\n", "\n", "- Inercija\n", "\n", "- Varijanca\n", "\n", "### **Uvod**\n", "\n", "[K-Means klasteriranje](https://wikipedia.org/wiki/K-means_clustering) je metoda koja potječe iz područja obrade signala. Koristi se za podjelu i grupiranje podataka u `k klastera` na temelju sličnosti njihovih značajki.\n", "\n", "Klasteri se mogu vizualizirati kao [Voronoi dijagrami](https://wikipedia.org/wiki/Voronoi_diagram), koji uključuju točku (ili 'sjeme') i njezinu odgovarajuću regiju.\n", "\n", "

\n", " \n", "

Infografika autorice Jen Looper
\n", "\n", "\n", "K-Means klasteriranje ima sljedeće korake:\n", "\n", "1. Data scientist započinje određivanjem željenog broja klastera koji će se kreirati.\n", "\n", "2. Zatim algoritam nasumično odabire K opažanja iz skupa podataka koja će služiti kao početni centri za klastere (tj. centroidi).\n", "\n", "3. Svako od preostalih opažanja dodjeljuje se svom najbližem centru.\n", "\n", "4. Zatim se izračunava novi prosjek svakog klastera i centroid se pomiče prema tom prosjeku.\n", "\n", "5. Sada kada su centri ponovno izračunati, svako opažanje se ponovno provjerava kako bi se vidjelo može li biti bliže drugom klasteru. Svi objekti se ponovno dodjeljuju koristeći ažurirane prosjeke klastera. Koraci dodjele klastera i ažuriranja centroida iterativno se ponavljaju dok se dodjele klastera ne prestanu mijenjati (tj. kada se postigne konvergencija). Obično algoritam završava kada svaka nova iteracija rezultira zanemarivim pomicanjem centroida i klasteri postanu statični.\n", "\n", "
\n", "\n", "> Imajte na umu da zbog nasumičnosti početnih k opažanja koja se koriste kao početni centroidi, možemo dobiti malo različite rezultate svaki put kada primijenimo postupak. Iz tog razloga, većina algoritama koristi nekoliko *nasumičnih početaka* i odabire iteraciju s najnižim WCSS. Stoga se snažno preporučuje uvijek pokretati K-Means s nekoliko vrijednosti *nstart* kako biste izbjegli *nepoželjan lokalni optimum.*\n", "\n", "
\n", "\n", "Ova kratka animacija koristeći [ilustracije](https://github.com/allisonhorst/stats-illustrations) Allison Horst objašnjava proces klasteriranja:\n", "\n", "

\n", " \n", "

Ilustracija autorice @allison_horst
\n", "\n", "\n", "\n", "Osnovno pitanje koje se postavlja kod klasteriranja je sljedeće: kako znati na koliko klastera podijeliti svoje podatke? Jedan nedostatak korištenja K-Means metode uključuje činjenicu da ćete morati odrediti `k`, odnosno broj `centroida`. Srećom, `metoda lakta` pomaže u procjeni dobre početne vrijednosti za `k`. Uskoro ćete je isprobati.\n", "\n", "### \n", "\n", "**Preduvjeti**\n", "\n", "Nastavit ćemo točno tamo gdje smo stali u [prethodnoj lekciji](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), gdje smo analizirali skup podataka, napravili mnogo vizualizacija i filtrirali skup podataka na relevantna opažanja. Obavezno je provjerite!\n", "\n", "Trebat će nam neki paketi za dovršavanje ovog modula. Možete ih instalirati pomoću: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n", "\n", "Alternativno, skripta ispod provjerava imate li potrebne pakete za dovršavanje ovog modula i instalira ih za vas u slučaju da neki nedostaju.\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": [ "Krenimo odmah!\n", "\n", "## 1. Ples s podacima: Suzi na 3 najpopularnija glazbena žanra\n", "\n", "Ovo je podsjetnik na ono što smo radili u prethodnoj lekciji. Hajdemo malo analizirati podatke!\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 je prošlo dobro!\n", "\n", "## 2. Više istraživanja podataka.\n", "\n", "Koliko su ovi podaci čisti? Provjerimo odstupanja pomoću boxplotova. Usredotočit ćemo se na numeričke stupce s manje odstupanja (iako biste mogli očistiti odstupanja). Boxplotovi mogu prikazati raspon podataka i pomoći u odabiru stupaca koje ćemo koristiti. Napomena, boxplotovi ne prikazuju varijancu, važan element za dobro grupirane podatke. Molimo pogledajte [ovu raspravu](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) za dodatno čitanje.\n", "\n", "[Boxplotovi](https://en.wikipedia.org/wiki/Box_plot) koriste se za grafički prikaz distribucije `numeričkih` podataka, pa krenimo s *odabirom* svih numeričkih stupaca uz popularne glazbene žanrove.\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": [ "Vidite kako selektor `where` olakšava ovaj zadatak 💁? Istražite i druge slične funkcije [ovdje](https://tidyselect.r-lib.org/).\n", "\n", "Budući da ćemo izrađivati boxplot za svaku numeričku značajku i želimo izbjeći korištenje petlji, preoblikujmo naše podatke u *duži* format koji će nam omogućiti korištenje `facets` - podgrafova koji svaki prikazuju jedan podskup podataka.\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": [ "Mnogo duže! Sada je vrijeme za neke `ggplot` grafove! Koji ćemo `geom` koristiti?\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": [ "Sad je jasno da su podaci pomalo neuredni: promatrajući svaki stupac kao boxplot, možete vidjeti odstupanja. Mogli biste proći kroz skup podataka i ukloniti ta odstupanja, ali to bi učinilo podatke prilično oskudnima.\n", "\n", "Za sada, odabrat ćemo koje stupce ćemo koristiti za našu vježbu grupiranja. Odabrat ćemo numeričke stupce sa sličnim rasponima. Mogli bismo kodirati `artist_top_genre` kao numerički, ali za sada ćemo ga izostaviti.\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. Izračunavanje k-means klasteriranja u R-u\n", "\n", "K-means klasteriranje možemo izračunati u R-u pomoću ugrađene funkcije `kmeans`, pogledajte `help(\"kmeans()\")`. Funkcija `kmeans()` prihvaća podatkovni okvir sa svim numeričkim stupcima kao svoj primarni argument.\n", "\n", "Prvi korak pri korištenju k-means klasteriranja je odrediti broj klastera (k) koji će biti generirani u konačnom rješenju. Znamo da postoje 3 glazbena žanra koja smo izdvojili iz skupa podataka, pa pokušajmo s 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 sadrži nekoliko informacija koje su dobro objašnjene u `help(\"kmeans()\")`. Za sada ćemo se usredotočiti na nekoliko njih. Vidimo da su podaci grupirani u 3 klastera veličina 65, 110, 111. Izlaz također sadrži središta klastera (sredine) za 3 grupe kroz 5 varijabli.\n", "\n", "Vektor klastera je dodjela klastera za svaku opažanje. Koristimo funkciju `augment` kako bismo dodali dodjelu klastera izvornom skupu podataka.\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": [ "Savršeno, upravo smo podijelili naš skup podataka u 3 grupe. Dakle, koliko je dobro naše grupiranje 🤷? Pogledajmo `Silhouette score`.\n", "\n", "### **Silhouette score**\n", "\n", "[Silhouette analiza](https://en.wikipedia.org/wiki/Silhouette_(clustering)) može se koristiti za proučavanje udaljenosti između rezultirajućih klastera. Ova ocjena varira od -1 do 1, a ako je ocjena blizu 1, klaster je gust i dobro odvojen od drugih klastera. Vrijednost blizu 0 predstavlja preklapajuće klastere sa uzorcima vrlo blizu granice odluke susjednih klastera. [izvor](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n", "\n", "Metoda prosječnog silueta izračunava prosječni siluet za opažanja za različite vrijednosti *k*. Visoka prosječna ocjena silueta ukazuje na dobro grupiranje.\n", "\n", "Funkcija `silhouette` u paketu za klasteriranje koristi se za izračunavanje prosječne širine silueta.\n", "\n", "> Silueta se može izračunati pomoću bilo koje [udaljenosti](https://en.wikipedia.org/wiki/Distance \"Distance\"), poput [Euklidske udaljenosti](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") ili [Manhattanske udaljenosti](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") o kojima smo raspravljali u [prethodnoj lekciji](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": [ "Naš rezultat je **.549**, što je točno u sredini. To ukazuje da naši podaci nisu osobito prikladni za ovu vrstu grupiranja. Pogledajmo možemo li ovu pretpostavku potvrditi vizualno. Paket [factoextra](https://rpkgs.datanovia.com/factoextra/index.html) pruža funkcije (`fviz_cluster()`) za vizualizaciju grupiranja.\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": [ "Preklapanje u klasterima ukazuje na to da naši podaci nisu osobito prikladni za ovu vrstu klasterizacije, ali idemo dalje.\n", "\n", "## 4. Određivanje optimalnog broja klastera\n", "\n", "Osnovno pitanje koje se često postavlja kod K-Means klasterizacije je ovo - bez poznatih oznaka klasa, kako znati u koliko klastera podijeliti podatke?\n", "\n", "Jedan od načina na koji to možemo pokušati saznati je korištenje uzorka podataka za `stvaranje serije modela klasterizacije` s povećavajućim brojem klastera (npr. od 1 do 10) i procjenu metrika klasterizacije poput **Silhouette score.**\n", "\n", "Odredimo optimalan broj klastera izračunavanjem algoritma klasterizacije za različite vrijednosti *k* i procjenom **Sume kvadrata unutar klastera** (WCSS). Ukupna suma kvadrata unutar klastera (WCSS) mjeri kompaktnost klasterizacije, a želimo da bude što manja, pri čemu niže vrijednosti znače da su točke podataka bliže.\n", "\n", "Istražimo učinak različitih izbora `k`, od 1 do 10, na ovu klasterizaciju.\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": [ "Sada kada imamo ukupnu unutar-klastersku sumu kvadrata (tot.withinss) za svaki algoritam grupiranja s centrom *k*, koristimo [metodu lakta](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) kako bismo pronašli optimalan broj klastera. Metoda se sastoji od prikazivanja WCSS-a kao funkcije broja klastera i odabira [lakta krivulje](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Lakat krivulje\") kao broja klastera koji ćemo koristiti.\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 prikazuje značajno smanjenje WCSS-a (što znači veću *zbijenost*) kako se broj klastera povećava s jednog na dva, te dodatno primjetno smanjenje s dva na tri klastera. Nakon toga, smanjenje je manje izraženo, što rezultira `laktom` 💪 na grafikonu oko tri klastera. Ovo je dobar pokazatelj da postoje dva do tri razumno dobro odvojena klastera podataka.\n", "\n", "Sada možemo nastaviti i izdvojiti model klasteriranja gdje je `k = 3`:\n", "\n", "> `pull()`: koristi se za izdvajanje jednog stupca\n", ">\n", "> `pluck()`: koristi se za indeksiranje struktura podataka poput lista\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": [ "Odlično! Hajdemo vizualizirati dobivene klastere. Zanima li vas malo interaktivnosti pomoću `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žda bismo očekivali da svaki klaster (predstavljen različitim bojama) ima različite žanrove (predstavljene različitim oblicima).\n", "\n", "Pogledajmo točnost modela.\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": [ "Točnost ovog modela nije loša, ali nije ni sjajna. Možda podaci nisu prikladni za K-Means klasteriranje. Ovi podaci su previše neuravnoteženi, premalo povezani i postoji prevelika varijanca između vrijednosti stupaca da bi se dobro grupirali. Zapravo, klasteri koji se formiraju vjerojatno su snažno pod utjecajem ili iskrivljeni zbog tri kategorije žanrova koje smo ranije definirali.\n", "\n", "Unatoč tome, ovo je bio prilično poučan proces!\n", "\n", "U dokumentaciji Scikit-learn-a možete vidjeti da model poput ovog, s klasterima koji nisu jasno definirani, ima problem s 'varijancom':\n", "\n", "

\n", " \n", "

Infografika iz Scikit-learn
\n", "\n", "\n", "\n", "## **Varijanca**\n", "\n", "Varijanca se definira kao \"prosjek kvadrata razlika od srednje vrijednosti\" [izvor](https://www.mathsisfun.com/data/standard-deviation.html). U kontekstu ovog problema klasteriranja, odnosi se na podatke kod kojih vrijednosti našeg skupa podataka imaju tendenciju previše odstupati od srednje vrijednosti.\n", "\n", "✅ Ovo je sjajan trenutak da razmislite o svim načinima na koje biste mogli ispraviti ovaj problem. Možete li još malo prilagoditi podatke? Koristiti različite stupce? Isprobati drugačiji algoritam? Savjet: Pokušajte [skalirati svoje podatke](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) kako biste ih normalizirali i testirali druge stupce.\n", "\n", "> Isprobajte ovaj '[kalkulator varijance](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' kako biste bolje razumjeli koncept.\n", "\n", "------------------------------------------------------------------------\n", "\n", "## **🚀Izazov**\n", "\n", "Provedite neko vrijeme s ovim bilježnicom, prilagođavajući parametre. Možete li poboljšati točnost modela dodatnim čišćenjem podataka (na primjer, uklanjanjem odstupanja)? Možete koristiti težine kako biste dali veću važnost određenim uzorcima podataka. Što još možete učiniti kako biste stvorili bolje klastere?\n", "\n", "Savjet: Pokušajte skalirati svoje podatke. U bilježnici postoji zakomentirani kod koji dodaje standardno skaliranje kako bi stupci podataka više nalikovali jedni drugima u smislu raspona. Primijetit ćete da, iako se silueta smanjuje, 'pregib' na grafu lakta postaje glađi. To je zato što ostavljanje podataka neskaliranima omogućuje podacima s manjom varijancom da imaju veću težinu. Pročitajte više o ovom problemu [ovdje](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n", "\n", "## [**Kviz nakon predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n", "\n", "## **Pregled i samostalno učenje**\n", "\n", "- Pogledajte simulator za K-Means [kao što je ovaj](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Ovaj alat možete koristiti za vizualizaciju uzoraka podataka i određivanje njihovih centroida. Možete uređivati nasumičnost podataka, broj klastera i broj centroida. Pomaže li vam ovo da steknete ideju o tome kako se podaci mogu grupirati?\n", "\n", "- Također, pogledajte [ovaj priručnik o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) sa Stanforda.\n", "\n", "Želite li isprobati svoje novo stečene vještine klasteriranja na skupovima podataka koji su prikladni za K-Means klasteriranje? Pogledajte:\n", "\n", "- [Treniranje i evaluacija modela klasteriranja](https://rpubs.com/eR_ic/clustering) koristeći Tidymodels i slične alate\n", "\n", "- [Analiza klastera K-Means](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n", "\n", "- [K-Means klasteriranje s principima urednih podataka](https://www.tidymodels.org/learn/statistics/k-means/)\n", "\n", "## **Zadatak**\n", "\n", "[Isprobajte različite metode klasteriranja](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n", "\n", "## HVALA:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) za stvaranje originalne Python verzije ovog modula ♥️\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) za stvaranje nevjerojatnih ilustracija koje čine R pristupačnijim i zanimljivijim. Pronađite više ilustracija u njenoj [galeriji](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n", "\n", "Sretno u učenju,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n", "\n", "

\n", " \n", "

Ilustracija @allison_horst
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda.\n" ] } ] }