Музыкальный вкус - очень своеобразное, своеобразное и характерное качество человека. Из всех миллионов существующих песен и звуков тот факт, что многие люди решают развить симпатию к определенному стилю, жанру или «подгруппе» музыки, - это то, что я считаю не просто случайным. Что стоит за песнями, которые нам нравятся? Они чем-то похожи? Что между ними общего? И что еще более важно, есть ли способ собрать их вместе в зависимости от того, как они звучат?

В этой статье описывается моя вторая попытка ответить на некоторые из этих вопросов.

В течение некоторого времени меня интересовали песни, которые я добавил в закладки в Spotify. Более того, мне интересно изучать на основе данных, что мой плейлист говорит о моем музыкальном вкусе. К счастью, API Spotify предоставляет так называемые аудиофункции, которые, как следует из названия, являются функциями или характеристиками песни, например, насколько она акустическая или громкая, и с их помощью я исследовал, изучал , и узнал о моей музыке.

В моей предыдущей работе, озаглавленной « Моя музыка Spotify скучна? , я сосредоточился на ответах на следующие три вопроса:

  • Насколько разнообразны сохраненные песни Spotify?
  • Насколько они полезны?
  • Насколько они скучны?

И я пришел к выводу, что мои песни действительно очень разные, и многие из них инструментальные и скучные (на основе формулы, которую я вывел). В этом же проекте я также обучил модель контролируемого обучения с целью предсказать, принадлежит ли песня моему плейлисту или плейлисту друга, достигнув точности 82%.

В продолжение этой работы, а именно этой, я продолжу исследовать концепцию вариативности моего плейлиста. Используя алгоритм кластеризации k-medoids, кластерный анализ и низкоразмерные представления моего набора данных в качестве инструментов, я использовал все мои сохраненные песни Spotify, чтобы исследовать его тенденцию к кластеризации и, чтобы определить, возможно ли это. группировать похожие песни вместе на основе их звуковых характеристик.

Этот эксперимент разделен на четыре части, которые также представляют основные темы, которые я хочу изучать.

  • Какое наиболее подходящее количество кластеров мне следует использовать?
  • Кластеризация данных и просмотр значений нескольких статистических данных кластеризации, таких как коэффициент силуэта и различия между кластерами.
  • Насколько хороша кластеризация? Насколько похожи песни в каждом кластере? Имеет ли смысл кластеризация?
  • Как выглядят сгруппированные данные?

Давай начнем!

Инструменты

Эта работа была выполнена с использованием как R, так и Python. Часть кластеризации была выполнена с использованием R и пакетов caret и cluster. Python использовался для сбора данных с помощью библиотеки Spotipy и для их визуализации с помощью Hypertools. Ссылка на код доступна в конце отчета.

Данные

Данные о музыке были получены с помощью написанного мной сценария Python, который извлекает все песни из определенного списка воспроизведения и их звуковые особенности. После очистки набора данных и удаления ненужных вещей у меня остался набор данных, состоящий из 563 строк (каждая из которых представляет песню) и 5 ​​столбцов, которые являются функциями звука. Эти звуковые функции:

Инструментальность: это значение представляет собой меру вокала в песне. Чем ближе он к 1.0, тем инструментальнее песня.

Акустичность: это значение описывает, насколько акустична песня. Оценка 1.0 означает, что песня, скорее всего, акустическая.

Живучесть: это значение описывает вероятность того, что песня была записана для живой аудитории. Согласно официальной документации, «значение выше 0,8 дает высокую вероятность того, что трек будет живым».

Речь: «Речь определяет присутствие произнесенных слов в дорожке». Если речевость песни выше 0,66, она, вероятно, состоит из произнесенных слов, оценка от 0,33 до 0,66 означает, что песня может содержать как музыку, так и слова, а оценка ниже 0,33 означает, что в песне нет речи.

Танцевальные способности: «Танцевальные способности описывают, насколько подходит трек для танцев на основе комбинации музыкальных элементов, включая темп, стабильность ритма, силу удара и общую регулярность. Значение 0,0 наименее танцевально, а 1,0 - наиболее танцевально ».

* Описание было скопировано / вставлено из официальной документации.

Определение количества кластеров

