{ "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-08-29T19:21:39+00:00", "source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb", "language_code": "ne" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "GULATlQXLXyR" }, "source": [ "## R र Tidy डेटा सिद्धान्त प्रयोग गरेर K-Means क्लस्टरिङ अन्वेषण गर्नुहोस्।\n", "\n", "### [**Pre-lecture quiz**](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 Clustering](https://wikipedia.org/wiki/K-means_clustering) सिग्नल प्रोसेसिङको क्षेत्रबाट व्युत्पन्न विधि हो। यो समान विशेषताहरूको आधारमा डेटा समूहहरूलाई `k क्लस्टरहरू` मा विभाजन गर्न प्रयोग गरिन्छ।\n", "\n", "क्लस्टरहरूलाई [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) को रूपमा देखाउन सकिन्छ, जसमा एउटा बिन्दु (वा 'बीज') र यसको सम्बन्धित क्षेत्र समावेश हुन्छ।\n", "\n", "

\n", " \n", "

Jen Looper द्वारा इन्फोग्राफिक
\n", "\n", "\n", "K-Means क्लस्टरिङका चरणहरू निम्न छन्:\n", "\n", "1. डेटा वैज्ञानिकले बनाउने क्लस्टरहरूको इच्छित संख्या निर्दिष्ट गरेर सुरु गर्छ।\n", "\n", "2. त्यसपछि, एल्गोरिदमले डेटासेटबाट K अवलोकनहरूलाई अनियमित रूपमा चयन गर्छ जसले क्लस्टरहरूको प्रारम्भिक केन्द्र (अर्थात्, सेन्ट्रोइड्स) को रूपमा काम गर्छ।\n", "\n", "3. त्यसपछि, बाँकी प्रत्येक अवलोकनलाई यसको नजिकको सेन्ट्रोइडमा असाइन गरिन्छ।\n", "\n", "4. त्यसपछि, प्रत्येक क्लस्टरको नयाँ औसत गणना गरिन्छ र सेन्ट्रोइडलाई औसतमा सारिन्छ।\n", "\n", "5. अब केन्द्रहरू पुन: गणना गरिएको छ, प्रत्येक अवलोकनलाई फेरि जाँच गरिन्छ कि यो सम्भवतः फरक क्लस्टरको नजिक हुन सक्छ। सबै वस्तुहरू अद्यावधिक क्लस्टर औसतहरू प्रयोग गरेर फेरि असाइन गरिन्छ। क्लस्टर असाइनमेन्ट र सेन्ट्रोइड अपडेट चरणहरू पुनरावृत्त रूपमा दोहोरिन्छन् जबसम्म क्लस्टर असाइनमेन्टहरू परिवर्तन हुन रोक्दैनन् (अर्थात्, जब अभिसरण प्राप्त हुन्छ)। सामान्यतया, एल्गोरिदमले प्रत्येक नयाँ पुनरावृत्तिले सेन्ट्रोइड्सको नगण्य आन्दोलन परिणाम दिन्छ र क्लस्टरहरू स्थिर हुन्छन्।\n", "\n", "
\n", "\n", "> ध्यान दिनुहोस् कि प्रारम्भिक k अवलोकनहरूको अनियमितीकरणका कारण, जुन प्रारम्भिक सेन्ट्रोइड्सको रूपमा प्रयोग गरिन्छ, हामीले प्रक्रिया लागू गर्दा प्रत्येक पटक थोरै फरक परिणाम प्राप्त गर्न सक्छौं। यही कारणले, अधिकांश एल्गोरिदमले धेरै *अनियमित सुरु* प्रयोग गर्छन् र सबैभन्दा कम WCSS भएको पुनरावृत्ति चयन गर्छन्। यस कारणले गर्दा, *nstart* को धेरै मानहरू प्रयोग गरेर K-Means सधैं चलाउन सिफारिस गरिन्छ ताकि *अवांछनीय स्थानीय अप्टिमम* बाट बच्न सकियोस्।\n", "\n", "
\n", "\n", "Allison Horst को [कला](https://github.com/allisonhorst/stats-illustrations) प्रयोग गरेर बनाइएको यो छोटो एनिमेसनले क्लस्टरिङ प्रक्रिया व्याख्या गर्छ:\n", "\n", "

\n", " \n", "

@allison_horst द्वारा कला
\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": [ "## 1. डेटा संग नृत्य: ३ सबैभन्दा लोकप्रिय संगीत विधाहरूमा सीमित गर्नुहोस्\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", "## २. थप डाटा अन्वेषण।\n", "\n", "यो डाटा कति सफा छ? आउनुहोस्, बक्स प्लटहरू प्रयोग गरेर आउटलायर्स जाँच गरौं। हामी संख्यात्मक स्तम्भहरूमा ध्यान केन्द्रित गर्नेछौं जसमा कम आउटलायर्स छन् (यद्यपि तपाईं आउटलायर्स हटाउन सक्नुहुन्छ)। बक्स प्लटहरूले डाटाको दायरा देखाउन सक्छन् र कुन स्तम्भहरू प्रयोग गर्ने छनोट गर्न मद्दत गर्दछ। ध्यान दिनुहोस्, बक्स प्लटहरूले भेरियन्स देखाउँदैन, जुन राम्रो क्लस्टर गर्न मिल्ने डाटाको महत्त्वपूर्ण तत्व हो। थप जानकारीका लागि कृपया [यो छलफल](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) हेर्नुहोस्।\n", "\n", "[बक्स प्लटहरू](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", "हामी प्रत्येक संख्यात्मक विशेषताका लागि बक्सप्लट बनाउँदैछौं र लूपहरू प्रयोग गर्नबाट बच्न चाहन्छौं, त्यसैले हाम्रो डाटालाई *लामो* ढाँचामा पुन: स्वरूपित गरौं जसले हामीलाई `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": [ "अब हामी यो डाटा अलि धेरै अव्यवस्थित छ भनेर देख्न सक्छौं: प्रत्येक स्तम्भलाई बक्सप्लटको रूपमा अवलोकन गर्दा, तपाईं बाहिरका मानहरू देख्न सक्नुहुन्छ। तपाईं डाटासेटबाट यी बाहिरका मानहरू हटाउन सक्नुहुन्छ, तर यसले डाटालाई धेरै न्यून बनाउँछ।\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": [ "## ३. आरमा k-means क्लस्टरिङ गणना गर्ने\n", "\n", "हामी आरमा `kmeans` नामक बिल्ट-इन फङ्सन प्रयोग गरेर k-means गणना गर्न सक्छौं, `help(\"kmeans()\")` हेर्नुहोस्। `kmeans()` फङ्सनले सबै संख्यात्मक स्तम्भहरू भएको डेटा फ्रेमलाई यसको मुख्य तर्कको रूपमा स्वीकार गर्छ।\n", "\n", "k-means क्लस्टरिङ प्रयोग गर्दा पहिलो चरण भनेको अन्तिम समाधानमा उत्पन्न हुने क्लस्टरहरूको संख्या (k) निर्दिष्ट गर्नु हो। हामीलाई थाहा छ कि डेटासेटबाट निकालिएका ३ गीत विधाहरू छन्, त्यसैले ३ प्रयास गरौं:\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()\")` मा राम्रोसँग व्याख्या गरिएको छ। अहिलेको लागि, केही कुरामा ध्यान केन्द्रित गरौं। हामी देख्छौं कि डेटा ३ क्लस्टरहरूमा समूह गरिएको छ जसको आकार ६५, ११०, १११ छ। आउटपुटले ५ भेरिएबलहरूमा ३ समूहहरूको क्लस्टर केन्द्रहरू (औसतहरू) पनि समावेश गर्दछ।\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": [ "हामीले हाम्रो डेटा सेटलाई ३ समूहमा विभाजन गर्यौं। अब, हाम्रो क्लस्टरिङ कत्तिको राम्रो छ 🤷? आउनुहोस् `Silhouette score` हेर्छौं।\n", "\n", "### **Silhouette score**\n", "\n", "[Silhouette विश्लेषण](https://en.wikipedia.org/wiki/Silhouette_(clustering)) ले परिणामस्वरूप बनेका क्लस्टरहरू बीचको दूरीको अध्ययन गर्न प्रयोग गर्न सकिन्छ। यो स्कोर -1 देखि 1 सम्म फरक हुन्छ, र यदि स्कोर 1 नजिक छ भने, क्लस्टर घना र अन्य क्लस्टरहरूबाट राम्रोसँग छुट्टिएको हुन्छ। 0 नजिकको मानले क्लस्टरहरू ओभरल्याप भएको र नमूनाहरू छिमेकी क्लस्टरहरूको निर्णय सीमा नजिक रहेको संकेत गर्दछ। [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)।\n", "\n", "औसत silhouette विधिले विभिन्न *k* मानहरूको लागि अवलोकनहरूको औसत silhouette गणना गर्दछ। उच्च औसत silhouette स्कोरले राम्रो क्लस्टरिङ संकेत गर्दछ।\n", "\n", "`silhouette` फङ्सनले क्लस्टर प्याकेजमा औसत silhouette चौडाइ गणना गर्दछ।\n", "\n", "> Silhouette कुनै पनि [दूरी](https://en.wikipedia.org/wiki/Distance \"Distance\") मेट्रिकसँग गणना गर्न सकिन्छ, जस्तै [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") वा [Manhattan 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": [ "हाम्रो स्कोर **.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", "## ४. उपयुक्त क्लस्टरहरूको निर्धारण\n", "\n", "K-Means क्लस्टरिङमा प्रायः उठ्ने एउटा आधारभूत प्रश्न यो हो - जब वर्ग लेबलहरू थाहा छैनन्, तपाईं कसरी थाहा पाउनुहुन्छ कि आफ्नो डाटालाई कति क्लस्टरहरूमा विभाजन गर्ने?\n", "\n", "हामीले पत्ता लगाउन सक्ने एउटा तरिका भनेको `क्लस्टरिङ मोडेलहरूको श्रृंखला बनाउने` हो, जसमा क्लस्टरहरूको संख्या क्रमशः बढ्दै जान्छ (जस्तै १ देखि १० सम्म), र क्लस्टरिङ मेट्रिक्सहरू जस्तै **Silhouette स्कोर** मूल्याङ्कन गर्ने हो।\n", "\n", "आउनुहोस्, विभिन्न *k* का मानहरूको लागि क्लस्टरिङ एल्गोरिदम गणना गरेर र **Within Cluster Sum of Squares** (WCSS) मूल्याङ्कन गरेर उपयुक्त क्लस्टरहरूको संख्या निर्धारण गरौं। कुल Within-Cluster Sum of Squares (WCSS) ले क्लस्टरिङको कम्प्याक्टनेस मापन गर्छ, र हामी यसलाई सकेसम्म सानो बनाउन चाहन्छौं, जसको अर्थ कम मानहरूले डाटा पोइन्टहरू नजिक छन् भन्ने देखाउँछ।\n", "\n", "आउनुहोस्, `k` का विभिन्न विकल्पहरूको (१ देखि १० सम्म) यस क्लस्टरिङमा प्रभाव अन्वेषण गरौं।\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": [ "अब हामीसँग प्रत्येक क्लस्टरिङ एल्गोरिदमको लागि केन्द्र *k* सहितको कुल भित्र-क्लस्टर समको वर्ग (tot.withinss) छ, हामी [कोहनी विधि](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 (अर्थात् *कसिलोपन*) मा ठूलो कमी आएको छ, र दुईबाट तीन क्लस्टरमा जाँदा थप उल्लेखनीय कमी देखिन्छ। त्यसपछि, कमी त्यति स्पष्ट हुँदैन, जसले गर्दा चार्टमा करिब तीन क्लस्टरमा `elbow` 💪 देखिन्छ। यो संकेत हो कि त्यहाँ दुईदेखि तीन राम्ररी छुट्टिएका डाटा बिन्दुहरूको क्लस्टरहरू छन्।\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": [ "यो मोडेलको शुद्धता खराब छैन, तर उत्कृष्ट पनि होइन। यो सम्भव छ कि डेटा K-Means Clustering को लागि उपयुक्त नहुन सक्छ। यो डेटा धेरै असन्तुलित छ, धेरै कम सम्बन्धित छ, र स्तम्भ मानहरू बीच धेरै भिन्नता छ जसले राम्रो क्लस्टर बनाउन सक्दैन। वास्तवमा, बनाइएका क्लस्टरहरू सम्भवतः माथि परिभाषित गरिएका तीन विधा श्रेणीहरूद्वारा धेरै प्रभावित वा विकृत छन्।\n", "\n", "यद्यपि, यो सिक्ने प्रक्रिया निकै रोचक थियो!\n", "\n", "Scikit-learn को दस्तावेजमा, तपाईं देख्न सक्नुहुन्छ कि यस्तो मोडेल, जहाँ क्लस्टरहरू राम्रोसँग छुट्याइएका छैनन्, 'भिन्नता' समस्या छ:\n", "\n", "

\n", " \n", "

Scikit-learn बाट इन्फोग्राफिक
\n", "\n", "\n", "\n", "## **भिन्नता**\n", "\n", "भिन्नता \"औसतबाट वर्गीय भिन्नताको औसत\" भनेर परिभाषित गरिएको छ [स्रोत](https://www.mathsisfun.com/data/standard-deviation.html)। यो क्लस्टरिङ समस्याको सन्दर्भमा, यसले हाम्रो डेटासेटका संख्याहरू औसतबाट धेरै टाढा भिन्न हुने प्रवृत्तिलाई जनाउँछ।\n", "\n", "✅ यो समस्या समाधान गर्न सक्ने सबै तरिकाहरू सोच्ने राम्रो समय हो। डेटा अलिकति परिमार्जन गर्ने? फरक स्तम्भहरू प्रयोग गर्ने? फरक एल्गोरिदम प्रयोग गर्ने? सुझाव: [तपाईंको डेटा स्केलिङ](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) गरेर यसलाई सामान्यीकरण गर्नुहोस् र अन्य स्तम्भहरू परीक्षण गर्नुहोस्।\n", "\n", "> यो '[भिन्नता क्याल्कुलेटर](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' प्रयोग गरेर अवधारणालाई अलिकति बढी बुझ्ने प्रयास गर्नुहोस्।\n", "\n", "------------------------------------------------------------------------\n", "\n", "## **🚀चुनौती**\n", "\n", "यस नोटबुकसँग केही समय बिताउनुहोस्, प्यारामिटरहरू परिमार्जन गर्दै। के तपाईं डेटा सफा गरेर (उदाहरणका लागि, बाहिरका मानहरू हटाएर) मोडेलको शुद्धता सुधार गर्न सक्नुहुन्छ? तपाईंले केही डेटा नमूनाहरूलाई बढी तौल दिन तौलहरू प्रयोग गर्न सक्नुहुन्छ। राम्रो क्लस्टरहरू बनाउन के गर्न सकिन्छ?\n", "\n", "सुझाव: तपाईंको डेटा स्केल गर्न प्रयास गर्नुहोस्। नोटबुकमा टिप्पणी गरिएको कोड छ जसले मानक स्केलिङ थप्छ ताकि डेटा स्तम्भहरू दायरा सन्दर्भमा एकअर्कासँग बढी मिल्दोजुल्दो देखिन्छ। तपाईंले पाउनुहुनेछ कि सिल्हौट स्कोर तल जान्छ, तर 'एल्बो ग्राफ' को 'किंक' नरम हुन्छ। यो किनभने डेटा स्केल नगरी छोड्दा कम भिन्नता भएको डेटाले बढी तौल बोक्न अनुमति दिन्छ। यस समस्याबारे अलिकति बढी पढ्नुहोस् [यहाँ](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)।\n", "\n", "## [**पोस्ट-लेक्चर क्विज**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n", "\n", "## **पुनरावलोकन र आत्म-अध्ययन**\n", "\n", "- K-Means सिमुलेटर [जस्तै यो](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) हेर्नुहोस्। तपाईंले यो उपकरण प्रयोग गरेर नमूना डेटा बिन्दुहरू देख्न र यसको केन्द्रबिन्दु निर्धारण गर्न सक्नुहुन्छ। तपाईंले डेटा को अनियमितता, क्लस्टरहरूको संख्या र केन्द्रबिन्दुहरूको संख्या सम्पादन गर्न सक्नुहुन्छ। के यसले तपाईंलाई डेटा कसरी समूह गर्न सकिन्छ भन्ने विचार दिन्छ?\n", "\n", "- [Stanford बाट K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) को यो ह्यान्डआउट पनि हेर्नुहोस्।\n", "\n", "के तपाईंले हालै सिकेको क्लस्टरिङ सीपलाई K-Means क्लस्टरिङका लागि उपयुक्त डेटा सेटहरूमा प्रयोग गर्न चाहनुहुन्छ? कृपया हेर्नुहोस्:\n", "\n", "- [क्लस्टरिङ मोडेलहरू प्रशिक्षण र मूल्याङ्कन गर्नुहोस्](https://rpubs.com/eR_ic/clustering) Tidymodels र साथीहरूको प्रयोग गरेर\n", "\n", "- [K-Means क्लस्टर विश्लेषण](https://uc-r.github.io/kmeans_clustering), UC Business Analytics R Programming Guide\n", "\n", "- [टिडी डेटा सिद्धान्तहरूसँग K-Means क्लस्टरिङ](https://www.tidymodels.org/learn/statistics/k-means/)\n", "\n", "## **असाइनमेन्ट**\n", "\n", "[विभिन्न क्लस्टरिङ विधिहरू प्रयास गर्नुहोस्](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n", "\n", "## धन्यवाद:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) लाई यस मोड्युलको मूल Python संस्करण सिर्जना गरेकोमा ♥️\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) लाई R लाई अझ स्वागतयोग्य र आकर्षक बनाउने अद्भुत चित्रणहरू सिर्जना गरेकोमा धन्यवाद। उनको [ग्यालरी](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) मा थप चित्रणहरू फेला पार्नुहोस्।\n", "\n", "सुखद अध्ययन,\n", "\n", "[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n", "\n", "

\n", " \n", "

@allison_horst द्वारा कलाकृति
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।\n" ] } ] }