Uploaded by EgorSergeev

kurs (2)

advertisement
Липецкий государственный технический университет
Кафедра прикладной математики
КУРСОВАЯ РАБОТА
по дисциплине «Статистические методы в прикладных
задачах»
на тему «Кластеризация»
Студент
Сергеев Е.С.
подпись, дата
Группа
ПМ-19-2
Руководитель
ученая степень, ученое звание
фамилия, инициалы
Левина Л.В.
подпись, дата
Липецк 2022 г.
фамилия, инициалы
Содержание
Цель работы ............................................................................................
3
Теоретическая часть .............................................................................
Кластерный анализ ..............................................................................
Алгоритм k-средних . . . . . . . . . . . . . . . . . . . . . . .
Исходные данные..................................................................................
4
4
5
6
Практическая часть ..............................................................................
Чтение и знакомство с данными..........................................................
7
7
Заключение ............................................................................................. 14
Список литературы............................................................................... 15
2
Цель работы
Узнать, как осуществляется подбор музыки на основе музыкальных
предпочтений человека.
3
Теоретическая часть
Кластерный анализ
Кластерный анализ — многомерная статистическая процедура, выполняющая сбор данных, содержащих информацию о выборке объектов, и затем упорядочивающая объекты в сравнительно однородные группы. Задача кластеризации относится к статистической обработке, а также к широкому классу задач обучения без учителя.
Кластерный анализ выполняет следующие основные задачи:
• Разработка типологии или классификации.
• Исследование полезных концептуальных схем группирования объектов.
• Порождение гипотез на основе исследования данных.
• Проверка гипотез или исследования для определения, действительно
ли типы (группы), выделенные тем или иным способом, присутствуют
в имеющихся данных.
Кластерный анализ предполагает следующие этапы:
• Отбор выборки для кластеризации. Подразумевается, что имеет смысл
кластеризовать только количественные данные.
• Определение множества переменных, по которым будут оцениваться
объекты в выборке, то есть признакового пространства.
• Вычисление значений той или иной меры сходства (или различия)
между объектами.
• Применение метода кластерного анализа для создания групп сходных
объектов.
• Проверка достоверности результатов кластерного решения.
В кластеризации для каждой пары объектов измеряется «расстояние»
между ними — степень похожести.
4
√︃
𝑛
∑︀
• Евклидово расстояние 𝑝(𝑥, 𝑥′ ) =
(𝑥𝑖 − 𝑥′𝑖 )2
𝑖
𝑛
∑︀
• Квадрат евклидова расстояния 𝑝(𝑥, 𝑥 ) = (𝑥𝑖 − 𝑥′𝑖 )2
′
𝑖
• Расстояние городских кварталов (манхэттенское расстояние)
𝑛
∑︀
𝑝(𝑥, 𝑥′ ) = |𝑥𝑖 − 𝑥′𝑖 |
𝑖
• Расстояние Чебышева 𝑝(𝑥, 𝑥′ ) = 𝑚𝑎𝑥|𝑥𝑖 − 𝑥′𝑖 |
Алгоритм k-средних
Наиболее простой, но в то же время достаточно неточный метод кластеризации в классической реализации. Он разбивает множество элементов
векторного пространства на заранее известное число кластеров k. Действие
алгоритма таково, что он стремится минимизировать среднеквадратичное
отклонение на точках каждого кластера. Основная идея заключается в том,
что на каждой итерации перевычисляется центр масс для каждого кластера, полученного на предыдущем шаге, затем векторы разбиваются на кластеры вновь в соответствии с тем, какой из новых центров оказался ближе
по выбранной метрике. Алгоритм завершается, когда на какой-то итерации
не происходит изменения кластеров.
5
Исходные данные
В данной работе будем использовать данные,которые содержат информацию о музыке, выпущеннойй с 1921 по 2020 года.
Данные содержат следующие поля:
Рисунок 1 – Информация о данных.
6
Практическая часть
Чтение и знакомство с данными
Импортируем необходимые библиотеки для работы с фреймом данных,
визуализации и кластеризации:
1
2
3
import os
import numpy as np
import pandas as pd
4
5
6
7
8
import seaborn as sns
import plotly.express as px
import matplotlib.pyplot as plt
%matplotlib inline
9
10
11
12
13
14
15
16
from
from
from
from
from
from
from
sklearn.cluster import KMeans
sklearn.preprocessing import StandardScaler
sklearn.pipeline import Pipeline
sklearn.manifold import TSNE
sklearn.decomposition import PCA
sklearn.metrics import euclidean_distances
scipy.spatial.distance import cdist
17
18
import warnings
Считываем данные, по которым будет проводиться анализ:
1
2
3
4
5
6
data = pd.read_csv("data.csv")
genre_data = pd.read_csv('data_by_genres.csv')
year_data = pd.read_csv('data_by_year.csv')
print(data.info())
print(genre_data.info())
print(year_data.info())
7
Рисунок 2 – Исходные данные.
Посмотрим, как изменялось влияние факторов(акустичность, танцевальность, энергия, инструментальность, живость и валентность) на музыку в
разные года:
1
2
3
sound_features = ['acousticness', 'danceability', 'energy', 'instrumentalness',
˓→
'liveness', 'valence']
fig = px.line(year_data, x='year', y=sound_features)
fig.show()
8
Рисунок 3 – Влияние факторов.
Этот набор данных содержит звуковые функции для разных песен, а
также звуковые функции для разных жанров. Мы можем использовать эту
информацию, чтобы сравнить различные жанры и понять их уникальные
различия в звучании:
1
top10_genres = genre_data.nlargest(10, 'popularity')
2
3
4
fig = px.bar(top10_genres, x='genres', y=['valence', 'energy', 'danceability',
˓→
'acousticness'], barmode='group')
fig.show()
9
Рисунок 4 – Различные жанры и их характеристика.
Используем алгоритм кластеризации K-средних для разделения жанров в
этом наборе данных на десять кластеров на основе числовых характеристик
звука каждого жанра.
1
2
3
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
4
5
6
7
8
9
cluster_pipeline = Pipeline([('scaler', StandardScaler()), ('kmeans',
˓→
KMeans(n_clusters=10))])
X = genre_data.select_dtypes(np.number)
cluster_pipeline.fit(X)
genre_data['cluster'] = cluster_pipeline.predict(X)
from sklearn.manifold import TSNE
10
11
12
13
14
15
tsne_pipeline = Pipeline([('scaler', StandardScaler()), ('tsne', TSNE(n_components=2,
˓→
verbose=1))])
genre_embedding = tsne_pipeline.fit_transform(X)
projection = pd.DataFrame(columns=['x', 'y'], data=genre_embedding)
projection['genres'] = genre_data['genres']
projection['cluster'] = genre_data['cluster']
16
17
18
19
fig = px.scatter(
projection, x='x', y='y', color='cluster', hover_data=['x', 'y', 'genres'])
fig.show()
10
Рисунок 5 – Кластеризация жанров с помощью K-средних.
Получились следующие кластеры:
• 0 кластер - электронная
• 1 кластер - фолк и джаз
• 2 кластер - инди и фолк
• 3 кластер - индастриал
• 4 кластер - классическая музыка
• 5 кластер - рок
• 6 кластер - хип-хоп
• 7 кластер - аудио-книги, сказки
• 8 кластер - тяжелый рок, метал
• 9 кластер - ораторское искусство, музыка для детей и пр.
Используем алгоритм кластеризации K-средних для разделения песен:
11
1
2
3
4
song_cluster_pipeline = Pipeline([('scaler', StandardScaler()),
('kmeans', KMeans(n_clusters=20,
verbose=False))
], verbose=False)
5
6
7
8
9
10
X = data.select_dtypes(np.number)
number_cols = list(X.columns)
song_cluster_pipeline.fit(X)
song_cluster_labels = song_cluster_pipeline.predict(X)
data['cluster_label'] = song_cluster_labels
11
12
from sklearn.decomposition import PCA
13
14
15
16
17
18
pca_pipeline = Pipeline([('scaler', StandardScaler()), ('PCA', PCA(n_components=2))])
song_embedding = pca_pipeline.fit_transform(X)
projection = pd.DataFrame(columns=['x', 'y'], data=song_embedding)
projection['title'] = data['name']
projection['cluster'] = data['cluster_label']
19
20
21
22
fig = px.scatter(
projection, x='x', y='y', color='cluster', hover_data=['x', 'y', 'title'])
fig.show()
Рисунок 6 – Кластеризация песен с помощью K-Means.
12
Основываясь на анализе и визуализации, ясно, что похожие жанры, как
правило, имеют точки данных, расположенные близко друг к другу, в то
время как похожие типы песен также сгруппированы вместе.
Похожие жанры будут звучать одинаково и будут происходить из похожих периодов времени, в то время как то же самое можно сказать и
о песнях в этих жанрах. Мы можем использовать эту идею для создания системы рекомендаций, беря точки данных песен, которые прослушал
пользователь, и рекомендуя песни, соответствующие близлежащим точкам
данных.
13
Заключение
В ходе курсовой работы были изучены материалы по задаче кластеризации и было написано приложение на языке Python для осуществления
подбора музыки на основе музыкальных предпочтений.
14
Список литературы
[1] Львовский С.М., Набор и верстка в системе LATEX[Текст] / С.М. Львовский. М.: МЦНМО, 2006. — 448 с.
[2] Марк Лутц, Изучаем Python : учеб. / Перевод А. Киселева – СанктПетербург : Изд-во Символ. гос. ун-та, 2009. —- 824 с.
[3] Гитис Л. Х., Кластерный анализ в задачах классификации, оптимизации и прогнозирования / Л.Х. Гитис; [Моск. гос. гор. ун-т]. - М. : Изд-во
МГГУ, 2001. — 103 с.
15
Download