Липецкий государственный технический университет Кафедра прикладной математики КУРСОВАЯ РАБОТА по дисциплине «Статистические методы в прикладных задачах» на тему «Кластеризация» Студент Сергеев Е.С. подпись, дата Группа ПМ-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