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/bg/5-Clustering/1-Visualize
leestott e4050807fb
🌐 Update translations via Co-op Translator
2 weeks ago
..
solution 🌐 Update translations via Co-op Translator 2 weeks ago
README.md 🌐 Update translations via Co-op Translator 2 weeks ago
assignment.md 🌐 Update translations via Co-op Translator 2 weeks ago
notebook.ipynb 🌐 Update translations via Co-op Translator 2 weeks ago

README.md

Въведение в клъстеризацията

Клъстеризацията е вид Обучение без надзор, което предполага, че даден набор от данни е без етикети или че входните данни не са свързани с предварително дефинирани изходи. Тя използва различни алгоритми, за да сортира данни без етикети и да предостави групировки според моделите, които открива в данните.

No One Like You by PSquare

🎥 Кликнете върху изображението по-горе за видео. Докато изучавате машинното обучение с клъстеризация, насладете се на някои нигерийски танцови парчета - това е високо оценена песен от 2014 г. на PSquare.

Тест преди лекцията

Въведение

Клъстеризацията е много полезна за изследване на данни. Нека видим дали може да помогне за откриване на тенденции и модели в начина, по който нигерийската аудитория консумира музика.

Отделете минута, за да помислите за приложенията на клъстеризацията. В реалния живот клъстеризацията се случва винаги, когато имате купчина пране и трябва да сортирате дрехите на членовете на семейството 🧦👕👖🩲. В науката за данни клъстеризацията се случва, когато се опитвате да анализирате предпочитанията на потребителите или да определите характеристиките на който и да е набор от данни без етикети. Клъстеризацията, по някакъв начин, помага да се внесе ред в хаоса, като например чекмедже за чорапи.

Introduction to ML

🎥 Кликнете върху изображението по-горе за видео: Джон Гуттаг от MIT представя клъстеризацията.

В професионална среда клъстеризацията може да се използва за определяне на неща като сегментация на пазара, например за определяне на възрастовите групи, които купуват определени продукти. Друго приложение би било откриването на аномалии, например за откриване на измами в набор от данни с транзакции с кредитни карти. Или може да използвате клъстеризация за определяне на тумори в група медицински сканирания.

Помислете за момент как може да сте срещали клъстеризация „в дивата природа“, в банковия сектор, електронната търговия или бизнес среда.

🎓 Интересно е, че анализът на клъстери произхожда от областите на антропологията и психологията през 1930-те години. Можете ли да си представите как е бил използван?

Алтернативно, можете да го използвате за групиране на резултати от търсене - например по връзки за пазаруване, изображения или ревюта. Клъстеризацията е полезна, когато имате голям набор от данни, който искате да намалите и върху който искате да извършите по-детайлен анализ, така че техниката може да се използва за изучаване на данни преди да се изградят други модели.

След като данните ви са организирани в клъстери, можете да им присвоите идентификатор на клъстер, и тази техника може да бъде полезна за запазване на поверителността на набора от данни; вместо това можете да се позовавате на точка от данни чрез нейния идентификатор на клъстер, а не чрез по-разкриващи идентифицируеми данни. Можете ли да се сетите за други причини, поради които бихте се позовали на идентификатор на клъстер, вместо на други елементи от клъстера, за да го идентифицирате?

Задълбочете разбирането си за техниките на клъстеризация в този учебен модул.

Започване с клъстеризация

Scikit-learn предлага голям набор от методи за извършване на клъстеризация. Типът, който изберете, ще зависи от вашия случай на употреба. Според документацията, всеки метод има различни предимства. Ето опростена таблица на методите, поддържани от Scikit-learn, и техните подходящи случаи на употреба:

