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

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

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

Возможно, вы собираетесь на пробежку и быстро нуждаетесь в плейлисте с громким, энергичным звуком, чтобы вас мотивировать. Или, может быть, у вас тихий воскресный вечер, и вам нужно что-то более сдержанное и полезное, чтобы расслабиться. Хотя на Spotify есть множество плейлистов, подходящих для этих ниш, я обнаружил, что пропускаю большую часть песен, поскольку они часто слишком далеки от моего обычного вкуса. Так что, если бы существовал способ эффективно объединять песни, которые вам уже нравятся, в такие стабильные по звучанию плейлисты?

Кластеризация K-средних

Моим непосредственным побуждением было использовать алгоритм K-средних для этой задачи. K-means - это тип алгоритма машинного обучения без учителя, который распределяет точки данных в кластеры или группы. Точки данных распределяются по группам в зависимости от их характеристик, что позволяет выявить лежащие в основе закономерности. Этот метод часто используется в маркетинге для выявления основных покупательских привычек, например, на основе прошлых покупок. Моя идея заключалась в том, чтобы его можно было так же легко использовать для группирования вместе схожих по звучанию песен.

Быструю интуицию для K-средних можно развить с помощью графического представления. Для этого я создал плейлист из 25 рэп-песен и 25 хаус-песен, названный «Rap and House». На рисунке ниже каждая точка представляет собой песню, в то время как ось абсцисс представляет оценку речевости, а ось Y представляет оценку инструментальности песни. Здесь следует отметить, что мы использовали только две функции звука, чтобы данные можно было визуализировать с помощью 2D-графика, но мы можем легко увеличить это число до 3 или более функций звука.

На рисунке 1 мы видим, что все точки одного цвета, что означает, что данные еще не были сгруппированы. При использовании K-средних нам необходимо указать количество кластеров, которые мы хотим, прежде чем запускать алгоритм. Таким образом, мы должны решить, сколько значимых групп есть в наших данных. Мне кажется, что может быть 3 основных кластера. Один в верхнем левом углу, один в нижнем левом углу и один справа внизу. Поэтому я установлю количество кластеров равным 3.

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

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

Теперь, когда у нас есть некоторая интуиция в отношении K-средних, давайте посмотрим, как они работают в Clusterfy.

Демо Clusterfy

Clusterfy - это название созданного мной приложения, которое использует K-Means для создания персонализированных списков воспроизведения. Конечно, для запуска K-means нам нужен пул песен для кластеризации. В настоящее время Clusterfy собирает этот пул песен с помощью двух различных функций.

Функция «Откройте для себя новых исполнителей» позволяет пользователю выбрать некоторых из своих любимых исполнителей, а затем песни из похожих, связанных исполнителей собираются и используются для создания нового списка воспроизведения. Функция «Перемешать ваши плейлисты» собирает песни из текущих плейлистов пользователя и использует их для создания нового плейлиста. Последняя функция будет показана в демонстрационных целях.

Шаг 1: выбор списка воспроизведения

Эта функция позволяет пользователю выбирать песни не только из созданных им плейлистов, но и из понравившихся им песен и из 50 самых популярных песен. Для демо я снова буду использовать плейлист «Rap and House», содержащий 25 рэп-песен и 25 хаус-песен.

Шаг 2: Выбор аудиофункций

Clusterfy предоставляет на выбор все девять доступных функций (описание функций доступно, щелкнув значок «?»). Пользователь может выбрать как набор звуковых функций, которые он хочет широко использовать, так и звуковые функции, которые они хотят меньше использовать в своем новом списке воспроизведения, или, в качестве альтернативы, только одну из этих функций. Я хочу извлечь только рэп-песни для своего нового плейлиста, поэтому я выберу высокую речевость и низкую инструментальность.

Шаг 3. Выбор плейлиста для загрузки

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

Решение создать 3 списка воспроизведения заключалось в том, чтобы предоставить пользователю больший выбор, поскольку, несмотря на то, что списки воспроизведения похожи, есть некоторые различия как в содержании, так и в длине. Как только пользователь выберет список воспроизведения, который он хочет загрузить, все, что ему нужно сделать, это нажать кнопку «Загрузить список воспроизведения» и назвать свой список воспроизведения. После этого плейлист напрямую загружается в их библиотеку Spotify.

Посмотрим, как выглядят созданные плейлисты. Плейлист 1, посередине, успешно извлек 20 из 25 рэп-песен из исходного плейлиста.



В то время как плейлист 3 впечатляюще извлек все 25 рэп-песен, но также включал 3 хаус-песни.



Такая замечательная производительность, откровенно говоря, в большей степени свидетельствует о том, насколько хорошо Spotify оценивает аудио-функции, чем о чем-либо еще. Тем не менее, в настоящее время еще нет способа использовать звуковые функции в Spotify для прямого управления звуком вашего плейлиста. Вот где вам может пригодиться Clusterfy. Для меня это оказалось особенно полезным при распределении моей библиотеки понравившихся песен в отдельные плейлисты или поиске новой музыки с помощью функции «Откройте для себя новых исполнителей». Я также должен сказать, что очень весело поиграть с различными комбинациями звуковых функций и посмотреть, какие плейлисты они образуют.

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

Если вас не интересуют технические детали, вы можете поиграть с Clusterfy, который доступен на https://clusterfy.co. Единственное, чего стоит остерегаться - это несоответствие форматирования страниц. Это был первый раз, когда я использовал CSS в такой степени, поэтому страницы могут немного отличаться в зависимости от размера вашего экрана.

Описание сценария кластеризации Clusterfy

Как уже упоминалось, скрипт построен на алгоритме K-средних. Поскольку K-средства могут возвращать немного разные результаты при каждом использовании, алгоритм запускается 50 раз. Поначалу это может показаться большим количеством раз, но важно учитывать, что с помощью K-средних мы количество кластеров должно быть указано априори. Кроме того, оптимальное количество кластеров действительно зависит от количества песен, которые должны быть сгруппированы. В связи с этим количество кластеров было изменено на каждой итерации алгоритма. Начальное количество кластеров получается делением общего количества песен на 10, максимум 6 кластеров. Затем количество кластеров в каждой итерации выбирается случайным образом, чтобы быть в пределах этого значения и около него.

После создания кластеров нам нужно выбрать, какой кластер мы хотим выбрать. Это делается с использованием определенной мной метрики «рейтинг плейлиста». Способ вычисления оценки списка воспроизведения зависит от характера выбора аудиофункций пользователем. Если выбраны только максимальные функции, то оценка списка воспроизведения для каждого кластера является средним значением выбранных звуковых функций в этом кластере. Если пользователь выбирает только минимальные функции, то оценка списка воспроизведения - это среднее значение выбранных аудиофункций в этом кластере, умноженное на -1. Наконец, если пользователь выбирает комбинацию функций максимизации и минимизации, то оценка списка воспроизведения представляет собой разницу между средним значением выбранных функций максимизации и средним значением выбранных функций минимизации. При каждой итерации сохраняется кластер с наивысшей оценкой списка воспроизведения, а после 50 итераций выбираются 3 кластера с наивысшей оценкой списка воспроизведения.

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

Если вас интересует полный код, он доступен на моей странице GitHub, или если у вас есть какие-либо вопросы по статье, не стесняйтесь обращаться ко мне на моей странице в LinkedIn.