# Увод у кластеризацију Кластеризација је врста [ненадзирано учење](https://wikipedia.org/wiki/Unsupervised_learning) која претпоставља да је скуп података без ознака или да његови уноси нису повезани са унапред дефинисаним излазима. Користи различите алгоритме за сортирање неозначених података и обезбеђује груписања према обрасцима које уочава у подацима. [![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") > 🎥 Кликните на слику горе за видео. Док учите машинско учење са кластеризацијом, уживајте у неким Нигеријским Dance Hall траковима - ово је високо оцењена песма из 2014. од PSquare. ## [Квиз пре предавања](https://ff-quizzes.netlify.app/en/ml/) ### Увод [Кластеризација](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) је веома корисна за истраживање података. Хајде да видимо да ли може да помогне у откривању трендова и образаца у томе како нигеријска публика конзумира музику. ✅ Одвојите минут да размислите о употребама кластеризације. У стварном животу, кластеризација се дешава кад год имате гомилу веша и потребно је да распоредите одећу по члановима породице 🧦👕👖🩲. У науци о подацима, кластеризација се дешава када се покушава анализирати корисничке преференције или одредити карактеристике било ког неозначеног скупа података. Кластеризација, на неки начин, помаже да се из хаоса направи ред, као фиока са чарапама. [![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") > 🎥 Кликните на слику горе за видео: Џон Гатаг са MIT-а представља кластеризацију У професионалном окружењу, кластеризација се може користити за одређивање ствари као што је сегментација тржишта, одређивање који узрасни групи купује које артикле, на пример. Друга употреба била би детекција аномалија, можда за откривање превара на скупу података трансакција кредитном картицом. Или бисте могли користити кластеризацију да одредите туморе у низу медицинских снимака. ✅ Размислите минут о томе како сте можда срели кластеризацију „у дивљини“, у банкарству, е-трговини или пословном окружењу. > 🎓 Интересантно, анализа кластера потекла је из поља антропологије и психологије 1930-их. Можете ли замислити како је могла бити коришћена? Алтернативно, могли бисте је користити за груписање резултата претраге - по линковима за куповину, сликама или рецензијама, на пример. Кластеризација је корисна када имате велики скуп података који желите да смањите и на коме желите извршити детаљнију анализу, тако да се техника може користити за упознавање података пре него што се конструишу други модели. ✅ Кад су ваши подаци организовани у кластерима, додељујете им идентификатор кластера, и ова техника може бити корисна за очување приватности скупа података; уместо тога, можете се позвати на тачку података по идентитету кластера, а не по препознатљивим подацима. Можете ли смислити друге разлоге због којих бисте користили идентификатор кластера уместо других елемената кластера за његово идентификовање? Продубите своје разумевање техника кластеризације у овом [Learn модулу](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) ## Почетак са кластеризацијом [Scikit-learn нуди велики избор](https://scikit-learn.org/stable/modules/clustering.html) метода за извођење кластеризације. Тип који одаберете зависиће од вашег случаја употребе. Према документацији, свака метода има разне користи. Ево поједностављене табеле метода које Scikit-learn подржава и њихових одговарајућих случајева употребе: | Назив методе | Случај употребе | | :-------------------------- | :----------------------------------------------------------------- | | K-Means | за општу употребу, индуктивни | | Affinity propagation | много, неравномерни кластери, индуктивни | | Mean-shift | много, неравномерни кластери, индуктивни | | Spectral clustering | мало, равномерни кластери, трандуктивни | | Ward hierarchical clustering| много, ограничени кластери, трандуктивни | | Agglomerative clustering | много, ограничени, не-Еуклидова удаљеност, трандуктивни | | DBSCAN | неравна геометрија, неравномерни кластери, трандуктивни | | OPTICS | неравна геометрија, неравномерни кластери са варијабилном густином, трандуктивни | | Gaussian mixtures | равна геометрија, индуктивни | | BIRCH | велики скуп података са одступањима, индуктивни | > 🎓 Како правимо кластере има везе са тим како прикупљамо тачке података у групе. Хајде да разјаснимо неку терминологију: > > 🎓 ['Трандуктивно' vs. 'индуктивно'](https://wikipedia.org/wiki/Transduction_(machine_learning)) > > Трандуктивна инференција изведена је из посматраних тренинг случајева који се мапирају на специфичне тест случајеве. Индуктивна инференција произилази из тренинг случајева који се мапирају на општа правила која се тек онда примењују на тест случајеве. > > Пример: Замислите да имате скуп података који је само делимично означен. Неке ствари су "плоче", неке "цд-ови", а неке су празне. Ваш посао је да обезбедите ознаке за празне. Ако изаберете индуктивни приступ, тренирали бисте модел тражећи "плоче" и "цд-ове", и применили те ознаке на своје неозначене податке. Овај приступ ће имати потешкоће са класификацијом ствари које су заправо "касете". Трандуктивни приступ, с друге стране, ефикасније третира ове непознате податке јер ради на груписању сличних ставки заједно, а затим примењује ознаку на групу. У овом случају, кластери би могли одражавати "кругле музичке ствари" и "квадратне музичке ствари". > > 🎓 ['Неравна' vs. 'равна' геометрија](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) > > Изведено из математичке терминологије, неравна и равна геометрија односе се на мерење удаљености између тачака путем "равних" ([Еуклидових](https://wikipedia.org/wiki/Euclidean_geometry)) или "неравних" (не-Еуклидових) геометријских метода. > > "Равна" у овом контексту означава Еуклидову геометрију (делове које уче као "раван" геометрију), а неравна се односи на не-Еуклидову геометрију. Шта геометрија има са машинским учењем? Као два поља кореном у математици, мора постојати заједнички начин мерења удаљености између тачака у кластерима, и то може бити учињено "равним" или "неравним" начином, у зависности од природе података. [Еуклидске удаљености](https://wikipedia.org/wiki/Euclidean_distance) мере се као дужина линијског сегмента између две тачке. [Не-Еуклидске удаљености](https://wikipedia.org/wiki/Non-Euclidean_geometry) мере се дуж криве. Ако ваши подаци, када су визуелизовани, изгледају да не постоје у равни, можда ће вам бити потребан специјализовани алгоритам да их обради. > > ![Flat vs Nonflat Geometry Infographic](../../../../translated_images/sr/flat-nonflat.d1c8c6e2a96110c1.webp) > Инфографик од [Дасанa Мадипaлија](https://twitter.com/dasani_decoded) > > 🎓 ['Удаљености'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) > > Кластери су дефинисани својом матрицом удаљености, нпр. удаљеностима између тачака. Ова удаљеност може бити измерена на неколико начина. Еуклидски кластери су дефинисани просеком вредности тачака и садрже 'центроид' или централну тачку. Удаљености се тако мере као удаљеност од тог центроида. Не-Еуклидске удаљености се односе на 'кластроиде', тачку најближу другим тачкама. Кластроиди се могу дефинисати на различите начине. > > 🎓 ['Ограничена'](https://wikipedia.org/wiki/Constrained_clustering) > > [Ограничена кластеризација](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) уводи „полунадзирано“ учење у ову ненадзирану методу. Односи између тачака су означени као 'не сме се повезати' или 'мора да се повезује' тако да нека правила буду наметнута скупу података. > > Пример: Ако алгоритам буде пуштен на скуп неозначених или полуозначених података, кластеризација којој ће довести може бити лошег квалитета. У примеру горе, кластери би могли груписати 'кругле музичке ствари' и 'квадратне музичке ствари' и 'троугаоне ствари' и 'кексе'. Ако добије нека ограничења или правила ("ставка мора бити од пластике", "ставка треба да може да производи музику") ово може помоћи да се 'ограничи' алгоритам да прави боље изборе. > > 🎓 'Густина' > > Податке који су 'буцни' сматрају се 'густим'. Удаљености између тачака у сваком од њихових кластера могу се, на прегледу, показати као мање или више гушће, или 'гужваније' и зато је потребно да се подаци анализирају одговарајућом методом кластеризације. [Овај чланак](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) илуструје разлику између коришћења K-Means кластеризације и HDBSCAN алгоритама за истраживање бучних података са неравномерном густином кластера. ## Алгоритми кластеризације Постоји преко 100 алгоритама кластеризације, а њихова употреба зависи од природе података. Хајде да дискутујемо о неким од главних: - **Хијерархијска кластеризација**. Ако је објекат класификован по близини до оближњег објекта, а не удаљенијег, кластери се формирају на основу удаљености чланова једног од другог. Scikit-learn агломеративна кластеризација је хијерархијска. ![Hierarchical clustering Infographic](../../../../translated_images/sr/hierarchical.bf59403aa43c8c47.webp) > Инфографик од [Дасанa Мадипaлија](https://twitter.com/dasani_decoded) - **Кластеризација центроида**. Овај популаран алгоритам захтева избор 'k', односно броја кластера који треба формирати, након чега алгоритам одређује централну тачку кластера и сакупља податке око ње. [K-means кластеризација](https://wikipedia.org/wiki/K-means_clustering) је популаран облик кластеризације центроида. Центар се одређује по најближој средини, отуда и име. Квадратна удаљеност од кластера се минимизира. ![Centroid clustering Infographic](../../../../translated_images/sr/centroid.097fde836cf6c918.webp) > Инфографик од [Дасанa Мадипaлија](https://twitter.com/dasani_decoded) - **Расподелом заснована кластеризација**. Заснована на статистичком моделовању, ова кластеризација се фокусира на одређивање вероватноће да тачка података припада кластеру и одговарајуће јој је додељује. Гаусове мешавине припадају овој врсти. - **Густином заснована кластеризација**. Тачке података се додељују кластерима на основу њихове густине, односно њиховог груписања једних око других. Тачке података далеко од групе сматрају се одступањима или шумом. DBSCAN, Mean-shift и OPTICS припадају овом типу кластеризације. - **Mрешично заснована кластеризација**. За више-димензијске скупове података, креира се мрежа и подаци се деле између ћелија мреже, чиме се стварају кластери. ## Вежба - кластеризујте своје податке Кластеризација као техника је у великој мери олакшана правилном визуелизацијом, па хајде да почнемо са визуелизацијом наших музичких података. Ова вежба ће нам помоћи да одлучимо коју од метода кластеризације треба најделотворније користити за природу ових података. 1. Отворите фајл [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) у овом фолдеру. 1. Увезите пакет `Seaborn` за добру визуелизацију података. ```python !pip install seaborn ``` 1. Додатно учитајте податке о песмама из файла [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). Учитајте dataframe са неким подацима о песмама. Спремите се да истражите те податке увозом библиотека и исписом података: ```python import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("../data/nigerian-songs.csv") df.head() ``` Проверите првих неколико линија података: | | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | | --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- | | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | | 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | | 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | | 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | 1. Добити неке информације о dataframe-у позивајући `info()`: ```python df.info() ``` Излаз изгледа овако: ```output RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4+ KB ``` 1. Двоструко провери null вредности позивајући `isnull()` и провером да је сума 0: ```python df.isnull().sum() ``` Изгледа добро: ```output name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64 ``` 1. Описати податке: ```python df.describe() ``` | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | > 🤔 Ако радимо са кластеровањем, незадирљивом методом која не захтева означене податке, зашто показујемо ове податке са ознакама? У фази истраживања података оне су корисне, али нису неопходне за рад алгоритама кластеровања. Можете једноставно уклонити заглавља колона и позивати се на податке по броју колоне. Погледајте опште вредности података. Имајте у виду да популарност може бити '0', што показује песме које немају ранг. Ускоро ћемо те уклонити. 1. Користите барплот да сазнате који су најпопуларнији жанрови: ```python import seaborn as sns top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top[:5].index,y=top[:5].values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` ![најпопуларнији](../../../../translated_images/sr/popular.9c48d84b3386705f.webp) ✅ Ако желите видети више врхунских вредности, промијените горњих `[:5]` у већу вредност, или уклоните тај део да видите све. Обратите пажњу, када је најпопуларнији жанр описан као 'Пропуштено', то значи да га Spotify није класификовао, па се тога решавамо. 1. Уклонити пропуштене податке филтрирањем ```python df = df[df['artist_top_genre'] != 'Missing'] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` Сада поново проверите жанрове: ![најпопуларнији](../../../../translated_images/sr/all-genres.1d56ef06cefbfcd6.webp) 1. Три најпопуларнија жанра доминирају овим скупом података. Концентришимо се на `afro dancehall`, `afropop` и `nigerian pop`, уз додатно филтрирање података да уклонимо све са вредношћу 0 у популарности (што значи да нису класификоване по популарности у скупу података и могу се сматрати шумом за наше сврхе): ```python df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` 1. Направите брзи тест да видите да ли подаци корелирају на неки посебно јак начин: ```python corrmat = df.corr(numeric_only=True) f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True) ``` ![корелације](../../../../translated_images/sr/correlation.a9356bb798f5eea5.webp) Једина јака корелација је између `енергије` и `гласности`, што није изненађење с обзиром да је гласна музика обично прилично енергична. У осталом, корелације су релативно слабе. Биће занимљиво видети шта алгоритам кластеровања може извучи из ових података. > 🎓 Имајте на уму да корелација не имплицира узрочност! Имамо доказ о корелацији али не и доказ о узрочности. Један [забаван веб сајт](https://tylervigen.com/spurious-correlations) има неке визуеле који то наглашавају. Да ли постоји нека конвергенција у овом скупу података око перципиране популарности песме и играбилности? FacetGrid показује да постоје концентрични кругови који се уклапају, без обзира на жанр. Да ли је могуће да се нигеријски укуси конвергирају на одређеном нивоу играбилности за овај жанр? ✅ Испробајте различите тачке података (енергију, гласност, говорљивост) и више или другачије музичке жанрове. Шта можете открити? Погледајте табелу `df.describe()` да видите општи распоред података. ### Вежба - распоред података Да ли су ова три жанра значајно различита у перцепцији своје играбилности, засновано на њиховој популарности? 1. Испитајте распоред података за популарност и играбилност за наша три најбоља жанра дуж задате x и y осе. ```python sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", ) ``` Можете открити концентричне кругове око опште тачке конвергенције, показајући распоред тачака. > 🎓 Имајте на уму да овај пример користи KDE (Kernel Density Estimate) графикон који представља податке коришћењем континуиране криве вероватноће густине. Ово нам омогућава интерпретацију података када радимо са више расподела. Уопштено, три жанра се лабаво усклађују у смислу њихове популарности и играбилности. Одређивање кластера у овим лабаво усклађеним подацима биће изазов: ![распоред](../../../../translated_images/sr/distribution.9be11df42356ca95.webp) 1. Направите расејани дијаграм: ```python sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend() ``` Расејани дијаграм истих оса показује сличан образац конвергенције ![Facetgrid](../../../../translated_images/sr/facetgrid.9b2e65ce707eba1f.webp) Уопштено, за кластеровање можете користити расејане дијаграме за приказ кластера података, па је усавршавање ове врсте визуализације веома корисно. У наредном часу узети ћемо овај филтрирани скуп података и применити k-means кластеровање да откријемо групе у овим подацима које изгледају да се преплићу на занимљиве начине. --- ## 🚀Изазов У припреми за наредни час, направите графикон о различитим алгоритмима кластеровања које бисте могли открити и користити у продуктивном окружењу. Које врсте проблема кластеровање покушава да реши? ## [Квиз после предавања](https://ff-quizzes.netlify.app/en/ml/) ## Преглед и Самостални рад Пре него што примените алгоритме кластеровања, како смо научили, добро је разумети природу вашег скупа података. Прочитајте више о овој теми [овде](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) [Ова корисна артикулација](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) вас води кроз различите начине на које се понашају различити алгоритми кластеровања, у зависности од облика података. ## Задатак [Истражите друге визуализације за кластеровање](assignment.md) --- **Изјава о одрицању одговорности**: Овај документ је преведен коришћењем услуге за аутоматски превод [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, имајте у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални људски превод. Нисмо одговорни за било каква неспоразума или погрешна тумачења која произилазе из коришћења овог превода.