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
localizeflow[bot] 712688625c
chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes)
3 months ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes) 3 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

Въведение в клъстерирането

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

No One Like You by PSquare

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

Предварителен тест преди лекцията

Въведение

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

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

Introduction to ML

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

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

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

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

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

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

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

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

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

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

    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
  4. Вземете някаква информация за dataframe, като извикате 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. Проверете отново за null стойности, като извикате 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')
    

    най-популярни

Ако искате да видите повече водещи стойности, променете горната граница [: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')
    

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

    най-популярни

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

    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)
    

    корелации

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

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

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

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

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

Дали тези три жанра значително се различават във възприятията за тяхната danceability, базирано на тяхната популярност?

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

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

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

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

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

    разпределение

  2. Създайте scatter plot:

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

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

    Facetgrid

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


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

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

Кратък тест след лекцията

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

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

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

Задача

Изследвайте други визуализации за клъстеризация


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