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

639 lines
33 KiB

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"colab": {
"name": "lesson_14.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"coopTranslator": {
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
"translation_date": "2025-08-29T15:18:04+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "ar"
}
},
"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",
"- تقييم Silhouette\n",
"\n",
"- طريقة Elbow\n",
"\n",
"- القصور الذاتي (Inertia)\n",
"\n",
"- التباين (Variance)\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>رسم توضيحي بواسطة 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",
"توضح هذه الرسوم المتحركة القصيرة باستخدام [الأعمال الفنية](https://github.com/allisonhorst/stats-illustrations) لـ Allison Horst عملية التجميع:\n",
"\n",
"<p >\n",
" <img src=\"../../images/kmeans.gif\"\n",
" width=\"550\"/>\n",
" <figcaption>عمل فني بواسطة @allison_horst</figcaption>\n",
"\n",
"سؤال أساسي يطرح نفسه في التجميع: كيف تعرف عدد المجموعات التي يجب تقسيم بياناتك إليها؟ أحد عيوب استخدام K-Means هو أنك ستحتاج إلى تحديد `k`، أي عدد `المراكز`. لحسن الحظ، تساعد طريقة `elbow` في تقدير قيمة بداية جيدة لـ `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",
"الآن يمكننا أن نلاحظ أن هذه البيانات تحتوي على بعض الضوضاء: من خلال مراقبة كل عمود كـ 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. كما يحتوي الناتج على مراكز المجموعات (المتوسطات) للمجموعات الثلاث عبر المتغيرات الخمسة.\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**\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": [
"نتيجتنا هي **.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* وتقييم **مجموع المربعات داخل المجموعات** (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 (مما يعني زيادة *التماسك*) مع زيادة عدد المجموعات من واحدة إلى اثنتين، وانخفاضًا ملحوظًا آخر من اثنتين إلى ثلاث مجموعات. بعد ذلك، يصبح الانخفاض أقل وضوحًا، مما يؤدي إلى ظهور ما يُعرف بـ `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",
"<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",
"✅ هذه فرصة رائعة للتفكير في جميع الطرق التي يمكنك من خلالها تصحيح هذه المشكلة. هل يمكنك تعديل البيانات أكثر؟ استخدام أعمدة مختلفة؟ تجربة خوارزمية مختلفة؟ تلميح: جرب [تقييس البيانات](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",
"- ألقِ نظرة أيضًا على [هذا المستند عن K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) من جامعة ستانفورد.\n",
"\n",
"هل تريد تجربة مهاراتك المكتسبة حديثًا في التجميع على مجموعات بيانات تناسب K-Means Clustering؟ يرجى الاطلاع على:\n",
"\n",
"- [تدريب وتقييم نماذج التجميع](https://rpubs.com/eR_ic/clustering) باستخدام Tidymodels وأدوات أخرى\n",
"\n",
"- [تحليل التجميع باستخدام K-Means](https://uc-r.github.io/kmeans_clustering)، دليل UC لتحليل البيانات باستخدام R\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)، سفير Microsoft Learn Student الذهبي.\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تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n"
]
}
]
}