При использовании алгоритмов кластеризации на основе разделов, таких как k-medoids, поиск нужного количества кластеров, также известного как k, является неоднозначным и решающим шагом. С одной стороны, низкий k, например k = 2, означает, что все наблюдения набора данных будут сгруппированы в 2 кластера, что приведет к большому количеству ошибка и, скорее всего, трудно интерпретируемый результат кластеризации. Второй вариант, большее k, уменьшит ошибку за счет разделения всех наблюдений на множество кластеров. Таким образом, необходим баланс, и, цитируя Википедию, оптимальный выбор k обеспечит баланс между максимальным сжатием данных с использованием одного кластера и максимальной точностью, назначая каждую точку данных своей собственный кластер .

Из всех известных методов определения количества кластеров я использовал коэффициент силуэта и статистику разрыва.

Коэффициент силуэта измеряет, насколько наблюдение данных похоже на наблюдения в его собственных кластерах (сплоченность) по сравнению с наблюдениями в других кластерах (разделение). Значение силуэта варьируется от -1 до 1, где 1 указывает на хорошее сцепление, а -1 указывает на то, что объект, вероятно, находится в неправильном кластере. Используя этот метод, я несколько раз сгруппировал свой набор данных, используя разные k, с последующим вычислением и усреднением силуэта всех наблюдений и выбрал k Я нашел самый подходящий.

На следующем графике показан средний силуэт при кластеризации данных с использованием k = 2 до k = 10.

Хотя график показывает, что k из 4 дает лучший силуэт, я решил выбрать k = 5, поскольку мне было интересно иметь много кластеров для анализа.

Для второго использованного метода, статистики пробелов, набор данных был кластеризован несколько раз с использованием разных k, и каждый раз сумма квадратов внутри кластера вокруг центра кластера вычиталась из так называемого ожидаемая сумма квадратов внутри кластера (если вы найдете термин ожидаемый сбивающим с толку или расплывчатым, не волнуйтесь, за этим словом связано много математики, и объяснение выходит за рамки этой статьи) . Результатом этого вычитания является статистика разрыва, и как только мы получим ее для каждого k и построим их, мы получим ту, которая представляет изгиб »графика. , соответствует наиболее оптимальному k.

На следующем графике показана вся статистика разрывов с использованием k = 2 до k = 10. Как и оценка силуэта, в зависимости от разрыва, k = 3 или k = 4, является лучшим k, однако я снова решил выбрать k = 5 .

Поэтому ответ на мой вопрос «какое количество кластеров мне лучше всего использовать?» - 5.

Теперь, когда мы выбрали k, следующим шагом будет кластеризация данных.

Кластеризация и ее анализ

Для кластеризации данных используется алгоритм k-medoids. Для тех из вас, кто имеет предыдущий опыт работы с k-means и не слышал и не использовал k-medoids раньше, я бы сказал, что основное различие между ними заключается в том, что первое может использоваться с любой мерой сходства. , а не минимизировать квадрат расстояния, как это делается в k-means. Помимо этого, в k-medoids фактическая точка данных набора данных используется как наиболее центральный элемент кластера, в отличие от k-средних, который использует точку в пространстве функций, которая представляет центр кластера, что делает первое более устойчив к выбросам.

Следующее изображение является прямым выходом результатов кластеризации. Каждая строка представляет собой кластер, а каждый столбец - это часть информации о нем. Начиная слева, первый столбец «size» - это количество наблюдений на кластер, «max_diss» - максимальное несходство, то есть расстояние между точками данных, которые - самый дальний от медоида кластера, «av_diss» - среднее несходство, затем у нас есть «диаметр», который является максимальным различием между двумя точками одного и того же кластера, и, наконец, , «разделение», минимальное различие между точкой данных одного кластера и точкой данных другого.

По размеру кластер 4 является самым большим, в нем всего 143 песни, а третий, состоящий из 60 песен, является самым маленьким. Этот кластер также показывает наивысшее максимальное различие и среднее несходство. Это говорит о том, что содержание этого кластера, по сравнению с другими, совершенно отделено от его медоида или центра; этот кластер также показывает наибольшее значение разделения, что означает, что он является наиболее удаленным от других, а также имеет наибольший диаметр, что делает его «самым большим» кластером с точки зрения расстояния. Напротив, кластер 4 имеет самые низкие максимальные и средние значения несходства, диаметра и разделения.

