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/sr/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb

642 lines
34 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-06T14:26:36+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "sr"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## Истражите K-Means кластерисање користећи R и принципе уређених података.\n",
"\n",
"### [**Квиз пре предавања**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"У овом часу ћете научити како да креирате кластере користећи пакет Tidymodels и друге пакете из R екосистема (назваћемо их пријатељи 🧑‍🤝‍🧑), као и нигеријски музички скуп података који сте раније увезли. Покрићемо основе K-Means кластерисања. Имајте на уму да, као што сте научили у претходном часу, постоји много начина за рад са кластерима, а метод који користите зависи од ваших података. Пробаћемо K-Means јер је то најчешћа техника кластерисања. Хајде да почнемо!\n",
"\n",
"Термини које ћете научити:\n",
"\n",
"- Силуетно оцењивање\n",
"\n",
"- Метода лакта\n",
"\n",
"- Инерција\n",
"\n",
"- Варијанса\n",
"\n",
"### **Увод**\n",
"\n",
"[K-Means кластерисање](https://wikipedia.org/wiki/K-means_clustering) је метода која потиче из области обраде сигнала. Користи се за поделу и груписање података у `k кластера` на основу сличности њихових карактеристика.\n",
"\n",
"Кластери се могу визуализовати као [Воронојеви дијаграми](https://wikipedia.org/wiki/Voronoi_diagram), који укључују тачку (или 'семе') и њен одговарајући регион.\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Инфографика од Џен Лупер</figcaption>\n",
"\n",
"\n",
"K-Means кластерисање има следеће кораке:\n",
"\n",
"1. Научник за податке започиње одређивањем жељеног броја кластера који ће бити креирани.\n",
"\n",
"2. Затим алгоритам насумично бира K опсервација из скупа података које ће служити као почетни центри за кластере (тј. центроиде).\n",
"\n",
"3. Затим се свака од преосталих опсервација додељује најближем центроиду.\n",
"\n",
"4. Затим се рачуна нова средња вредност сваког кластера и центроид се помера на ту средњу вредност.\n",
"\n",
"5. Сада када су центри поново израчунати, свака опсервација се поново проверава да ли би могла бити ближа другом кластеру. Сви објекти се поново додељују користећи ажуриране средње вредности кластера. Кораци доделе кластера и ажурирања центроида се итеративно понављају док се доделе кластера не престану мењати (тј. када се постигне конвергенција). Типично, алгоритам се завршава када свака нова итерација резултира занемарљивим померањем центроида и кластери постану статични.\n",
"\n",
"<div>\n",
"\n",
"> Имајте на уму да због насумичности почетних K опсервација које се користе као почетни центроиди, можемо добити благо различите резултате сваки пут када применимо процедуру. Из тог разлога, већина алгоритама користи неколико *насумичних почетака* и бира итерацију са најнижом WCSS. Због тога се снажно препоручује да увек покрећете K-Means са неколико вредности *nstart* како бисте избегли *непожељан локални оптимум.*\n",
"\n",
"</div>\n",
"\n",
"Ова кратка анимација користећи [уметничке радове](https://github.com/allisonhorst/stats-illustrations) Алисон Хорст објашњава процес кластерисања:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>Уметнички рад од @allison_horst</figcaption>\n",
"\n",
"\n",
"\n",
"Основно питање које се јавља у кластерисању је следеће: како знате на колико кластера да поделите своје податке? Један недостатак коришћења K-Means укључује чињеницу да ћете морати да одредите `k`, односно број `центроида`. Срећом, `метода лакта` помаже да се процени добра почетна вредност за `k`. Ускоро ћете је испробати.\n",
"\n",
"### \n",
"\n",
"**Предуслов**\n",
"\n",
"Наставићемо тачно тамо где смо стали у [претходном часу](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), где смо анализирали скуп података, направили много визуализација и филтрирали скуп података на опсервације од интереса. Обавезно погледајте!\n",
"\n",
"Биће нам потребни неки пакети да завршимо овај модул. Можете их инсталирати као: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
"\n",
"Алтернативно, скрипта испод проверава да ли имате пакете потребне за завршетак овог модула и инсталира их за вас у случају да неки недостају.\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": [
"Хајде да кренемо одмах!\n",
"\n",
"## 1. Плес са подацима: Сузимо избор на 3 најпопуларнија музичка жанра\n",
"\n",
"Ово је преглед онога што смо радили у претходној лекцији. Хајде да мало анализирамо податке!\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": [
"🤩 То је прошло добро!\n",
"\n",
"## 2. Више истраживања података.\n",
"\n",
"Колико су ови подаци чисти? Хајде да проверимо постојање екстремних вредности користећи box plot графиконе. Фокусираћемо се на нумеричке колоне са мање екстремних вредности (иако можете уклонити екстремне вредности). Box plot графикони могу показати опсег података и помоћи у избору колона које ћемо користити. Напомена: Box plot графикони не приказују варијансу, што је важан елемент за добро кластерисане податке. Молимо вас да погледате [ову дискусију](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) за више информација.\n",
"\n",
"[Box plot графикони](https://en.wikipedia.org/wiki/Box_plot) се користе за графичко приказивање расподеле `нумеричких` података, па хајде да почнемо са *избором* свих нумеричких колона заједно са популарним музичким жанровима.\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": [
"Погледајте како селектор `where` олакшава овај процес 💁? Истражите и друге сличне функције [овде](https://tidyselect.r-lib.org/).\n",
"\n",
"Пошто ћемо правити boxplot за сваку нумеричку карактеристику и желимо да избегнемо коришћење петљи, хајде да преобликујемо наше податке у *дужи* формат који ће нам омогућити да искористимо `facets` - подграфиконе који приказују појединачне подскупове података.\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": [
"Сада много дужи! Време је за мало `ggplots`! Па који `geom` ћемо користити?\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": [
"Лако-gg!\n",
"\n",
"Сада можемо видети да су подаци мало \"бучни\": посматрајући сваку колону као boxplot, можете уочити екстремне вредности. Могли бисте проћи кроз скуп података и уклонити те екстремне вредности, али то би учинило податке прилично минималним.\n",
"\n",
"За сада, хајде да изаберемо које ћемо колоне користити за наш кластеринг задатак. Изабраћемо нумеричке колоне са сличним опсезима. Могли бисмо да енкодирамо `artist_top_genre` као нумеричку вредност, али ћемо је за сада изоставити.\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. Израчунавање k-means кластеризације у R-у\n",
"\n",
"Можемо израчунати k-means кластеризацију у R-у помоћу уграђене функције `kmeans`, погледајте `help(\"kmeans()\")`. Функција `kmeans()` прихвата податке у облику табеле са свим нумеричким колонама као свој примарни аргумент.\n",
"\n",
"Први корак при коришћењу k-means кластеризације је да се одреди број кластера (k) који ће бити генерисани у коначном решењу. Знамо да постоје 3 жанра песама које смо издвојили из скупа података, па хајде да пробамо са 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": [
"Објекат kmeans садржи неколико информација које су добро објашњене у `help(\"kmeans()\")`. За сада, хајде да се фокусирамо на неколико њих. Видимо да су подаци груписани у 3 кластера величина 65, 110, 111. Излаз такође садржи центаре кластера (средине) за 3 групе кроз 5 променљивих.\n",
"\n",
"Вектор кластерисања представља доделу кластера за сваку опсервацију. Хајде да користимо функцију `augment` како бисмо додали доделу кластера оригиналном скупу података.\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": [
"Одлично, управо смо поделили наш скуп података у 3 групе. Па, колико је добро наше кластерисање 🤷? Хајде да погледамо `Silhouette score`.\n",
"\n",
"### **Silhouette score**\n",
"\n",
"[Silhouette анализа](https://en.wikipedia.org/wiki/Silhouette_(clustering)) може се користити за проучавање удаљености раздвајања између добијених кластера. Овај скор варира од -1 до 1, и ако је скор близу 1, кластер је густ и добро одвојен од других кластера. Вредност близу 0 представља преклапајуће кластере са узорцима који су веома близу граници одлуке суседних кластера. [извор](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
"\n",
"Метод просечног silhouette-а израчунава просечан silhouette за различите вредности *k*. Висок просечан silhouette скор указује на добро кластерисање.\n",
"\n",
"Функција `silhouette` у пакету за кластерисање користи се за израчунавање просечне ширине silhouette-а.\n",
"\n",
"> Silhouette се може израчунати помоћу било које [метрике удаљености](https://en.wikipedia.org/wiki/Distance \"Distance\"), као што су [Еуклидска удаљеност](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") или [Манхатен удаљеност](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") коју смо разматрали у [претходном часу](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": [
"Наш резултат је **0.549**, што је тачно на средини. Ово указује да наши подаци нису нарочито погодни за ову врсту кластерисања. Хајде да видимо да ли можемо визуелно да потврдимо ову претпоставку. [factoextra пакет](https://rpkgs.datanovia.com/factoextra/index.html) пружа функције (`fviz_cluster()`) за визуелизацију кластерисања.\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": [
"Преклапање у кластерима указује на то да наши подаци нису нарочито погодни за ову врсту кластерисања, али хајде да наставимо.\n",
"\n",
"## 4. Одређивање оптималног броја кластера\n",
"\n",
"Основно питање које се често јавља код K-Means кластерисања је следеће - без познатих ознака класа, како знати на колико кластера треба поделити податке?\n",
"\n",
"Један од начина да то сазнамо је да користимо узорак података за `креирање серије модела кластерисања` са повећавајућим бројем кластера (нпр. од 1 до 10), и да проценимо метрике кластерисања као што је **Silhouette score.**\n",
"\n",
"Хајде да одредимо оптималан број кластера тако што ћемо израчунати алгоритам кластерисања за различите вредности *k* и проценити **Within Cluster Sum of Squares** (WCSS). Укупна сума квадрата унутар кластера (WCSS) мери компактност кластерисања, и желимо да она буде што мања, јер ниже вредности значе да су тачке података ближе једна другој.\n",
"\n",
"Хајде да истражимо ефекат различитих избора `k`, од 1 до 10, на ово кластерисање.\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": [
"Сада када имамо укупну суму квадрата унутар кластера (tot.withinss) за сваки алгоритам кластерисања са центром *k*, користимо [метод лакта](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) да бисмо пронашли оптималан број кластера. Овај метод се састоји од графичког приказивања WCSS као функције броја кластера и одабирања [лакта криве](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") као броја кластера који ће се користити.\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": [
"График приказује значајно смањење WCSS (што значи већу *збијеност*) како се број кластера повећава са један на два, и још једно приметно смањење са два на три кластера. Након тога, смањење је мање изражено, што резултира `елбоу` 💪 на графику око три кластера. Ово је добар показатељ да постоје два до три разумно добро одвојена кластера тачака података.\n",
"\n",
"Сада можемо наставити и издвојити модел кластерисања где је `k = 3`:\n",
"\n",
"> `pull()`: користи се за издвајање једне колоне\n",
">\n",
"> `pluck()`: користи се за индексирање структура података као што су листе\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": [
"Одлично! Хајде да визуализујемо добијене кластере. Желите ли мало интерактивности уз помоћ `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": [
"Можда бисмо очекивали да сваки кластер (представљен различитим бојама) има јасно одвојене жанрове (представљене различитим облицима).\n",
"\n",
"Хајде да погледамо тачност модела.\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": [
"Tačnost ovog modela nije loša, ali nije ni sjajna. Moguće je da podaci nisu pogodni za K-Means klasterizaciju. Ovi podaci su previše neuravnoteženi, slabo povezani i postoji prevelika varijansa između vrednosti kolona da bi se dobro grupisali. Zapravo, klasteri koji se formiraju verovatno su značajno pod uticajem ili iskrivljeni zbog tri kategorije žanrova koje smo gore definisali.\n",
"\n",
"Ipak, ovo je bio prilično poučan proces!\n",
"\n",
"U dokumentaciji Scikit-learn-a možete videti da model poput ovog, sa klasterima koji nisu dobro definisani, ima problem sa 'varijansom':\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Infografika iz Scikit-learn-a</figcaption>\n",
"\n",
"\n",
"\n",
"## **Varijansa**\n",
"\n",
"Varijansa se definiše kao \"prosek kvadrata razlika od srednje vrednosti\" [izvor](https://www.mathsisfun.com/data/standard-deviation.html). U kontekstu ovog problema klasterizacije, odnosi se na podatke kod kojih vrednosti našeg skupa podataka imaju tendenciju da se previše udalje od srednje vrednosti.\n",
"\n",
"✅ Ovo je odličan trenutak da razmislite o svim načinima na koje biste mogli da rešite ovaj problem. Da li da malo prilagodite podatke? Koristite različite kolone? Primenite drugačiji algoritam? Savet: Probajte [skaliranje podataka](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) kako biste ih normalizovali i testirali druge kolone.\n",
"\n",
"> Probajte ovaj '[kalkulator varijanse](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' da biste bolje razumeli koncept.\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀Izazov**\n",
"\n",
"Provedite neko vreme sa ovim beležnicom, podešavajući parametre. Možete li poboljšati tačnost modela čišćenjem podataka (na primer, uklanjanjem ekstremnih vrednosti)? Možete koristiti težine kako biste određenim uzorcima podataka dali veću važnost. Šta još možete učiniti da kreirate bolje klastere?\n",
"\n",
"Savet: Probajte da skalirate podatke. U beležnici postoji komentarisani kod koji dodaje standardno skaliranje kako bi kolone podataka bile sličnije u smislu opsega. Videćete da, iako se silueta skora smanjuje, 'prelom' u grafiku lakta postaje glađi. To je zato što ostavljanje podataka neskaliranih omogućava podacima sa manjom varijansom da imaju veću težinu. Pročitajte više o ovom problemu [ovde](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/). Možete koristiti ovaj alat za vizualizaciju uzoraka podataka i određivanje njihovih centara. Možete uređivati nasumičnost podataka, broj klastera i broj centara. Da li vam ovo pomaže da steknete ideju o tome kako se podaci mogu grupisati?\n",
"\n",
"- Takođe, pogledajte [ovaj materijal o K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) sa Stanforda.\n",
"\n",
"Želite da testirate svoje novo stečene veštine klasterizacije na skupovima podataka koji su pogodni za K-Means klasterizaciju? Pogledajte:\n",
"\n",
"- [Treniranje i evaluacija modela klasterizacije](https://rpubs.com/eR_ic/clustering) koristeći Tidymodels i slične alate\n",
"\n",
"- [K-Means analiza klastera](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n",
"\n",
"- [K-Means klasterizacija sa principima urednih podataka](https://www.tidymodels.org/learn/statistics/k-means/)\n",
"\n",
"## **Zadatak**\n",
"\n",
"[Probajte različite metode klasterizacije](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 kreiranje originalne Python verzije ovog modula ♥️\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za kreiranje neverovatnih 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",
"Srećno učenje,\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>Ilustracija @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.\n"
]
}
]
}