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

639 lines
51 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-10-11T12:43:57+00:00",
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
"language_code": "ta"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "GULATlQXLXyR"
},
"source": [
"## R மற்றும் Tidy தரவுக் கொள்கைகளைப் பயன்படுத்தி K-Means க்ளஸ்டரிங்கை ஆராயுங்கள்\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 Clustering](https://wikipedia.org/wiki/K-means_clustering) என்பது சிக்னல் செயலாக்க துறையிலிருந்து பெறப்பட்ட ஒரு முறை. இது அதன் அம்சங்களில் உள்ள ஒற்றுமைகளின் அடிப்படையில் தரவுக் குழுக்களை `k க்ளஸ்டர்கள்` ஆகப் பிரிக்கவும் பகிரவும் பயன்படுத்தப்படுகிறது.\n",
"\n",
"இந்த க்ளஸ்டர்களை [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) போல காட்சிப்படுத்தலாம், இதில் ஒரு புள்ளி (அல்லது 'விதை') மற்றும் அதனுடன் தொடர்புடைய பகுதி அடங்கும்.\n",
"\n",
"<p >\n",
" <img src=\"../../../../../../translated_images/ta/voronoi.1dc1613fb0439b95.webp\"\n",
" width=\"500\"/>\n",
" <figcaption>ஜென் லூப்பர் உருவாக்கிய தகவல் வரைபடம்</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` எனப்படும் `சென்ட்ராய்ட்களின்` எண்ணிக்கையை நிறுவ வேண்டும் என்பதே ஆகும். அதிர்ஷ்டவசமாக, `எல்போ முறை` `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",
"இந்த தரவுகள் எவ்வளவு சுத்தமாக உள்ளன? பாக்ஸ் ப்ளாட்டுகளைப் பயன்படுத்தி அவதானமான மதிப்புகளை (outliers) சரிபார்ப்போம். நாம் குறைவான அவதானமான மதிப்புகள் உள்ள எண் சார்ந்த பத்திகளை கவனிக்கிறோம் (அவதானமான மதிப்புகளை நீக்கலாம் என்றாலும்). பாக்ஸ் ப்ளாட்டுகள் தரவின் வரம்பை காட்டும், மேலும் எந்த பத்திகளை பயன்படுத்த வேண்டும் என்பதைத் தேர்ந்தெடுக்க உதவும். கவனிக்கவும், பாக்ஸ் ப்ளாட்டுகள் மாறுபாட்டை (variance) காட்டாது, இது நல்ல குழுக்களுக்கான தரவின் முக்கிய அம்சமாகும். மேலும் வாசிக்க [இந்த விவாதத்தை](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",
"எண்ணியல் அம்சங்களுக்கு ஒவ்வொன்றுக்கும் ஒரு பெட்டிப்படம் உருவாக்கப்போகிறோம், மேலும் மடக்கங்களை (loops) தவிர்க்க விரும்புகிறோம். எனவே, `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",
"இப்போது இந்த தரவுகள் கொஞ்சம் சத்தமாக உள்ளன: ஒவ்வொரு நெடுவரிசையையும் ஒரு பெட்டிப்படமாகக் கவனித்தால், நீங்கள் வெளிப்படையான மதிப்புகளை காணலாம். நீங்கள் தரவுத்தொகுப்பைச் சென்று இந்த வெளிப்படையான மதிப்புகளை நீக்கலாம், ஆனால் அது தரவுகளை மிகவும் குறைவாக்கிவிடும்.\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. R-ல் k-means க்ளஸ்டரிங் கணக்கிடுதல்\n",
"\n",
"R-ல் உள்ள `kmeans` என்ற உள்ளமைக்கப்பட்ட செயல்பாட்டைப் பயன்படுத்தி k-means கணக்கிடலாம், `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()\")` இல் நன்றாக விளக்கப்பட்டுள்ளது. இப்போது, சிலவற்றில் கவனம் செலுத்துவோம். தரவுகள் 65, 110, 111 அளவுள்ள 3 குழுக்களாக பிரிக்கப்பட்டுள்ளன என்பதை நாம் காண்கிறோம். வெளியீட்டில் 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 analysis](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` செயல்பாட்டை cluster தொகுப்பில் பயன்படுத்தி சராசரி 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 score** போன்ற குழும அளவுகோல்களை மதிப்பீடு செய்வது.\n",
"\n",
"*க* என்ற மாறியின் வெவ்வேறு மதிப்புகளுக்கான குழுமக் காற்புள்ளி கணக்கீடு செய்து **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 \"வளைவின் மோடு\") என்பதை பயன்படுத்த வேண்டிய குழுமங்களின் எண்ணிக்கையாக தேர்வு செய்வது அடங்கும்.\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=\"../../../../../../translated_images/ta/problems.f7fb539ccd80608e.webp\"\n",
" width=\"500\"/>\n",
" <figcaption>Scikit-learn-இன் தகவல் வரைபடம்</figcaption>\n",
"\n",
"\n",
"\n",
"## **மாறுபாடு (Variance)**\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",
"குறிப்பு: உங்கள் தரவுகளை அளவீடு செய்ய முயற்சிக்கவும். நோட்புக்கில் குறிப்பிட்ட குறியீடு உள்ளது, இது தரவுக் களங்களை வரம்பு அடிப்படையில் ஒருவருக்கொருவர் ஒத்ததாக மாற்றுவதற்கான நிலையான அளவீட்டைச் சேர்க்கிறது. நீங்கள் காண்பீர்கள், சில்லூயட் மதிப்பெண் குறைந்தாலும், 'மடிப்பு' (kink) கோண வரைபடத்தில் மிருதுவாக மாறுகிறது. இது தரவுகளை அளவீடு செய்யாமல் விட்டால், குறைவான மாறுபாட்டுடன் உள்ள தரவுகள் அதிக எடையை கொண்டிருக்கும். இந்த பிரச்சினையைப் பற்றி மேலும் [இங்கே](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/) பாருங்கள். இந்த கருவியை நீங்கள் மாதிரித் தரவுப் புள்ளிகளை காட்சிப்படுத்த மற்றும் அதன் மையங்களை (centroids) தீர்மானிக்க பயன்படுத்தலாம். தரவின் சீரற்ற தன்மை, களவுகளின் எண்ணிக்கை மற்றும் மையங்களின் எண்ணிக்கையை நீங்கள் திருத்தலாம். இது தரவுகளை எவ்வாறு குழுவாக்கலாம் என்பதைப் பற்றிய ஒரு கருத்தை உங்களுக்கு வழங்குமா?\n",
"\n",
"- மேலும், [இந்த K-Means குறிப்பு](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) Stanford-இல் இருந்து பாருங்கள்.\n",
"\n",
"K-Means clustering-க்கு பொருந்தக்கூடிய தரவுத்தொகுப்புகளில் உங்கள் புதிய களவமைப்பு திறன்களை முயற்சிக்க விரும்புகிறீர்களா? தயவுசெய்து பாருங்கள்:\n",
"\n",
"- [களவ மாடல்களைப் பயிற்சி மற்றும் மதிப்பீடு செய்ய](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](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",
"<p >\n",
" <img src=\"../../../../../../translated_images/ta/r_learners_sm.e4a71b113ffbedfe.webp\"\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) என்ற AI மொழிபெயர்ப்பு சேவையைப் பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கின்றோம், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறான தகவல்கள் இருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல.\n"
]
}
]
}