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/README.md

347 lines
37 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-09-04T23:58:32+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "bg"
}
-->
# Въведение в клъстеризацията
Клъстеризацията е вид [Обучение без надзор](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")
> 🎥 Кликнете върху изображението по-горе за видео. Докато изучавате машинното обучение с клъстеризация, насладете се на някои нигерийски танцови парчета - това е високо оценена песен от 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-те години. Можете ли да си представите как е бил използван?
Алтернативно, можете да го използвате за групиране на резултати от търсене - например по връзки за пазаруване, изображения или ревюта. Клъстеризацията е полезна, когато имате голям набор от данни, който искате да намалите и върху който искате да извършите по-детайлен анализ, така че техниката може да се използва за изучаване на данни преди да се изградят други модели.
✅ След като данните ви са организирани в клъстери, можете да им присвоите идентификатор на клъстер, и тази техника може да бъде полезна за запазване на поверителността на набора от данни; вместо това можете да се позовавате на точка от данни чрез нейния идентификатор на клъстер, а не чрез по-разкриващи идентифицируеми данни. Можете ли да се сетите за други причини, поради които бихте се позовали на идентификатор на клъстер, вместо на други елементи от клъстера, за да го идентифицирате?
Задълбочете разбирането си за техниките на клъстеризация в този [учебен модул](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 | голям набор от данни с изключения, индуктивен |
> 🎓 Как създаваме клъстери има много общо с начина, по който събираме точките от данни в групи. Нека разгледаме някои термини:
>
> 🎓 ['Трансдуктивен' срещу 'индуктивен'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> Трансдуктивното заключение се извежда от наблюдавани тренировъчни случаи, които се свързват със специфични тестови случаи. Индуктивното заключение се извежда от тренировъчни случаи, които се свързват с общи правила, които след това се прилагат към тестови случаи.
>
> Пример: Представете си, че имате набор от данни, който е само частично етикетиран. Някои неща са „плочи“, някои „CD-та“, а някои са празни. Вашата задача е да предоставите етикети за празните. Ако изберете индуктивен подход, бихте обучили модел, който търси „плочи“ и „CD-та“, и бихте приложили тези етикети към неетикетираните данни. Този подход ще има проблеми с класифицирането на неща, които всъщност са „касети“. Трансдуктивният подход, от друга страна, се справя по-ефективно с тези неизвестни данни, тъй като работи за групиране на подобни елементи заедно и след това прилага етикет към групата. В този случай клъстерите може да отразяват „кръгли музикални неща“ и „квадратни музикални неща“.
>
> 🎓 ['Неравна' срещу 'равна' геометрия](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](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png)
> Инфографика от [Dasani Madipalli](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](../../../../5-Clustering/1-Visualize/images/hierarchical.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **Клъстеризация чрез центроид**. Този популярен алгоритъм изисква избор на 'k', или броя на клъстерите, които да се формират, след което алгоритъмът определя централната точка на клъстера и събира данни около тази точка. [K-means клъстеризацията](https://wikipedia.org/wiki/K-means_clustering) е популярен вариант на клъстеризация чрез центроид. Центърът се определя от най-близката средна стойност, откъдето идва и името. Квадратното разстояние от клъстера се минимизира.
![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **Клъстеризация, базирана на разпределение**. Базирана на статистическо моделиране, клъстеризацията, базирана на разпределение, се фокусира върху определяне на вероятността дадена точка от данни да принадлежи към клъстер и я присвоява съответно. Методите на Гаусови смеси принадлежат към този тип.
- **Клъстеризация, базирана на плътност**. Точките от данни се присвояват към клъстери въз основа на тяхната плътност или групиране около други точки. Точки от данни, които са далеч от групата, се считат за изключения или шум. DBSCAN, Mean-shift и OPTICS принадлежат към този тип клъстеризация.
- **Клъстеризация, базирана на решетка**. За многомерни набори от данни се създава решетка и данните се разделят между клетките на решетката, като по този начин се създават клъстери.
## Упражнение - клъстеризирайте вашите данни
Клъстеризацията като техника е значително подпомогната от правилната визуализация, така че нека започнем с визуализиране на нашите музикални данни. Това упражнение ще ни помогне да решим кой от методите за клъстеризация трябва да използваме най-ефективно за естеството на тези данни.
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()
```
Проверете първите няколко реда от данните:
| | име | албум | изпълнител | топ жанр на изпълнителя | дата на издаване | дължина | популярност | танцувалност | акустичност | енергия | инструменталност | живост | сила на звука | речевост | темпо | времеви подпис |
| --- | ------------------------ | ---------------------------- | ------------------- | ----------------------- | ---------------- | ------- | ----------- | ------------ | ------------ | ------- | ---------------- | ------ | ------------ | --------- | ------- | -------------- |
| 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 |
1. Получете информация за датафрейма, като извикате `info()`:
```python
df.info()
```
Резултатът изглежда така:
```output
<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
```
1. Проверете за липсващи стойности, като извикате `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')
```
![most popular](../../../../5-Clustering/1-Visualize/images/popular.png)
✅ Ако искате да видите повече топ стойности, променете top `[:5]` на по-голяма стойност или го премахнете, за да видите всички.
Забележете, когато топ жанрът е описан като „Missing“, това означава, че 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')
```
Сега проверете отново жанровете:
![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png)
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)
```
![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png)
Единствената силна корелация е между `energy` и `loudness`, което не е изненадващо, като се има предвид, че силната музика обикновено е доста енергична. В противен случай корелациите са сравнително слаби. Ще бъде интересно да видим какво може да направи алгоритъм за клъстериране с тези данни.
> 🎓 Забележете, че корелацията не означава причинно-следствена връзка! Имаме доказателство за корелация, но нямаме доказателство за причинно-следствена връзка. [Забавен уебсайт](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), която представя данните с помощта на непрекъсната крива на плътност на вероятността. Това ни позволява да интерпретираме данните, когато работим с множество разпределения.
Като цяло трите жанра се подреждат свободно по отношение на тяхната популярност и танцувалност. Определянето на клъстери в тези свободно подредени данни ще бъде предизвикателство:
![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png)
1. Създайте диаграма с точки:
```python
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
Диаграма с точки на същите оси показва подобен модел на сближаване.
![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png)
Като цяло, за клъстериране можете да използвате диаграми с точки, за да покажете клъстери от данни, така че овладяването на този тип визуализация е много полезно. В следващия урок ще вземем тези филтрирани данни и ще използваме клъстериране с k-средни стойности, за да открием групи в тези данни, които изглежда се припокриват по интересни начини.
---
## 🚀Предизвикателство
В подготовка за следващия урок, направете диаграма за различните алгоритми за клъстериране, които можете да откриете и използвате в производствена среда. Какви проблеми се опитва да реши клъстерирането?
## [Тест след лекцията](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)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.