Раньше я вводил коэффициент силуэта, чтобы использовать его как способ найти хорошее k. Теперь я воспользуюсь этим как методом проверки качества кластеров. На следующем изображении показан силуэт каждой точки данных, сгруппированной по кластеру.

Цифры справа от изображения - это средний силуэт каждого кластера. Кластер 2 имеет более низкий силуэт (0,27), а кластер 4 - лучший (0,55). Кластер 2 также имеет наибольшее количество наблюдений с силуэтом ниже 0, и теоретически это означает, что эти случаи могут принадлежать другому кластеру.

Согласно всем показателям, представленным в этом разделе, кластер 4 кажется лучшим, потому что он имеет лучшее среднее расстояние и диаметр внутри кластера, а также самый высокий силуэт. По этой причине это один из кластеров, который я буду использовать и анализировать в следующем разделе, чтобы на самом деле проверить, действительно ли кластер хорош.

Насколько хороша кластеризация?

Лучший способ узнать, хорош ли кластер, - это углубиться в него и посмотреть на контент, чтобы увидеть, связано ли оно и есть ли закономерность, например, песни, которые принадлежат одному альбому, тем же артистам, похожим звуки, или в том же стиле. В этом разделе я представлю некоторые песни, сгруппированные в кластеры 3 и 4, и, кроме того, я сделаю новую кластеризацию, используя содержимое кластера 4, чтобы попытаться найти дальнейшие сходства.

В предыдущем разделе я сказал, что кластер 4 состоит из 143 наблюдений, что делает его самым крупным. В следующем списке я покажу некоторые из альбомов, принадлежащих к этому кластеру, количество песен, а в некоторых случаях сделаю пометку относительно альбома.

  • The Lord Of The Rings - The Return Of The King - The Complete Recordings (Limited Edition): 38 песен.
  • Интерстеллар: оригинальный саундтрек к фильму (версия Deluxe): 12 песен
  • Child of Light: 10 песен; это саундтрек к видеоигре.
  • Interstellar: оригинальный саундтрек к фильму (да, у меня есть обычная версия этого альбома и версия Deluxe, поэтому есть дубликаты): 10 песен
  • Безумный Макс: Дорога ярости - оригинальный саундтрек к фильму: 9 песен
  • Distant Worlds II: еще музыка из Final Fantasy: 7 песен; другая видеоигра.
  • Mass Effect 3: 7 песен; видео игра.
  • while (1 ‹2) от Deadmau5: 7 песен; электронная музыка.
  • Рожденный кровью: 5; музыка, вдохновленная видеоигрой Bloodborne.
  • Транзистор: 5 песен; видео игра.

Остальные песни включают Kanye West, Star Wars, кавер на песню Interstellar, песню от Mr. Робот (телешоу), Марсианин (фильм), Муза, Хоббит и другие.

Основной тон и стиль песен этой группы - инструментальные; песни, в которых почти нет вокала. Как вы могли заметить, многие из них взяты из оригинальных партитур фильмов (Интерстеллар, Властелин колец) и видеоигр (Final Fantasy , Mass Effect); даже эта песня Канье Уэста - инструментальная интерлюдия без вокала.

Давайте посмотрим на кластер 3, самый маленький. Снова перечислю альбомы и количество песен.

  • Acoustic от Above & Beyond: 12 песен
  • Acoustic II от Above & Beyond: 11 песен
  • Жизнь Пабло, Канье Уэст: 6 песен
  • Bastion: 4 песни; видеоигра.
  • Интерстеллар: оригинальный саундтрек к фильму (версия Deluxe): 3 песни
  • The Lord Of The Rings - The Return Of The King - The Complete Recordings (Limited Edition): 3 песни
  • Интерстеллар: оригинальный саундтрек к фильму: 2 песни
  • Transistor: 2 песни.

На первый взгляд, этот кластер кажется немного более разнообразным, чем предыдущий (возможно, именно поэтому он так сильно отличается), в нем есть музыка из видеоигр, подробнее Interstellar, Lord of the Rings И немного хип-хопа и рэпа. Но главное, что он содержит 23 песни из альбомов Above & Beyond Acoustic. Чтобы дать немного контекста, эти два альбома являются акустическими версиями некоторых из самых известных песен Above и Beyond, и что мне кажется любопытным, так это то, что, хотя это два разных альбома, выпущенные в разные годы, они следуют одному и тому же стилю. звуковые функции и кластер. Важно отметить, что первый альбом содержит 12 песен, а второй - 13, поэтому кластер смог захватить почти все из них (23 из 25).

