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.
500 lines
52 KiB
500 lines
52 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## **Spotify-இல் இருந்து சேகரிக்கப்பட்ட நைஜீரிய இசை - ஒரு பகுப்பாய்வு**\n",
|
|
"\n",
|
|
"க்ளஸ்டரிங் என்பது [அன்சூப்பர்வைஸ்டு லெர்னிங்](https://wikipedia.org/wiki/Unsupervised_learning) வகையைச் சேர்ந்தது, இது ஒரு தரவுத்தொகுப்பு லேபிள் செய்யப்படாதது அல்லது அதன் உள்ளீடுகள் முன்பே வரையறுக்கப்பட்ட வெளியீடுகளுடன் பொருந்தவில்லை என்று கருதுகிறது. இது பல்வேறு الگாரிதங்களைப் பயன்படுத்தி லேபிள் செய்யப்படாத தரவுகளை சீரமைத்து, அதில் காணப்படும் முறைப்படி குழுக்களை வழங்குகிறது.\n",
|
|
"\n",
|
|
"[**முன்-வகுப்பு வினாடி வினா**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
|
|
"\n",
|
|
"### **அறிமுகம்**\n",
|
|
"\n",
|
|
"[க்ளஸ்டரிங்](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) தரவுகளை ஆராய்வதற்கு மிகவும் பயனுள்ளதாக உள்ளது. நைஜீரிய ரசிகர்கள் இசையை எப்படி அனுபவிக்கிறார்கள் என்பதைப் பற்றிய போக்குகள் மற்றும் முறைகளை இது கண்டுபிடிக்க உதவுமா என்று பார்ப்போம்.\n",
|
|
"\n",
|
|
"> ✅ க்ளஸ்டரிங் பயன்பாடுகளைப் பற்றி ஒரு நிமிடம் யோசிக்கவும். நிஜ வாழ்க்கையில், க்ளஸ்டரிங் உங்கள் குடும்ப உறுப்பினர்களின் ஆடைகளை சீரமைக்க நீங்கள் சலவை குவியலைப் பயன்படுத்தும் போது நிகழ்கிறது 🧦👕👖🩲. தரவியல் அறிவியலில், க்ளஸ்டரிங் பயனர் விருப்பங்களைப் பகுப்பாய்வு செய்ய அல்லது எந்த லேபிள் செய்யப்படாத தரவுத்தொகுப்பின் பண்புகளைத் தீர்மானிக்க முயற்சிக்கும் போது நிகழ்கிறது. க்ளஸ்டரிங், ஒரு வகையில், குளறுபடிகளை புரிந்து கொள்ள உதவுகிறது, ஒரு கால்சாக் டிராயர் போல.\n",
|
|
"\n",
|
|
"தொழில்முறை சூழலில், க்ளஸ்டரிங் சந்தை பிரிவினைத் தீர்மானிக்க, எந்த வயது குழுக்கள் எந்த பொருட்களை வாங்குகின்றன என்பதைப் போன்றவற்றைத் தீர்மானிக்க பயன்படுத்தப்படுகிறது. மற்றொரு பயன்பாடு மோசடிகளை கண்டறிதல், உதாரணமாக, கிரெடிட் கார்டு பரிவர்த்தனைகளின் தரவுத்தொகுப்பில் மோசடிகளை கண்டறிய. அல்லது நீங்கள் மருத்துவ ஸ்கேன் தொகுப்பில் கட்டிகள் உள்ளதா என்பதைத் தீர்மானிக்க க்ளஸ்டரிங்கைப் பயன்படுத்தலாம்.\n",
|
|
"\n",
|
|
"✅ நீங்கள் வங்கிகள், மின் வணிகம் அல்லது வணிக சூழலில் 'க்ளஸ்டரிங்' ஐ எப்படி சந்தித்திருக்கிறீர்கள் என்று ஒரு நிமிடம் யோசிக்கவும்.\n",
|
|
"\n",
|
|
"> 🎓 சுவாரஸ்யமாக, க்ளஸ்டர் பகுப்பாய்வு 1930களில் மனிதவியல் மற்றும் உளவியல் துறைகளில் தோன்றியது. அது எப்படி பயன்படுத்தப்பட்டிருக்கலாம் என்று நீங்கள் கற்பனை செய்ய முடியுமா?\n",
|
|
"\n",
|
|
"மாற்றாக, நீங்கள் தேடல் முடிவுகளை குழுக்களாகப் பிரிக்க பயன்படுத்தலாம் - வாங்கும் இணைப்புகள், படங்கள் அல்லது மதிப்பீடுகள், உதாரணமாக. க்ளஸ்டரிங் ஒரு பெரிய தரவுத்தொகுப்பை குறைக்கவும், அதில் மேலும் நுணுக்கமான பகுப்பாய்வு செய்யவும் உதவுகிறது, எனவே இந்த தொழில்நுட்பம் மற்ற மாதிரிகள் உருவாக்கப்படும் முன் தரவுகளைப் பற்றி அறிய பயன்படுத்தப்படுகிறது.\n",
|
|
"\n",
|
|
"✅ உங்கள் தரவுகள் குழுக்களில் ஒழுங்குபடுத்தப்பட்டவுடன், நீங்கள் அதற்கு ஒரு க்ளஸ்டர் ஐடி ஒதுக்குகிறீர்கள், மேலும் இந்த தொழில்நுட்பம் ஒரு தரவுத்தொகுப்பின் தனியுரிமையைப் பாதுகாக்க உதவுகிறது; நீங்கள் குழுவின் மற்ற வெளிப்படையான அடையாள தரவுகளால் அல்லாமல், ஒரு தரவுப் புள்ளியை அதன் க்ளஸ்டர் ஐடியால் குறிப்பிடலாம். க்ளஸ்டர் ஐடியை குறிப்பிடுவதற்கான மற்ற காரணங்களை நீங்கள் யோசிக்க முடியுமா?\n",
|
|
"\n",
|
|
"### க்ளஸ்டரிங் தொடங்குதல்\n",
|
|
"\n",
|
|
"> 🎓 க்ளஸ்டர்களை உருவாக்குவது எப்படி என்பது தரவுப் புள்ளிகளை குழுக்களாகச் சேர்க்கும் முறையைப் பொறுத்தது. சில சொற்களை விளக்கிப் பார்ப்போம்:\n",
|
|
">\n",
|
|
"> 🎓 ['Transductive' vs. 'inductive'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
|
|
">\n",
|
|
"> Transductive inference என்பது குறிப்பிட்ட சோதனை வழக்குகளுக்கு பொருந்தும் பயிற்சி வழக்குகளிலிருந்து பெறப்படுகிறது. Inductive inference என்பது பொதுவான விதிகளை உருவாக்க பயிற்சி வழக்குகளிலிருந்து பெறப்படுகிறது, பின்னர் அவை சோதனை வழக்குகளுக்கு மட்டுமே பொருந்தும்.\n",
|
|
">\n",
|
|
"> ஒரு உதாரணம்: நீங்கள் ஒரு பகுதி லேபிள் செய்யப்பட்ட தரவுத்தொகுப்பை வைத்திருக்கிறீர்கள் என்று கற்பனை செய்யுங்கள். சில பொருட்கள் 'records', சில 'cds', மற்றும் சில வெறுமையாக உள்ளன. வெறுமையானவற்றுக்கு லேபிள்களை வழங்குவது உங்கள் வேலை. நீங்கள் ஒரு inductive அணுகுமுறையைத் தேர்ந்தெடுத்தால், 'records' மற்றும் 'cds' ஐத் தேடும் ஒரு மாதிரியைப் பயிற்சி செய்து, உங்கள் லேபிள் செய்யப்படாத தரவுக்கு அந்த லேபிள்களைப் பயன்படுத்துவீர்கள். இந்த அணுகுமுறை உண்மையில் 'cassettes' ஆக இருக்கும் பொருட்களை வகைப்படுத்துவதில் சிக்கல்களை சந்திக்கும். மற்றொரு பக்கம், transductive அணுகுமுறை இந்த தெரியாத தரவுகளை மேலும் திறமையாக கையாளுகிறது, ஏனெனில் இது ஒரே மாதிரியான பொருட்களை ஒன்றாகக் குழுமமாக்க முயற்சித்து, பின்னர் ஒரு குழுவுக்கு ஒரு லேபிளை வழங்குகிறது. இந்த வழக்கில், க்ளஸ்டர்கள் 'round musical things' மற்றும் 'square musical things' ஆகியவற்றை பிரதிபலிக்கலாம்.\n",
|
|
">\n",
|
|
"> 🎓 ['Non-flat' vs. 'flat' geometry](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
|
|
">\n",
|
|
"> கணிதவியல் சொற்களிலிருந்து பெறப்பட்ட 'non-flat' மற்றும் 'flat' geometry என்பது புள்ளிகளுக்கிடையிலான தூரத்தை 'flat' ([Euclidean](https://wikipedia.org/wiki/Euclidean_geometry)) அல்லது 'non-flat' (non-Euclidean) கணிதவியல் முறைகளால் அளவிடுவது.\n",
|
|
">\n",
|
|
"> 'Flat' என்பது இங்கு Euclidean geometry (இதில் சில 'plane' geometry எனக் கற்பிக்கப்படுகிறது) மற்றும் 'non-flat' என்பது non-Euclidean geometry. கணிதவியல் மற்றும் இயந்திர கற்றல் என்ன தொடர்பு? கணிதவியல் அடிப்படையில் இரு துறைகளாக, க்ளஸ்டர்களில் புள்ளிகளுக்கிடையிலான தூரத்தை அளவிட ஒரு பொதுவான வழி இருக்க வேண்டும், மேலும் தரவின் தன்மையைப் பொறுத்து அதை 'flat' அல்லது 'non-flat' முறையில் செய்யலாம். [Euclidean distances](https://wikipedia.org/wiki/Euclidean_distance) என்பது இரண்டு புள்ளிகளுக்கிடையிலான கோடு பகுதியின் நீளமாக அளவிடப்படுகிறது. [Non-Euclidean distances](https://wikipedia.org/wiki/Non-Euclidean_geometry) ஒரு வளைவின் வழியாக அளவிடப்படுகிறது. உங்கள் தரவுகள், காட்சிப்படுத்தப்பட்டவுடன், ஒரு தளத்தில் இல்லை என்று தோன்றினால், அதை கையாள ஒரு சிறப்பு الگாரிதத்தைப் பயன்படுத்த வேண்டும்.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/ta/flat-nonflat.d1c8c6e2a96110c1.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>தசானி மடிபல்லி உருவாக்கிய தகவல் வரைபடம்</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"> 🎓 ['Distances'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
|
|
">\n",
|
|
"> க்ளஸ்டர்கள் தங்கள் தூர மேட்ரிக்ஸ் மூலம் வரையறுக்கப்படுகின்றன, உதாரணமாக புள்ளிகளுக்கிடையிலான தூரங்கள். இந்த தூரம் சில வழிகளில் அளவிடப்படலாம். Euclidean க்ளஸ்டர்கள் புள்ளி மதிப்புகளின் சராசரியால் வரையறுக்கப்படுகின்றன, மேலும் 'centroid' அல்லது மைய புள்ளி கொண்டுள்ளன. தூரங்கள் அந்த centroid க்கு தூரத்தால் அளவிடப்படுகின்றன. Non-Euclidean தூரங்கள் 'clustroids' ஐ குறிப்பிடுகின்றன, மற்ற புள்ளிகளுக்கு மிக அருகிலுள்ள புள்ளி. Clustroids பல வழிகளில் வரையறுக்கப்படலாம்.\n",
|
|
">\n",
|
|
"> 🎓 ['Constrained'](https://wikipedia.org/wiki/Constrained_clustering)\n",
|
|
">\n",
|
|
"> [Constrained Clustering](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) இந்த அன்சூப்பர்வைஸ்டு முறையில் 'semi-supervised' கற்றலை அறிமுகப்படுத்துகிறது. புள்ளிகளுக்கிடையிலான உறவுகள் 'cannot link' அல்லது 'must-link' எனக் குறிக்கப்படுகின்றன, எனவே சில விதிகள் தரவுத்தொகுப்பில் கட்டாயமாக்கப்படுகின்றன.\n",
|
|
">\n",
|
|
"> ஒரு உதாரணம்: ஒரு الگாரிதம் லேபிள் செய்யப்படாத அல்லது பகுதி லேபிள் செய்யப்பட்ட தரவின் தொகுப்பில் விடப்பட்டால், அது உருவாக்கும் க்ளஸ்டர்கள் தரமற்றதாக இருக்கலாம். மேலே உள்ள உதாரணத்தில், க்ளஸ்டர்கள் 'round music things', 'square music things', 'triangular things', மற்றும் 'cookies' ஆகியவற்றை குழுமமாக்கலாம். சில கட்டுப்பாடுகள் அல்லது விதிகளை பின்பற்ற (\"பொருள் பிளாஸ்டிக் ஆக இருக்க வேண்டும்\", \"பொருள் இசை உருவாக்க முடியும்\") கொடுக்கப்பட்டால், இது الگாரிதம் சிறந்த தேர்வுகளைச் செய்ய உதவுகிறது.\n",
|
|
">\n",
|
|
"> 🎓 'Density'\n",
|
|
">\n",
|
|
"> 'சத்தம்' நிறைந்த தரவுகள் 'dense' எனக் கருதப்படுகின்றன. அதன் ஒவ்வொரு க்ளஸ்டரின் புள்ளிகளுக்கிடையிலான தூரங்கள், ஆய்வின் போது, மேலும் அல்லது குறைவாக அடர்த்தியாக இருக்கலாம், அல்லது 'crowded' ஆக இருக்கலாம், எனவே இந்த தரவுகளை சரியான க்ளஸ்டரிங் முறையுடன் பகுப்பாய்வு செய்ய வேண்டும். [இந்த கட்டுரை](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) uneven cluster density கொண்ட சத்தமுள்ள தரவுத்தொகுப்பை ஆராய K-Means clustering மற்றும் HDBSCAN الگாரிதங்களைப் பயன்படுத்துவதற்கான வேறுபாட்டை விளக்குகிறது.\n",
|
|
"\n",
|
|
"க்ளஸ்டரிங் தொழில்நுட்பங்களைப் பற்றிய உங்கள் புரிதலை [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) இல் ஆழமாக்கவும்.\n",
|
|
"\n",
|
|
"### **க்ளஸ்டரிங் الگாரிதங்கள்**\n",
|
|
"\n",
|
|
"100 க்கும் மேற்பட்ட க்ளஸ்டரிங் الگாரிதங்கள் உள்ளன, மேலும் அவற்றின் பயன்பாடு தரவின் தன்மையைப் பொறுத்தது. முக்கியமான சிலவற்றைப் பற்றி விவாதிப்போம்:\n",
|
|
"\n",
|
|
"- **Hierarchical clustering**. ஒரு பொருள் அருகிலுள்ள பொருளின் அருகாமையில் வகைப்படுத்தப்பட்டால், தொலைவில் உள்ள ஒன்றுக்கு மாறாக, க்ளஸ்டர்கள் அதன் உறுப்பினர்களின் மற்ற பொருட்களுக்கான தூரத்தை அடிப்படையாகக் கொண்டு உருவாக்கப்படுகின்றன. Hierarchical clustering இரண்டு க்ளஸ்டர்களை மீண்டும் மீண்டும் இணைப்பதன் மூலம் வரையறுக்கப்படுகிறது.\n",
|
|
"\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/ta/hierarchical.bf59403aa43c8c47.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>தசானி மடிபல்லி உருவாக்கிய தகவல் வரைபடம்</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"- **Centroid clustering**. இந்த பிரபல الگாரிதம் 'k', அல்லது உருவாக்க வேண்டிய க்ளஸ்டர்களின் எண்ணிக்கையைத் தேர்ந்தெடுக்க வேண்டும், அதன் பிறகு الگாரிதம் ஒரு க்ளஸ்டரின் மைய புள்ளியைத் தீர்மானித்து, அந்த புள்ளியைச் சுற்றி தரவுகளைச் சேர்க்கிறது. [K-means clustering](https://wikipedia.org/wiki/K-means_clustering) என்பது Centroid clustering இன் பிரபலமான பதிப்பு, இது ஒரு தரவுத்தொகுப்பை முன்பே வரையறுக்கப்பட்ட K குழுக்களாகப் பிரிக்கிறது. மையம் அருகிலுள்ள சராசரியால் தீர்மானிக்கப்படுகிறது, எனவே பெயர். க்ளஸ்டரிலிருந்து சதுர தூரம் குறைக்கப்படுகிறது.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../../../../../translated_images/ta/centroid.097fde836cf6c918.webp\"\n",
|
|
" width=\"600\"/>\n",
|
|
" <figcaption>தசானி மடிபல்லி உருவாக்கிய தகவல் வரைபடம்</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"- **Distribution-based clustering**. புள்ளி ஒரு க்ளஸ்டருக்கு சொந்தமான சாத்தியக்கூறுகளைத் தீர்மானிக்க, மற்றும் அதற்கேற்ப ஒதுக்குவதில் புள்ளி மையமாகக் கொண்டுள்ள புள்ளி மையமாகக் கொண்டுள்ளது. Gaussian mixture முறைகள் இந்த வகையைச் சேர்ந்தவை.\n",
|
|
"\n",
|
|
"- **Density-based clustering**. தரவுப் புள்ளிகள் தங்கள் அடர்த்தியை அடிப்படையாகக் கொண்டு, அல்லது ஒருவருக்கொன்று சுற்றி குழுமமாக ஒதுக்கப்படுகின்றன. குழுவிலிருந்து தொலைவில் உள்ள தரவுப் புள்ளிகள் outliers அல்லது noise ஆகக் கருதப்படுகின்றன. DBSCAN, Mean-shift மற்றும் OPTICS இந்த வகை க்ளஸ்டரிங்கிற்கு சொந்தமானவை.\n",
|
|
"\n",
|
|
"- **Grid-based clustering**. பல-பரிமாண தரவுத்தொகுப்புகளுக்கு, ஒரு grid உருவாக்கப்படுகிறது, மேலும் தரவுகள் grid இன் செல்களில் பிரிக்கப்படுகின்றன, இதனால் க்ளஸ்டர்கள் உருவாக்கப்படுகின்றன.\n",
|
|
"\n",
|
|
"க்ளஸ்டரிங் பற்றி அறிய சிறந்த வழி அதை நீங்கள் நேரடியாக முயற்சிப்பதே, அதுதான் நீங்கள் இந்த பயிற்சியில் செய்யப் போகிறீர்கள்.\n",
|
|
"\n",
|
|
"இந்த மாடுலை முடிக்க சில packages தேவைப்படும். அவற்றை `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))` என நிறுவலாம்.\n",
|
|
"\n",
|
|
"மாற்றாக, கீழே உள்ள ஸ்கிரிப்ட் இந்த மாடுலை முடிக்க தேவையான packages உங்களிடம் உள்ளதா என்பதைச் சரிபார்க்கிறது, மற்றும் சில packages இல்லையெனில் அவற்றை உங்களுக்காக நிறுவுகிறது.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
|
|
"\r\n",
|
|
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## பயிற்சி - உங்கள் தரவுகளை குழுவாக்குங்கள்\n",
|
|
"\n",
|
|
"குழுவாக்கும் ஒரு நுட்பமாக, சரியான காட்சிப்படுத்தலால் பெரிதும் உதவப்படுகிறது, எனவே நம்முடைய இசை தரவுகளை காட்சிப்படுத்துவதால் தொடங்குவோம். இந்த பயிற்சி, இந்த தரவின் தன்மைக்கு எந்த குழுவாக்கும் முறையை மிகவும் பயனுள்ளதாக பயன்படுத்தலாம் என்பதை தீர்மானிக்க உதவும்.\n",
|
|
"\n",
|
|
"தரவை இறக்குமதி செய்வதன் மூலம் தொடங்குவோம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Load the core tidyverse and make it available in your current R session\r\n",
|
|
"library(tidyverse)\r\n",
|
|
"\r\n",
|
|
"# Import the data into a tibble\r\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
|
|
"\r\n",
|
|
"# View the first 5 rows of the data set\r\n",
|
|
"df %>% \r\n",
|
|
" slice_head(n = 5)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"சில நேரங்களில், நமது தரவின் மீது மேலும் சில தகவல்களை அறிய விரும்பலாம். `data` மற்றும் `அதன் அமைப்பு` பற்றி அறிய [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) செயல்பாட்டைப் பயன்படுத்தி பார்க்கலாம்:\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Glimpse into the data set\r\n",
|
|
"df %>% \r\n",
|
|
" glimpse()\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"நன்றாக செய்தீர்கள்!💪\n",
|
|
"\n",
|
|
"`glimpse()` மூலம், வரிசைகளின் (கண்காணிப்புகள்) மொத்த எண்ணிக்கையும் நெடுவரிசைகளின் (மாறிகள்) எண்ணிக்கையும், பின்னர் ஒவ்வொரு மாறியின் பெயருக்குப் பிறகு வரிசையில் உள்ள சில ஆரம்ப உள்ளீடுகளையும் காணலாம். கூடுதலாக, மாறியின் *தரவுத் வகை* ஒவ்வொரு மாறியின் பெயருக்குப் பிறகும் `< >` உள்ளே கொடுக்கப்படும்.\n",
|
|
"\n",
|
|
"`DataExplorer::introduce()` இந்த தகவலை அழகாக சுருக்கமாகக் கொடுக்க முடியும்:\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Describe basic information for our data\r\n",
|
|
"df %>% \r\n",
|
|
" introduce()\r\n",
|
|
"\r\n",
|
|
"# A visual display of the same\r\n",
|
|
"df %>% \r\n",
|
|
" plot_intro()\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"அற்புதம்! நமது தரவுகளில் எந்தவிதமான பிழைகள் இல்லை என்பதை நாம் இப்போது கற்றுக்கொண்டோம்.\n",
|
|
"\n",
|
|
"இதற்கிடையில், பொதுவான மையப் புள்ளி புள்ளிவிவரங்களை (எ.கா [சராசரி](https://en.wikipedia.org/wiki/Arithmetic_mean) மற்றும் [மத்திய மதிப்பு](https://en.wikipedia.org/wiki/Median)) மற்றும் பரவலின் அளவுகளை (எ.கா [தரநிலை சிதறல்](https://en.wikipedia.org/wiki/Standard_deviation)) `summarytools::descr()` பயன்படுத்தி ஆராயலாம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Describe common statistics\r\n",
|
|
"df %>% \r\n",
|
|
" descr(stats = \"common\")\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"மொத்த தரவின் பொதுவான மதிப்புகளைப் பார்ப்போம். `0` என்ற பிரபலத்தன்மை மதிப்பை கவனிக்கவும், இது எந்த தரவரிசையும் இல்லாத பாடல்களை காட்டுகிறது. அவற்றை விரைவில் நீக்குவோம்.\n",
|
|
"\n",
|
|
"> 🤔 நாம் லேபிள் தரவுகளை தேவையற்ற, கண்காணிக்கப்படாத முறையான க்ளஸ்டரிங் முறையுடன் வேலை செய்கிறோம் என்றால், ஏன் இந்த தரவுகளை லேபிள்களுடன் காட்டுகிறோம்? தரவுகளை ஆராயும் கட்டத்தில், அவை பயனுள்ளதாக இருக்கும், ஆனால் க்ளஸ்டரிங் அல்காரிதம்கள் செயல்பட அவசியமில்லை.\n",
|
|
"\n",
|
|
"### 1. பிரபலமான இசை வகைகளை ஆராயுங்கள்\n",
|
|
"\n",
|
|
"இசை வகைகள் 🎶 எவ்வளவு பிரபலமானவை என்பதை கண்டறிய, அவை எத்தனை முறை தோன்றுகின்றன என்பதை எண்ணிப் பார்ப்போம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Popular genres\r\n",
|
|
"top_genres <- df %>% \r\n",
|
|
" count(artist_top_genre, sort = TRUE) %>% \r\n",
|
|
"# Encode to categorical and reorder the according to count\r\n",
|
|
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
|
|
"\r\n",
|
|
"# Print the top genres\r\n",
|
|
"top_genres\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"அது நன்றாக நடந்தது! ஒரு படம் ஒரு டேட்டா ஃப்ரேமின் ஆயிரம் வரிகளுக்கு சமம் என்று சொல்கிறார்கள் (உண்மையில் யாரும் அதைச் சொல்லவில்லை 😅). ஆனால் அதற்கான கருத்தை நீங்கள் புரிந்துகொள்கிறீர்கள், இல்லையா?\n",
|
|
"\n",
|
|
"கேட்டகோரிக்கல் டேட்டாவை (character அல்லது factor variables) காட்சிப்படுத்த ஒரு வழி barplots பயன்படுத்துவது. முதல் 10 ஜானர்களின் barplot ஒன்றை உருவாக்குவோம்:\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Change the default gray theme\r\n",
|
|
"theme_set(theme_light())\r\n",
|
|
"\r\n",
|
|
"# Visualize popular genres\r\n",
|
|
"top_genres %>%\r\n",
|
|
" slice(1:10) %>% \r\n",
|
|
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
|
" fill = artist_top_genre)) +\r\n",
|
|
" geom_col(alpha = 0.8) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
|
|
" ggtitle(\"Top genres\") +\r\n",
|
|
" theme(plot.title = element_text(hjust = 0.5),\r\n",
|
|
" # Rotates the X markers (so we can read them)\r\n",
|
|
" axis.text.x = element_text(angle = 90))\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"இப்போது `missing` வகைகள் உள்ளன என்பதை அடையாளம் காண்பது மிகவும் எளிதாகிவிட்டது 🧐!\n",
|
|
"\n",
|
|
"> ஒரு நல்ல காட்சிப்படுத்தல் நீங்கள் எதிர்பார்க்காத விஷயங்களை காட்டும், அல்லது தரவின் மீது புதிய கேள்விகளை எழுப்பும் - ஹாட்லி விக்ஹாம் மற்றும் கேரட் க்ரோல்மண்ட், [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
|
|
"\n",
|
|
"குறிப்பு, முக்கியமான வகை `Missing` என்று குறிப்பிடப்பட்டால், அதற்கு Spotify அதை வகைப்படுத்தவில்லை என்பதைக் குறிக்கிறது, எனவே அதை நீக்கிவிடலாம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Visualize popular genres\r\n",
|
|
"top_genres %>%\r\n",
|
|
" filter(artist_top_genre != \"Missing\") %>% \r\n",
|
|
" slice(1:10) %>% \r\n",
|
|
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
|
" fill = artist_top_genre)) +\r\n",
|
|
" geom_col(alpha = 0.8) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
|
|
" ggtitle(\"Top genres\") +\r\n",
|
|
" theme(plot.title = element_text(hjust = 0.5),\r\n",
|
|
" # Rotates the X markers (so we can read them)\r\n",
|
|
" axis.text.x = element_text(angle = 90))\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"சிறிய தரவுகள் ஆராய்ச்சியிலிருந்து, இந்த தரவுத்தொகுப்பில் மூன்று முக்கியமான இசை வகைகள் மேலோங்குகின்றன என்பதை அறிகிறோம். `afro dancehall`, `afropop`, மற்றும் `nigerian pop` ஆகியவற்றில் கவனம் செலுத்துவோம், மேலும் 0 பிரபலத்தன்மை மதிப்புடன் உள்ளவற்றை நீக்குவதற்காக தரவுத்தொகுப்பை வடிகட்டுவோம் (அதாவது, அவை தரவுத்தொகுப்பில் பிரபலத்தன்மை மூலம் வகைப்படுத்தப்படவில்லை மற்றும் எங்கள் நோக்கங்களுக்கு சத்தமாகக் கருதப்படலாம்):\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"nigerian_songs <- df %>% \r\n",
|
|
" # Concentrate on top 3 genres\r\n",
|
|
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
|
|
" # Remove unclassified observations\r\n",
|
|
" filter(popularity != 0)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Visualize popular genres\r\n",
|
|
"nigerian_songs %>%\r\n",
|
|
" count(artist_top_genre) %>%\r\n",
|
|
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
|
|
" fill = artist_top_genre)) +\r\n",
|
|
" geom_col(alpha = 0.8) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
|
|
" ggtitle(\"Top genres\") +\r\n",
|
|
" theme(plot.title = element_text(hjust = 0.5))\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"எங்கள் தரவுத்தொகுப்பில் எண் மாறிலிகளுக்கிடையில் எந்த வெளிப்படையான நேரியல் தொடர்பு உள்ளதா என்பதை பார்க்கலாம். இந்த தொடர்பு கணித ரீதியாக [கொரிலேஷன் புள்ளிவிவரம்](https://en.wikipedia.org/wiki/Correlation) மூலம் அளவிடப்படுகிறது.\n",
|
|
"\n",
|
|
"கொரிலேஷன் புள்ளிவிவரம் -1 மற்றும் 1 இடையே உள்ள ஒரு மதிப்பாகும், இது ஒரு தொடர்பின் வலிமையை குறிக்கிறது. 0-க்கு மேல் உள்ள மதிப்புகள் *நேர்மறை* தொடர்பை குறிக்கின்றன (ஒரு மாறிலியின் உயர்ந்த மதிப்புகள் மற்றொன்றின் உயர்ந்த மதிப்புகளுடன் இணைந்து காணப்படும்), அதே நேரத்தில் 0-க்கு கீழே உள்ள மதிப்புகள் *எதிர்மறை* தொடர்பை குறிக்கின்றன (ஒரு மாறிலியின் உயர்ந்த மதிப்புகள் மற்றொன்றின் குறைந்த மதிப்புகளுடன் இணைந்து காணப்படும்).\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Narrow down to numeric variables and fid correlation\r\n",
|
|
"corr_mat <- nigerian_songs %>% \r\n",
|
|
" select(where(is.numeric)) %>% \r\n",
|
|
" cor()\r\n",
|
|
"\r\n",
|
|
"# Visualize correlation matrix\r\n",
|
|
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"தரவு `energy` மற்றும் `loudness` இடையே மட்டுமே வலுவான தொடர்பு கொண்டுள்ளது, இது பொருத்தமாக உள்ளது, ஏனெனில் சத்தமான இசை பொதுவாக மிகவும் ஆற்றல்மிக்கதாக இருக்கும். `Popularity` மற்றும் `release date` இடையே ஒரு தொடர்பு உள்ளது, இது பொருத்தமாக உள்ளது, ஏனெனில் சமீபத்திய பாடல்கள் அதிகமாக பிரபலமாக இருக்க வாய்ப்பு உள்ளது. நீளம் மற்றும் ஆற்றல் இடையே ஒரு தொடர்பு இருப்பது போலவும் தெரிகிறது.\n",
|
|
"\n",
|
|
"இந்த தரவின் அடிப்படையில் ஒரு குழுவாக்க الگوریتم் என்ன முடிவுகளை எடுக்க முடியும் என்பதை காண 흥미로운தாக இருக்கும்!\n",
|
|
"\n",
|
|
"> 🎓 கவனிக்கவும், தொடர்பு காரணத்தை குறிக்காது! நமக்கு தொடர்பு இருப்பதற்கான சான்று உள்ளது, ஆனால் காரணத்திற்கான சான்று இல்லை. [ஒரு சுவாரஸ்யமான வலைத்தளம்](https://tylervigen.com/spurious-correlations) இந்தக் கருத்தை வலியுறுத்தும் காட்சிகளை வழங்குகிறது.\n",
|
|
"\n",
|
|
"### 2. தரவின் பகிர்வு ஆராயுங்கள்\n",
|
|
"\n",
|
|
"சில நுண்ணிய கேள்விகளை கேட்போம். பிரபலத்தன்மையின் அடிப்படையில், அவர்களின் நடனத்தன்மை பற்றிய பார்வையில் ஜானர்கள் குறிப்பிடத்தகுந்த வித்தியாசம் கொண்டுள்ளனவா? [density plots](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) பயன்படுத்தி, x மற்றும் y அச்சில், நமது மூன்று முக்கியமான ஜானர்களின் பிரபலத்தன்மை மற்றும் நடனத்தன்மை தரவின் பகிர்வை ஆராய்வோம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Perform 2D kernel density estimation\r\n",
|
|
"density_estimate_2d <- nigerian_songs %>% \r\n",
|
|
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
|
|
" geom_density_2d(bins = 5, size = 1) +\r\n",
|
|
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
|
" xlim(-20, 80) +\r\n",
|
|
" ylim(0, 1.2)\r\n",
|
|
"\r\n",
|
|
"# Density plot based on the popularity\r\n",
|
|
"density_estimate_pop <- nigerian_songs %>% \r\n",
|
|
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
|
|
" geom_density(size = 1, alpha = 0.5) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
|
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
|
" theme(legend.position = \"none\")\r\n",
|
|
"\r\n",
|
|
"# Density plot based on the danceability\r\n",
|
|
"density_estimate_dance <- nigerian_songs %>% \r\n",
|
|
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
|
|
" geom_density(size = 1, alpha = 0.5) +\r\n",
|
|
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
|
|
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Patch everything together\r\n",
|
|
"library(patchwork)\r\n",
|
|
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"நாம் பார்க்கிறோம், எந்த வகை இருந்தாலும், ஒரே மையத்தில் உள்ள வட்டங்கள் ஒழுங்காக அமைந்துள்ளன. இந்த வகைக்கு நைஜீரியர்களின் விருப்பங்கள் ஒரு குறிப்பிட்ட நடனத்திறனில் ஒருங்கிணைக்கப்படுகிறதா?\n",
|
|
"\n",
|
|
"பொதுவாக, இந்த மூன்று வகைகள் தங்கள் பிரபலத்திலும் நடனத்திறனிலும் ஒத்துப்போகின்றன. இந்த சற்றே ஒழுங்கற்ற தரவுகளில் குழுக்களை கண்டறிவது ஒரு சவாலாக இருக்கும். ஒரு சிதறல் வரைபடம் இதை ஆதரிக்குமா என்று பார்ப்போம்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# A scatter plot of popularity and danceability\r\n",
|
|
"scatter_plot <- nigerian_songs %>% \r\n",
|
|
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
|
|
" geom_point(size = 2, alpha = 0.8) +\r\n",
|
|
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
|
|
"\r\n",
|
|
"# Add a touch of interactivity\r\n",
|
|
"ggplotly(scatter_plot)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"ஒரே அச்சுகளில் ஒரு சிதறல் வரைபடம் ஒரே மாதிரியான ஒருங்கிணைப்பு முறைமையை காட்டுகிறது.\n",
|
|
"\n",
|
|
"பொதுவாக, குழுக்களை உருவாக்குவதற்காக, சிதறல் வரைபடங்களை பயன்படுத்தி தரவின் குழுக்களை காட்டலாம், எனவே இந்த வகையான காட்சிப்படுத்தலை கற்றுக்கொள்வது மிகவும் பயனுள்ளதாக இருக்கும். அடுத்த பாடத்தில், இந்த வடிகட்டப்பட்ட தரவுகளை எடுத்து, k-means குழுக்களை பயன்படுத்தி, இந்த தரவுகளில் சுவாரஸ்யமான முறையில் ஒட்டுமொத்தமாக இருக்கும் குழுக்களை கண்டறிவோம்.\n",
|
|
"\n",
|
|
"## **🚀 சவால்**\n",
|
|
"\n",
|
|
"அடுத்த பாடத்திற்கான தயாரிப்பாக, உற்பத்தி சூழலில் நீங்கள் கண்டறியக்கூடிய மற்றும் பயன்படுத்தக்கூடிய பல்வேறு குழு முறைமைகள் பற்றிய ஒரு வரைபடத்தை உருவாக்குங்கள். குழு முறைமைகள் எந்தவிதமான பிரச்சினைகளை தீர்க்க முயல்கின்றன?\n",
|
|
"\n",
|
|
"## [**பாடத்திற்குப் பிந்தைய வினாடி வினா**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
|
|
"\n",
|
|
"## **மறுஆய்வு & சுயபடிப்பு**\n",
|
|
"\n",
|
|
"நாம் கற்றுக்கொண்டது போல, குழு முறைமைகளை பயன்படுத்துவதற்கு முன், உங்கள் தரவுத்தொகுப்பின் தன்மையை புரிந்துகொள்வது நல்லது. இந்த தலைப்பைப் பற்றி மேலும் படிக்க [இங்கே](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) சென்று பாருங்கள்.\n",
|
|
"\n",
|
|
"குழு முறைமைகள் பற்றிய உங்கள் அறிவை ஆழமாக்குங்கள்:\n",
|
|
"\n",
|
|
"- [Tidymodels மற்றும் நண்பர்களை பயன்படுத்தி குழு மாதிரிகளை பயிற்சி செய்து மதிப்பீடு செய்யுங்கள்](https://rpubs.com/eR_ic/clustering)\n",
|
|
"\n",
|
|
"- பிராட்லி போஹ்ம்கே & பிராண்டன் கிரீன்வெல், [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
|
|
"\n",
|
|
"## **பணி**\n",
|
|
"\n",
|
|
"[குழு முறைமைகளுக்கான பிற காட்சிகளை ஆராயுங்கள்](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
|
|
"\n",
|
|
"## நன்றி:\n",
|
|
"\n",
|
|
"[ஜென் லூப்பர்](https://www.twitter.com/jenlooper) இந்த தொகுதியின் அசல் Python பதிப்பை உருவாக்கியதற்காக ♥️\n",
|
|
"\n",
|
|
"[`தசானி மடிபள்ளி`](https://twitter.com/dasani_decoded) இயந்திர கற்றல் கருத்துக்களை மேலும் விளக்கமாகவும் எளிதாகவும் புரிந்துகொள்ள உதவும் அற்புதமான விளக்கப்படங்களை உருவாக்கியதற்காக.\n",
|
|
"\n",
|
|
"மகிழ்ச்சியான கற்றல்,\n",
|
|
"\n",
|
|
"[எரிக்](https://twitter.com/ericntay), கோல்ட் மைக்ரோசாஃப்ட் லெர்ன் ஸ்டூடன்ட் அம்பாசடர்.\n"
|
|
],
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**குறிப்பு**: \nஇந்த ஆவணம் [Co-op Translator](https://github.com/Azure/co-op-translator) என்ற AI மொழிபெயர்ப்பு சேவையைப் பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கின்றோம், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கக்கூடும் என்பதை தயவுசெய்து கவனத்தில் கொள்ளுங்கள். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல.\n"
|
|
]
|
|
}
|
|
],
|
|
"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"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "99c36449cad3708a435f6798cfa39972",
|
|
"translation_date": "2025-10-11T12:40:33+00:00",
|
|
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
|
|
"language_code": "ta"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
} |