Име на метода Случай на употреба
K-Means общо предназначение, индуктивен
Affinity propagation много, неравномерни клъстери, индуктивен
Mean-shift много, неравномерни клъстери, индуктивен
Spectral clustering малко, равномерни клъстери, трансдуктивен
Ward hierarchical clustering много, ограничени клъстери, трансдуктивен
Agglomerative clustering много, ограничени, неевклидови разстояния, трансдуктивен
DBSCAN неравна геометрия, неравномерни клъстери, трансдуктивен
OPTICS неравна геометрия, неравномерни клъстери с променлива плътност, трансдуктивен
Gaussian mixtures равна геометрия, индуктивен
BIRCH голям набор от данни с изключения, индуктивен

🎓 Как създаваме клъстери има много общо с начина, по който събираме точките от данни в групи. Нека разгледаме някои термини:

🎓 'Трансдуктивен' срещу 'индуктивен'

Трансдуктивното заключение се извежда от наблюдавани тренировъчни случаи, които се свързват със специфични тестови случаи. Индуктивното заключение се извежда от тренировъчни случаи, които се свързват с общи правила, които след това се прилагат към тестови случаи.

Пример: Представете си, че имате набор от данни, който е само частично етикетиран. Някои неща са „плочи“, някои „CD-та“, а някои са празни. Вашата задача е да предоставите етикети за празните. Ако изберете индуктивен подход, бихте обучили модел, който търси „плочи“ и „CD-та“, и бихте приложили тези етикети към неетикетираните данни. Този подход ще има проблеми с класифицирането на неща, които всъщност са „касети“. Трансдуктивният подход, от друга страна, се справя по-ефективно с тези неизвестни данни, тъй като работи за групиране на подобни елементи заедно и след това прилага етикет към групата. В този случай клъстерите може да отразяват „кръгли музикални неща“ и „квадратни музикални неща“.

🎓 'Неравна' срещу 'равна' геометрия

Произхождаща от математическата терминология, неравна срещу равна геометрия се отнася до измерването на разстоянията между точки чрез „равни“ (Евклидови) или „неравни“ (неевклидови) геометрични методи.

'Равна' в този контекст се отнася до Евклидова геометрия (части от която се преподават като „плоска“ геометрия), а неравна се отнася до неевклидова геометрия. Какво общо има геометрията с машинното обучение? Е, като две области, които са вкоренени в математиката, трябва да има общ начин за измерване на разстоянията между точки в клъстери, и това може да се направи по „равен“ или „неравен“ начин, в зависимост от естеството на данните. Евклидовите разстояния се измерват като дължината на сегмент от права линия между две точки. Неевклидовите разстояния се измерват по крива. Ако вашите данни, визуализирани, изглежда не съществуват на равнина, може да се наложи да използвате специализиран алгоритъм за обработка.

Flat vs Nonflat Geometry Infographic

Инфографика от Dasani Madipalli

🎓 'Разстояния'

Клъстерите се определят от тяхната матрица на разстояния, например разстоянията между точки. Това разстояние може да се измерва по няколко начина. Евклидовите клъстери се определят от средната стойност на точките и съдържат „центроид“ или централна точка. Разстоянията се измерват спрямо този центроид. Неевклидовите разстояния се отнасят до „клъстроиди“, точката, която е най-близо до другите точки. Клъстроидите от своя страна могат да бъдат дефинирани по различни начини.

🎓 'Ограничени'

Ограничената клъстеризация въвежда „полунадзорено“ обучение в този метод без надзор. Връзките между точките се маркират като „не може да се свърже“ или „трябва да се свърже“, така че някои правила се налагат върху набора от данни.

Пример: Ако алгоритъмът е оставен свободен върху група от неетикетирани или полуетикетирани данни, клъстерите, които произвежда, може да са с лошо качество. В горния пример клъстерите може да групират „кръгли музикални неща“, „квадратни музикални неща“, „триъгълни неща“ и „бисквити“. Ако се дадат някои ограничения или правила за следване („елементът трябва да е направен от пластмаса“, „елементът трябва да може да произвежда музика“), това може да помогне за „ограничаване“ на алгоритъма да прави по-добри избори.

🎓 'Плътност'