Из-за того, что кластер 3 немного разнообразен, я сгруппировал его содержимое в новую модель, чтобы проверить, может ли алгоритм обнаружить это разнообразие. В частности, мне было интересно узнать, были ли песни из альбома Acoustics, хип-хоп и рэп, а также песни из фильмов и видеоигр отнесены к разным кластерам. Как и в прошлый раз, использовались k-medoids, на этот раз с k = 4.

Предыдущий график - это силуэт нового кластера. Средняя ширина силуэта составляет 0,29 балла, что ниже и хуже, чем у последнего, равного 0,40. Более того, на этот раз действительно плохой кластер с оценкой 0,10. Ниже приводится сводка кластера.

  • Группа 1:
    - Above & Beyond Акустические альбомы: 6 песен
    - Рэп: 2 песни
    - Инструментальная музыка: 3 песни
    - Поп-музыка, электронная музыка, испанская баллада: 1 песня каждой
    - Фрэнк Синатра (джаз): 1 песня
  • Кластер 2:
    - Above & Beyond Акустические альбомы: 15 песен (16, если считать дубликаты из другого альбома) < br /> - Lord of the Rings песня с вокалом: 1
    - саундтрек с вокалом Bastion: 2
    - Transistor саундтрек песен с вокалом: 1
  • Кластер 3:
    - Рэп: 6 песен
    - Электронный: 2 песни.
  • Кластер 4:
    - Interstellar: 5 песен
    - Властелин колец: 2 песни

Я очень доволен результатами, полученными во втором кластере. Во-первых, более половины песен взяты с альбомов Acoustic, а остальные имеют некоторое сходство (поверьте мне). Например, песни из Bastion и Transistor - это расслабляющие песни с мягкими голосами и акустическим звучанием с участием гитар (также оба альбома принадлежат одному исполнителю). Песня из Властелина колец немного веселее предыдущих, но я бы сказал, что она соответствует теме.

В целом результатом модели кластеризации я доволен. Хотя кластеризация иногда казалась сложной и запутанной, я считаю, что она смогла уловить суть разнообразия моей музыки. В обсуждаемых кластерах я смог распознать несколько закономерностей, таких как наличие инструментальной и оркестровой музыки (из видеоигр и фильмов) в одном кластере и песен с акустическим чувством (гитары, некоторые духовые инструменты) в других. По поводу трех кластеров (от первой модели) я не писал, один из них выявил упор на рэп, хип-хоп и электронную музыку, а остальные - мусор (что в них есть музыка всех жанров и исполнителей).

Визуализация

При работе с кластеризацией (и данными в целом) мне всегда интересно, как выглядят данные. В последних абзацах я много говорил о кластерах, диаметрах и разделении, а также о множестве других вещей, которые в какой-то степени неоднозначны и трудно представить себе в чьей-то голове. По этой причине последний раздел этого эксперимента посвящен визуализации набора данных и кластеров.

Набор данных этого проекта состоит из 5 функций, и если я хочу построить график всех из них, мне нужно принять во внимание тот факт, что для нас, людей, невозможно (насколько я знаю) испытать вещи за пределами реальности. трех измерений. Один из вариантов - просто выбрать 2 или 3 функции и нанести их на график, однако мы потеряем значительный объем информации, так как будем упускать другие функции. И, честно говоря, в данном случае это не ужасная идея, потому что набор данных имеет всего 5 измерений, однако есть наборы данных, которые состоят из тысяч функций, и в таких случаях построение 2 или 3 не даст вам хорошего визуального представления. представление данных. Итак, как нам решить эту проблему?

К счастью, существует семейство алгоритмов, называемых уменьшением размерности, цель которых - проецировать данные большой размерности в данные низкой размерности, чтобы мы могли делать некоторые вещи, например визуализировать их. Из этих алгоритмов я решил использовать t-распределенное стохастическое соседнее вложение (t-SNE) и анализ главных компонентов (PCA). К сожалению, я не буду вдаваться в подробности из-за их сложности, и, честно говоря, я не полностью их понимаю (особенно t-SNE), поэтому я уверен, что мое объяснение будет отсутствовать (если у кого-то есть хорошие ресурсы по этому поводу, пожалуйста добавляйте их в комментарии).

