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

637 lines
35 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-08-29T15:19:27+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "ur"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## آر اور ٹائیڈی ڈیٹا اصولوں کا استعمال کرتے ہوئے K-Means کلسٹرنگ کو دریافت کریں۔\n",
"\n",
"### [**لیکچر سے پہلے کا کوئز**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
"\n",
"اس سبق میں، آپ سیکھیں گے کہ Tidymodels پیکیج اور آر ایکو سسٹم کے دیگر پیکیجز (جنہیں ہم دوست کہیں گے 🧑‍🤝‍🧑) اور نائجیریا کے موسیقی کے ڈیٹا سیٹ کا استعمال کرتے ہوئے کلسٹرز کیسے بنائیں۔ ہم کلسٹرنگ کے لیے 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",
"کلسٹرز کو [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) کے طور پر تصور کیا جا سکتا ہے، جن میں ایک نقطہ (یا 'seed') اور اس سے متعلقہ علاقہ شامل ہوتا ہے۔\n",
"\n",
"<p >\n",
" <img src=\"../../images/voronoi.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Jen Looper کی جانب سے انفوگرافک</figcaption>\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",
"یہ مختصر اینیمیشن Allison Horst کے [آرٹ ورک](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",
"کلسٹرنگ میں ایک بنیادی سوال یہ پیدا ہوتا ہے: آپ کیسے جانتے ہیں کہ اپنے ڈیٹا کو کتنے کلسٹرز میں تقسیم کرنا ہے؟ K-Means کے استعمال میں ایک کمی یہ ہے کہ آپ کو `k`، یعنی `centroids` کی تعداد قائم کرنی ہوگی۔ خوش قسمتی سے، `elbow method` `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. ڈیٹا کے ساتھ رقص: تین سب سے زیادہ مقبول موسیقی کی اصناف تک محدود کریں\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",
"یہ ڈیٹا کتنا صاف ہے؟ آئیے باکس پلاٹس کے ذریعے آؤٹ لائرز کو چیک کرتے ہیں۔ ہم ان عددی کالمز پر توجہ مرکوز کریں گے جن میں کم آؤٹ لائرز ہیں (حالانکہ آپ آؤٹ لائرز کو صاف بھی کر سکتے ہیں)۔ باکس پلاٹس ڈیٹا کی حد کو ظاہر کر سکتے ہیں اور یہ فیصلہ کرنے میں مدد کریں گے کہ کون سے کالمز استعمال کیے جائیں۔ یاد رکھیں، باکس پلاٹس تغیر کو ظاہر نہیں کرتے، جو کہ اچھے کلسٹر ایبل ڈیٹا کا ایک اہم عنصر ہے۔ مزید پڑھنے کے لیے براہ کرم [یہ بحث](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": [
"## 3. آر میں k-means کلسٹرنگ کا حساب لگانا\n",
"\n",
"ہم آر میں k-means کا حساب لگانے کے لیے بلٹ ان `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 ہیں۔ آؤٹ پٹ میں 5 متغیرات کے لیے 3 گروپس کے کلسٹر سینٹرز (اوسط) بھی شامل ہیں۔\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 طریقہ مختلف *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",
"## 4. بہترین کلسٹرز کا تعین کرنا\n",
"\n",
"K-Means کلسٹرنگ میں ایک بنیادی سوال اکثر پیدا ہوتا ہے - جب کلاس لیبلز معلوم نہ ہوں، تو آپ کیسے جان سکتے ہیں کہ اپنے ڈیٹا کو کتنے کلسٹرز میں تقسیم کرنا ہے؟\n",
"\n",
"ایک طریقہ یہ ہے کہ ہم ڈیٹا کے نمونے کو استعمال کرتے ہوئے `کلسٹرنگ ماڈلز کی ایک سیریز بنائیں` جس میں کلسٹرز کی تعداد کو بڑھایا جائے (مثلاً 1 سے 10 تک)، اور کلسٹرنگ میٹرکس جیسے **Silhouette اسکور** کا جائزہ لیں۔\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": [
"اب جب کہ ہمارے پاس ہر کلسٹرنگ الگورتھم کے لیے مرکز *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 میں بڑی کمی (یعنی زیادہ *مضبوطی*) آتی ہے، اور دو سے تین کلسٹرز تک مزید نمایاں کمی ہوتی ہے۔ اس کے بعد، کمی اتنی واضح نہیں رہتی، جس کے نتیجے میں چارٹ میں تقریباً تین کلسٹرز پر ایک `کہنی` 💪 بنتی ہے۔ یہ اس بات کی اچھی نشاندہی کرتا ہے کہ ڈیٹا پوائنٹس کے دو سے تین معقول حد تک الگ الگ کلسٹرز موجود ہیں۔\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 کی دستاویزات میں، آپ دیکھ سکتے ہیں کہ ایک ایسا ماڈل، جس کے کلسٹرز واضح طور پر متعین نہیں ہیں، 'variance' کے مسئلے کا شکار ہوتا ہے:\n",
"\n",
"<p >\n",
" <img src=\"../../images/problems.png\"\n",
" width=\"500\"/>\n",
" <figcaption>Scikit-learn سے لیا گیا انفوگرافک</figcaption>\n",
"\n",
"\n",
"\n",
"## **واریئنس**\n",
"\n",
"واریئنس کو \"اوسط سے مربع فرق کا اوسط\" کے طور پر بیان کیا جاتا ہے [ماخذ](https://www.mathsisfun.com/data/standard-deviation.html)۔ اس کلسٹرنگ مسئلے کے تناظر میں، یہ اس ڈیٹا کی طرف اشارہ کرتا ہے جس میں ہمارے ڈیٹاسیٹ کے نمبرز اوسط سے بہت زیادہ مختلف ہوتے ہیں۔\n",
"\n",
"✅ یہ ایک بہترین موقع ہے کہ آپ ان تمام طریقوں کے بارے میں سوچیں جن سے آپ اس مسئلے کو درست کر سکتے ہیں۔ ڈیٹا کو تھوڑا مزید ایڈجسٹ کریں؟ مختلف کالم استعمال کریں؟ کوئی الگ الگورتھم استعمال کریں؟ اشارہ: اپنے ڈیٹا کو [scale کریں](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) تاکہ اسے normalize کریں اور دوسرے کالمز کو آزمائیں۔\n",
"\n",
"> اس '[variance calculator](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' کو آزمائیں تاکہ اس تصور کو مزید سمجھ سکیں۔\n",
"\n",
"------------------------------------------------------------------------\n",
"\n",
"## **🚀چیلنج**\n",
"\n",
"اس نوٹ بک کے ساتھ کچھ وقت گزاریں اور پیرامیٹرز کو ایڈجسٹ کریں۔ کیا آپ ڈیٹا کو مزید صاف کر کے (مثلاً آؤٹ لائرز کو ہٹا کر) ماڈل کی درستگی کو بہتر بنا سکتے ہیں؟ آپ وزن استعمال کر سکتے ہیں تاکہ مخصوص ڈیٹا نمونوں کو زیادہ وزن دیا جا سکے۔ آپ اور کیا کر سکتے ہیں تاکہ بہتر کلسٹرز بن سکیں؟\n",
"\n",
"اشارہ: اپنے ڈیٹا کو scale کرنے کی کوشش کریں۔ نوٹ بک میں تبصرہ شدہ کوڈ موجود ہے جو معیاری scaling کو شامل کرتا ہے تاکہ ڈیٹا کالمز کو رینج کے لحاظ سے ایک دوسرے کے قریب بنایا جا سکے۔ آپ دیکھیں گے کہ اگرچہ silhouette اسکور کم ہو جاتا ہے، لیکن elbow گراف میں 'kink' ہموار ہو جاتا ہے۔ اس کی وجہ یہ ہے کہ ڈیٹا کو غیر scaled چھوڑنے سے کم واریئنس والے ڈیٹا کو زیادہ وزن ملتا ہے۔ اس مسئلے پر مزید پڑھیں [یہاں](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 Simulator [جیسے یہ](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) دیکھیں۔ آپ اس ٹول کو استعمال کر کے نمونہ ڈیٹا پوائنٹس کو visualize کر سکتے ہیں اور اس کے centroids کا تعین کر سکتے ہیں۔ آپ ڈیٹا کی randomness، کلسٹرز کی تعداد اور centroids کی تعداد کو ایڈٹ کر سکتے ہیں۔ کیا یہ آپ کو یہ سمجھنے میں مدد دیتا ہے کہ ڈیٹا کو کیسے گروپ کیا جا سکتا ہے؟\n",
"\n",
"- Stanford کی [K-Means پر یہ ہینڈ آؤٹ](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) بھی دیکھیں۔\n",
"\n",
"کیا آپ اپنی نئی حاصل کردہ کلسٹرنگ مہارتوں کو ایسے ڈیٹاسیٹس پر آزمانا چاہتے ہیں جو K-Means کلسٹرنگ کے لیے موزوں ہوں؟ براہ کرم دیکھیں:\n",
"\n",
"- [Train and Evaluate Clustering Models](https://rpubs.com/eR_ic/clustering) Tidymodels اور دوستوں کے ساتھ\n",
"\n",
"- [K-means Cluster Analysis](https://uc-r.github.io/kmeans_clustering)، UC Business Analytics R Programming Guide\n",
"\n",
"- [K-means clustering with tidy data principles](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/) جنہوں نے حیرت انگیز illustrations بنائیں جو R کو زیادہ خوش آئند اور دلچسپ بناتی ہیں۔ مزید illustrations ان کی [gallery](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",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"500\"/>\n",
" <figcaption>@allison_horst کی تخلیق کردہ آرٹ ورک</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**ڈس کلیمر**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے پوری کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا عدم درستگی ہو سکتی ہیں۔ اصل دستاویز، جو اس کی اصل زبان میں ہے، کو مستند ماخذ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n"
]
}
]
}