Данните, които са „шумни“, се считат за „плътни“. Разстоянията между точките във всеки от неговите клъстери може да се окажат, при разглеждане, повече или по-малко плътни, или „претъпкани“, и следователно тези данни трябва да бъдат анализирани с подходящия метод за клъстеризация. Тази статия демонстрира разликата между използването на K-Means клъстеризация и HDBSCAN алгоритми за изследване на шумен набор от данни с неравномерна плътност на клъстерите.

Алгоритми за клъстеризация

Съществуват над 100 алгоритма за клъстеризация, и тяхното използване зависи от естеството на данните. Нека обсъдим някои от основните:

  • Йерархична клъстеризация. Ако обект се класифицира според близостта му до близък обект, а не до по-далечен, клъстерите се формират въз основа на разстоянието на членовете им до и от други обекти. Агломеративната клъстеризация на Scikit-learn е йерархична.

    Hierarchical clustering Infographic

    Инфографика от Dasani Madipalli

  • Клъстеризация чрез центроид. Този популярен алгоритъм изисква избор на 'k', или броя на клъстерите, които да се формират, след което алгоритъмът определя централната точка на клъстера и събира данни около тази точка. K-means клъстеризацията е популярен вариант на клъстеризация чрез центроид. Центърът се определя от най-близката средна стойност, откъдето идва и името. Квадратното разстояние от клъстера се минимизира.

    Centroid clustering Infographic

    Инфографика от Dasani Madipalli

  • Клъстеризация, базирана на разпределение. Базирана на статистическо моделиране, клъстеризацията, базирана на разпределение, се фокусира върху определяне на вероятността дадена точка от данни да принадлежи към клъстер и я присвоява съответно. Методите на Гаусови смеси принадлежат към този тип.

  • Клъстеризация, базирана на плътност. Точките от данни се присвояват към клъстери въз основа на тяхната плътност или групиране около други точки. Точки от данни, които са далеч от групата, се считат за изключения или шум. DBSCAN, Mean-shift и OPTICS принадлежат към този тип клъстеризация.

  • Клъстеризация, базирана на решетка. За многомерни набори от данни се създава решетка и данните се разделят между клетките на решетката, като по този начин се създават клъстери.

Упражнение - клъстеризирайте вашите данни

Клъстеризацията като техника е значително подпомогната от правилната визуализация, така че нека започнем с визуализиране на нашите музикални данни. Това упражнение ще ни помогне да решим кой от методите за клъстеризация трябва да използваме най-ефективно за естеството на тези данни.

  1. Отворете файла notebook.ipynb в тази папка.

  2. Импортирайте пакета Seaborn за добра визуализация на данни.

    !pip install seaborn
    
  3. Добавете данните за песните от nigerian-songs.csv. Заредете dataframe с някои данни за песните. Подгответе се да изследвате тези данни, като импортирате библиотеките и изведете данните:

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.read_csv("../data/nigerian-songs.csv")
    df.head()
    

    Проверете първите няколко реда от данните:

    име албум изпълнител топ жанр на изпълнителя дата на издаване дължина популярност танцувалност акустичност енергия инструменталност живост сила на звука речевост темпо времеви подпис
    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 sh
    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
  4. Получете информация за датафрейма, като извикате info():

    df.info()
    

    Резултатът изглежда така:

    <class 'pandas.core.frame.DataFrame'>
    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
    
  5. Проверете за липсващи стойности, като извикате isnull() и се уверите, че сумата е 0:

    df.isnull().sum()
    

    Изглежда добре:

    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
    
  6. Описване на данните:

    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. Използвайте барплот, за да откриете най-популярните жанрове:

    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')
    

    most popular

Ако искате да видите повече топ стойности, променете top [:5] на по-голяма стойност или го премахнете, за да видите всички.