Первые два изображения - это t-SNE и PCA-представление основного кластера.

Оба изображения показывают, насколько хорошо определены кластеры и насколько мало перекрывается между ними, за исключением некоторого содержимого кластера 5, который, по-видимому, находится в кластере 2. В более раннем разделе упоминалось, что кластер 3 является один с большим диаметром, и это можно наблюдать на изображениях, особенно на t-SNE. Если вы посмотрите на крайнюю правую часть изображения, то увидите одну точку кластера 3, которая явно находится в кластере 1, а также другую точку наверху кластера 4 и еще одну в кластере 2, таким образом, кластер 3 действительно действительно разложить. В качестве бонуса я добавлю второе представление t-SNE, но на этот раз в 3D, и хотя это немного сложно понять в 2D, это может помочь добавить дополнительную информацию о кластере.

Что касается кластеризации данных кластера 3, то вот как выглядит t-SNE.

Основное замечание этого графика - насколько разбросаны данные кластера 3; 4 песни находятся над кластером 2, а остальные - под ним, и, как вы могли вспомнить из обсуждения, этот кластер 3 содержит 4 песни из Властелина колец. Могут ли эти 4 точки быть теми песнями? Может быть. Более того, средний балл по силуэту этого кластера (0,10) был самым низким для модели (у него было несколько отрицательных баллов), поэтому как-то ожидается, что будет наблюдаться эта разреженность.

Подводя итог этому сегменту, я хотел бы сказать, что даже несмотря на то, что эти графики были созданы путем преобразования данных из пятимерного пространства в двумерное - а не исходных данных, используемых для кластеризации - они были достаточно хороши, чтобы произвести некоторые из результаты, обсужденные в предыдущих разделах, а также, чтобы помочь мне лучше понять, что происходило в модели.

Заключение

В начале этой статьи я задал любопытство или вопрос, связанный с моей музыкой. Был задан вопрос: «Можно ли найти похожую музыку в кластерах на основе их звуковых характеристик?» Чтобы ответить на него, я разделил задачу на 4 этапа. Во-первых, используя коэффициент силуэта и статистику зазора, я смог определить подходящее значение k. После этого данные были кластеризованы с использованием k-medoids, и результаты кластеризации, например, диаметр, разделение и различия каждого кластера, были объяснены. Затем из всех кластеров были выбраны два, чтобы вручную проверить его содержимое. Один из них в основном состоит из музыки из видеоигр и саундтреков к фильмам. Второй был более разнообразным; в нем были рэп-песни, акустические песни, инструментальные песни и многое другое из видеоигр. Используя всю музыку из этого второго кластера, была создана новая модель, чтобы исследовать, возможно ли объединить каждый из музыкальных стилей, упомянутых выше, в отдельные кластеры. Результат был положительным. Большинство акустических песен были в одной группе, а рэп - в другой. Наконец, кластеры были визуализированы, чтобы дать нам четкое представление о том, как они выглядят, и в дополнение к этому я смог указать на некоторые закономерности, которые наблюдались во время раздела кластерного анализа.

Я доволен и доволен результатом, полученным в этом проекте. Во-первых, это было весело. Я смог узнать немного больше о своих музыкальных паттернах, ответил на некоторые вопросы, которые возникали у меня в голове и в процессе, и заново открыл для себя некоторые песни, которые не слышал долгое время. Я считаю, что сама кластеризация была хорошей (я никогда не ожидал идеальной) в том смысле, что она не такая уж беспорядочная, и, похоже, существует некоторая корреляция между содержимым каждого кластера. Это мнение могло быть каким-то предвзятым, так как я был тем, кто определил, что песни определенно похожи, но это было основано на моих музыкальных вкусах, моем слухе и моем желании получить от этого положительный результат. Если я когда-нибудь решу продолжить работу над этим, я хотел бы попробовать другие алгоритмы, в частности, алгоритмы кластеризации на основе сетки, такие как CLIQUE, или алгоритмы на основе плотности, такие как DBSCAN.

Код, используемый для этого проекта, включая наборы данных, доступен на моем Github: https://github.com/juandes/audio-features-unsupervised-learning

Надеюсь, вам понравилось это и вы узнали что-то новое. Если у вас есть какие-либо вопросы, разъяснения или какие-либо несоответствия здесь, оставьте, пожалуйста, комментарий.

Спасибо за прочтение :)