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.
630 lines
44 KiB
630 lines
44 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-29T19:23:24+00:00",
|
|
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
|
|
"language_code": "pa"
|
|
}
|
|
},
|
|
"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",
|
|
"ਇਸ ਪਾਠ ਵਿੱਚ, ਤੁਸੀਂ ਸਿੱਖੋਗੇ ਕਿ R ਇਕੋਸਿਸਟਮ ਵਿੱਚ Tidymodels ਪੈਕੇਜ ਅਤੇ ਹੋਰ ਪੈਕੇਜ (ਜਿਨ੍ਹਾਂ ਨੂੰ ਅਸੀਂ ਦੋਸਤ ਕਹਾਂਗੇ 🧑🤝🧑) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕਲੱਸਟਰ ਕਿਵੇਂ ਬਣਾਉਣੇ ਹਨ, ਅਤੇ ਨਾਈਜੀਰੀਆਈ ਮਿਊਜ਼ਿਕ ਡਾਟਾਸੈੱਟ ਜੋ ਤੁਸੀਂ ਪਹਿਲਾਂ ਇੰਪੋਰਟ ਕੀਤਾ ਸੀ। ਅਸੀਂ ਕਲੱਸਟਰਿੰਗ ਲਈ K-Means ਦੇ ਬੁਨਿਆਦੀ ਸਿਧਾਂਤਾਂ ਨੂੰ ਕਵਰ ਕਰਾਂਗੇ। ਯਾਦ ਰੱਖੋ, ਜਿਵੇਂ ਤੁਸੀਂ ਪਹਿਲੇ ਪਾਠ ਵਿੱਚ ਸਿੱਖਿਆ ਸੀ, ਕਲੱਸਟਰਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਦੇ ਕਈ ਤਰੀਕੇ ਹਨ ਅਤੇ ਤੁਸੀਂ ਜੋ ਤਰੀਕਾ ਵਰਤਦੇ ਹੋ ਉਹ ਤੁਹਾਡੇ ਡਾਟਾ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਅਸੀਂ K-Means ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਾਂਗੇ ਕਿਉਂਕਿ ਇਹ ਸਭ ਤੋਂ ਆਮ ਕਲੱਸਟਰਿੰਗ ਤਕਨੀਕ ਹੈ। ਚਲੋ ਸ਼ੁਰੂ ਕਰੀਏ!\n",
|
|
"\n",
|
|
"ਤੁਸੀਂ ਜਿਨ੍ਹਾਂ ਸ਼ਬਦਾਂ ਬਾਰੇ ਸਿੱਖੋਗੇ:\n",
|
|
"\n",
|
|
"- ਸਿਲਹੂਏਟ ਸਕੋਰਿੰਗ \n",
|
|
"- ਐਲਬੋ ਮੈਥਡ \n",
|
|
"- ਇਨਰਸ਼ੀਆ \n",
|
|
"- ਵੈਰੀਅੰਸ \n",
|
|
"\n",
|
|
"### **ਪ੍ਰਸਤਾਵਨਾ**\n",
|
|
"\n",
|
|
"[K-Means ਕਲੱਸਟਰਿੰਗ](https://wikipedia.org/wiki/K-means_clustering) ਇੱਕ ਤਰੀਕਾ ਹੈ ਜੋ ਸਿਗਨਲ ਪ੍ਰੋਸੈਸਿੰਗ ਦੇ ਖੇਤਰ ਤੋਂ ਆਇਆ ਹੈ। ਇਹ ਡਾਟਾ ਦੇ ਸਮਾਨ ਲੱਛਣਾਂ ਦੇ ਆਧਾਰ 'ਤੇ `k ਕਲੱਸਟਰਾਂ` ਵਿੱਚ ਵੰਡਣ ਅਤੇ ਵਿਭਾਜਨ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।\n",
|
|
"\n",
|
|
"ਕਲੱਸਟਰਾਂ ਨੂੰ [Voronoi ਡਾਇਗ੍ਰਾਮ](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",
|
|
"2. ਫਿਰ, ਐਲਗੋਰਿਦਮ ਡਾਟਾ ਸੈੱਟ ਵਿੱਚੋਂ ਕੈਜੁਅਲ ਤੌਰ 'ਤੇ K ਅਬਜ਼ਰਵੇਸ਼ਨ ਚੁਣਦਾ ਹੈ ਜੋ ਕਲੱਸਟਰਾਂ ਦੇ ਸ਼ੁਰੂਆਤੀ ਕੇਂਦਰ (ਜਾਂ ਕਿ ਸੈਂਟਰਾਇਡ) ਵਜੋਂ ਕੰਮ ਕਰਦੇ ਹਨ। \n",
|
|
"3. ਫਿਰ, ਬਾਕੀ ਸਾਰੇ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨੂੰ ਸਭ ਤੋਂ ਨੇੜਲੇ ਸੈਂਟਰਾਇਡ ਨੂੰ ਸੌਂਪਿਆ ਜਾਂਦਾ ਹੈ। \n",
|
|
"4. ਫਿਰ, ਹਰ ਕਲੱਸਟਰ ਦਾ ਨਵਾਂ ਮੀਨ ਕੈਲਕੁਲੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਸੈਂਟਰਾਇਡ ਨੂੰ ਮੀਨ 'ਤੇ ਖਿਸਕਾਇਆ ਜਾਂਦਾ ਹੈ। \n",
|
|
"5. ਹੁਣ ਜਦੋਂ ਕੇਂਦਰਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕੈਲਕੁਲੇਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਹਰ ਅਬਜ਼ਰਵੇਸ਼ਨ ਨੂੰ ਦੁਬਾਰਾ ਚੈੱਕ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿ ਕੀ ਇਹ ਕਿਸੇ ਹੋਰ ਕਲੱਸਟਰ ਦੇ ਨੇੜੇ ਹੋ ਸਕਦਾ ਹੈ। ਸਾਰੇ ਆਬਜੈਕਟਾਂ ਨੂੰ ਨਵੇਂ ਕਲੱਸਟਰ ਮੀਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਦੁਬਾਰਾ ਸੌਂਪਿਆ ਜਾਂਦਾ ਹੈ। ਕਲੱਸਟਰ ਅਸਾਈਨਮੈਂਟ ਅਤੇ ਸੈਂਟਰਾਇਡ ਅਪਡੇਟ ਕਦਮਾਂ ਨੂੰ ਦੁਹਰਾਇਆ ਜਾਂਦਾ ਹੈ ਜਦ ਤੱਕ ਕਿ ਕਲੱਸਟਰ ਅਸਾਈਨਮੈਂਟ ਬਦਲਣ ਬੰਦ ਨਹੀਂ ਹੋ ਜਾਂਦੇ (ਜਾਂ ਕਿ ਜਦੋਂ ਕਨਵਰਜੈਂਸ ਪ੍ਰਾਪਤ ਹੁੰਦੀ ਹੈ)। ਆਮ ਤੌਰ 'ਤੇ, ਐਲਗੋਰਿਦਮ ਉਸ ਸਮੇਂ ਰੁਕ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਹਰ ਨਵੀਂ ਇਟਰੇਸ਼ਨ ਸੈਂਟਰਾਇਡ ਦੀ ਘੱਟ ਮਾਤਰਾ ਦੀ ਮੂਵਮੈਂਟ ਦਾ ਕਾਰਨ ਬਣਦੀ ਹੈ ਅਤੇ ਕਲੱਸਟਰ ਸਥਿਰ ਹੋ ਜਾਂਦੇ ਹਨ। \n",
|
|
"\n",
|
|
"<div>\n",
|
|
"\n",
|
|
"> ਯਾਦ ਰੱਖੋ ਕਿ ਸ਼ੁਰੂਆਤੀ k ਅਬਜ਼ਰਵੇਸ਼ਨ ਦੀ ਰੈਂਡਮ ਚੋਣ ਦੇ ਕਾਰਨ, ਜੋ ਸ਼ੁਰੂਆਤੀ ਸੈਂਟਰਾਇਡ ਵਜੋਂ ਵਰਤੇ ਜਾਂਦੇ ਹਨ, ਸਾਨੂੰ ਹਰ ਵਾਰ ਪ੍ਰਕਿਰਿਆ ਲਾਗੂ ਕਰਨ 'ਤੇ ਥੋੜ੍ਹੇ ਵੱਖਰੇ ਨਤੀਜੇ ਮਿਲ ਸਕਦੇ ਹਨ। ਇਸ ਕਾਰਨ, ਜ਼ਿਆਦਾਤਰ ਐਲਗੋਰਿਦਮ ਕਈ *ਰੈਂਡਮ ਸ਼ੁਰੂਆਤਾਂ* ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ ਅਤੇ ਸਭ ਤੋਂ ਘੱਟ WCSS ਵਾਲੀ ਇਟਰੇਸ਼ਨ ਨੂੰ ਚੁਣਦੇ ਹਨ। ਇਸ ਲਈ, ਹਮੇਸ਼ਾ ਕਈ *nstart* ਮੁੱਲਾਂ ਨਾਲ K-Means ਚਲਾਉਣ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਤਾਂ ਜੋ *ਅਣਚਾਹੇ ਸਥਾਨਕ ਅਪਟੀਮਮ* ਤੋਂ ਬਚਿਆ ਜਾ ਸਕੇ। \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",
|
|
"ਇਹ ਡਾਟਾ ਕਿੰਨਾ ਸਾਫ਼ ਹੈ? ਚਲੋ ਬਾਕਸ ਪਲਾਟਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਉਟਲਾਇਰਜ਼ ਦੀ ਜਾਂਚ ਕਰਦੇ ਹਾਂ। ਅਸੀਂ ਗਿਣਤੀ ਵਾਲੇ ਕਾਲਮਾਂ 'ਤੇ ਧਿਆਨ ਦੇਵਾਂਗੇ ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਘੱਟ ਆਉਟਲਾਇਰਜ਼ ਹਨ (ਹਾਲਾਂਕਿ ਤੁਸੀਂ ਆਉਟਲਾਇਰਜ਼ ਨੂੰ ਸਾਫ਼ ਕਰ ਸਕਦੇ ਹੋ)। ਬਾਕਸ ਪਲਾਟ ਡਾਟਾ ਦੀ ਰੇਂਜ ਦਿਖਾਉਂਦੇ ਹਨ ਅਤੇ ਇਹ ਫੈਸਲਾ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦੇ ਹਨ ਕਿ ਕਿਹੜੇ ਕਾਲਮ ਵਰਤਣੇ ਹਨ। ਧਿਆਨ ਦਿਓ, ਬਾਕਸ ਪਲਾਟ ਵੈਰੀਅੰਸ ਨਹੀਂ ਦਿਖਾਉਂਦੇ, ਜੋ ਕਿ ਚੰਗੇ ਕਲੱਸਟਰ ਕਰਨ ਯੋਗ ਡਾਟਾ ਦਾ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਤੱਤ ਹੈ। ਹੋਰ ਪੜ੍ਹਨ ਲਈ ਕਿਰਪਾ ਕਰਕੇ [ਇਸ ਚਰਚਾ](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. 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()\")` ਵਿੱਚ ਚੰਗੀ ਤਰ੍ਹਾਂ ਸਮਝਾਈ ਗਈ ਹੈ। ਫਿਲਹਾਲ, ਆਓ ਕੁਝ ਮੁੱਖ ਗੱਲਾਂ 'ਤੇ ਧਿਆਨ ਦੇਈਏ। ਅਸੀਂ ਵੇਖਦੇ ਹਾਂ ਕਿ ਡਾਟਾ ਨੂੰ 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 ਦੇ ਨੇੜੇ ਮੁੱਲ ਉਹ ਕਲੱਸਟਰ ਦਰਸਾਉਂਦਾ ਹੈ ਜੋ ਇੱਕ-ਦੂਜੇ ਦੇ ਬਹੁਤ ਨੇੜੇ ਹਨ ਅਤੇ ਜਿਨ੍ਹਾਂ ਦੇ ਨਮੂਨੇ ਪੜੋਸੀ ਕਲੱਸਟਰਾਂ ਦੇ ਫੈਸਲੇ ਦੀ ਸੀਮਾ ਦੇ ਬਹੁਤ ਨੇੜੇ ਹਨ। [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)।\n",
|
|
"\n",
|
|
"ਐਵਰੇਜ ਸਿਲਹੂਟ ਵਿਧੀ *k* ਦੇ ਵੱਖ-ਵੱਖ ਮੁੱਲਾਂ ਲਈ ਨਮੂਨਿਆਂ ਦੀ ਐਵਰੇਜ ਸਿਲਹੂਟ ਗਣਨਾ ਕਰਦੀ ਹੈ। ਇੱਕ ਉੱਚ ਐਵਰੇਜ ਸਿਲਹੂਟ ਸਕੋਰ ਚੰਗੇ ਕਲੱਸਟਰਿੰਗ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ।\n",
|
|
"\n",
|
|
"`silhouette` ਫੰਕਸ਼ਨ ਕਲੱਸਟਰ ਪੈਕੇਜ ਵਿੱਚ ਐਵਰੇਜ ਸਿਲਹੂਟ ਚੌੜਾਈ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ।\n",
|
|
"\n",
|
|
"> ਸਿਲਹੂਟ ਕਿਸੇ ਵੀ [ਦੂਰੀ](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 ਤੱਕ), ਅਤੇ ਕਲੱਸਟਰਿੰਗ ਮੈਟ੍ਰਿਕਸਾਂ ਦਾ ਮੁਲਾਂਕਣ ਕਰਨਾ ਜਿਵੇਂ ਕਿ **ਸਿਲਹੂਐਟ ਸਕੋਰ।**\n",
|
|
"\n",
|
|
"ਆਓ ਵੱਖ-ਵੱਖ *k* ਦੇ ਮੁੱਲਾਂ ਲਈ ਕਲੱਸਟਰਿੰਗ ਐਲਗੋਰਿਦਮ ਦੀ ਗਣਨਾ ਕਰਕੇ ਅਤੇ **ਵਿਥਿਨ ਕਲੱਸਟਰ ਸਮ ਆਫ ਸਕਵੇਅਰਜ਼** (WCSS) ਦਾ ਮੁਲਾਂਕਣ ਕਰਕੇ ਕਲੱਸਟਰਾਂ ਦੀ ਅਨੁਕੂਲ ਗਿਣਤੀ ਦਾ ਨਿਰਧਾਰਨ ਕਰੀਏ। ਕੁੱਲ ਵਿਥਿਨ-ਕਲੱਸਟਰ ਸਮ ਆਫ ਸਕਵੇਅਰਜ਼ (WCSS) ਕਲੱਸਟਰਿੰਗ ਦੀ ਸੰਕੁਚਨਸ਼ੀਲਤਾ ਨੂੰ ਮਾਪਦਾ ਹੈ ਅਤੇ ਅਸੀਂ ਚਾਹੁੰਦੇ ਹਾਂ ਕਿ ਇਹ ਜਿੰਨਾ ਘੱਟ ਹੋ ਸਕੇ, ਉਨਾ ਹੀ ਵਧੀਆ ਹੋਵੇ, ਕਿਉਂਕਿ ਘੱਟ ਮੁੱਲ ਦੱਸਦੇ ਹਨ ਕਿ ਡਾਟਾ ਪੌਇੰਟ ਇੱਕ-ਦੂਜੇ ਦੇ ਨੇੜੇ ਹਨ।\n",
|
|
"\n",
|
|
"ਆਓ 1 ਤੋਂ 10 ਤੱਕ ਵੱਖ-ਵੱਖ `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",
|
|
"<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 ਕਲੱਸਟਰਿੰਗ ਲਈ ਵਧੀਆ ਹਨ? ਕਿਰਪਾ ਕਰਕੇ ਦੇਖੋ:\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), ਗੋਲਡ ਮਾਈਕਰੋਸਾਫਟ ਲਰਨ ਸਟੂਡੈਂਟ ਐਂਬੈਸਡਰ।\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"
|
|
]
|
|
}
|
|
]
|
|
} |