Забележете, когато топ жанрът е описан като „Missing“, това означава, че Spotify не го е класифицирал, така че нека го премахнем.

  1. Премахнете липсващите данни, като ги филтрирате:

    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')
    

    Сега проверете отново жанровете:

    most popular

  2. Трите водещи жанра доминират в този набор от данни. Нека се концентрираме върху afro dancehall, afropop и nigerian pop, като допълнително филтрираме набора от данни, за да премахнем всичко с 0 стойност на популярност (което означава, че не е класифицирано с популярност в набора от данни и може да се счита за шум за нашите цели):

    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')
    
  3. Направете бърз тест, за да видите дали данните корелират по някакъв особено силен начин:

    corrmat = df.corr(numeric_only=True)
    f, ax = plt.subplots(figsize=(12, 9))
    sns.heatmap(corrmat, vmax=.8, square=True)
    

    correlations

    Единствената силна корелация е между energy и loudness, което не е изненадващо, като се има предвид, че силната музика обикновено е доста енергична. В противен случай корелациите са сравнително слаби. Ще бъде интересно да видим какво може да направи алгоритъм за клъстериране с тези данни.

    🎓 Забележете, че корелацията не означава причинно-следствена връзка! Имаме доказателство за корелация, но нямаме доказателство за причинно-следствена връзка. Забавен уебсайт има визуализации, които подчертават тази точка.

Има ли някакво сближаване в този набор от данни около възприеманата популярност и танцувалност на песента? FacetGrid показва, че има концентрични кръгове, които се подреждат, независимо от жанра. Може ли да е така, че нигерийските вкусове се сближават на определено ниво на танцувалност за този жанр?

Опитайте различни точки от данни (енергия, сила на звука, речевост) и повече или различни музикални жанрове. Какво можете да откриете? Разгледайте таблицата df.describe(), за да видите общото разпределение на точките от данни.

Упражнение - разпределение на данните

Различават ли се значително тези три жанра по отношение на възприемането на тяхната танцувалност, въз основа на тяхната популярност?

  1. Изследвайте разпределението на данните за популярност и танцувалност на нашите три водещи жанра по дадена x и y ос.

    sns.set_theme(style="ticks")
    
    g = sns.jointplot(
        data=df,
        x="popularity", y="danceability", hue="artist_top_genre",
        kind="kde",
    )
    

    Можете да откриете концентрични кръгове около обща точка на сближаване, показващи разпределението на точките.

    🎓 Забележете, че този пример използва графика KDE (Kernel Density Estimate), която представя данните с помощта на непрекъсната крива на плътност на вероятността. Това ни позволява да интерпретираме данните, когато работим с множество разпределения.

    Като цяло трите жанра се подреждат свободно по отношение на тяхната популярност и танцувалност. Определянето на клъстери в тези свободно подредени данни ще бъде предизвикателство:

    distribution

  2. Създайте диаграма с точки:

    sns.FacetGrid(df, hue="artist_top_genre", height=5) \
       .map(plt.scatter, "popularity", "danceability") \
       .add_legend()
    

    Диаграма с точки на същите оси показва подобен модел на сближаване.

    Facetgrid

Като цяло, за клъстериране можете да използвате диаграми с точки, за да покажете клъстери от данни, така че овладяването на този тип визуализация е много полезно. В следващия урок ще вземем тези филтрирани данни и ще използваме клъстериране с k-средни стойности, за да открием групи в тези данни, които изглежда се припокриват по интересни начини.


🚀Предизвикателство

В подготовка за следващия урок, направете диаграма за различните алгоритми за клъстериране, които можете да откриете и използвате в производствена среда. Какви проблеми се опитва да реши клъстерирането?

Тест след лекцията

Преглед и самостоятелно обучение

Преди да приложите алгоритми за клъстериране, както научихме, е добра идея да разберете естеството на вашия набор от данни. Прочетете повече по тази тема тук

Тази полезна статия ви води през различните начини, по които различните алгоритми за клъстериране се държат, предвид различни форми на данни.

Задача

Проучете други визуализации за клъстериране


Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.