Обычно существует три типа системы рекомендаций:

  1. Совместная фильтрация
  2. Фильтрация на основе содержания
  3. Гибридные системы рекомендаций

Совместная фильтрация:

Совместная фильтрация – это метод, позволяющий отфильтровывать элементы, которые могут понравиться пользователю, на основе реакции похожих пользователей. Он работает, ища большую группу людей и находя меньший набор пользователей со вкусами, похожими на конкретного пользователя. Для иллюстрации: если Джону нравятся элементы A, B, C и D, а Майку нравятся элементы A, B и C. , ему, скорее всего, также понравится пункт D.

Контентная фильтрация:

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

Гибридные рекомендательные системы:

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

Система музыкальных рекомендаций с использованием алгоритма KNN:

В k-ближайших соседях точки данных, которые находятся рядом друг с другом, называются «соседями». K-ближайшие соседи основаны на этой парадигме: «Подобные случаи с одинаковыми метками классов находятся рядом друг с другом». Таким образом, расстояние между двумя случаями является мерой их непохожести.

Импорт библиотек и чтение данных

import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
# to import data from google drive
path = "/content/drive/My Drive/Music Recommendation/song_data.csv"
# read data from song_data.csv file
song_data = pd.read_csv(path,
usecols=['user_id','song_id','listen_count','title','artist','song']
,dtype={'user_id':'str','song_id':'str','listen_count':'int32',
'title':'str','artist':'str','song':'str'})

Показать данные

song_data.head(10)

Оптимизировать данные (выбрать и сохранить только необходимые данные)

# to fetch only required column from dataset
song_data = song_data[['song','listen_count']]
# use groupby().sum() to make 'song' column unique and to count
# it's respective sum of listen_count
song_data = song_data.groupby('song').sum()
# now sort above data by descending order of listen_count
song_data.sort_values(by=['listen_count'], inplace=True, ascending=False)
# reset index of changed data
song_data = song_data.reset_index()

Список оптимизированных данных

song_data.head(10)

Внедрить KNN и дать рекомендации

На этом этапе я использую алгоритм KNN, чтобы дать рекомендацию, используя значение k=10 (10 лучших песен рекомендации, основанные на песне, которую ищет пользователь) и метод евклидова расстояния для расчета расстояния между точкой (песней) с использованием данных listen_count. например, после расчета расстояния от всех песен, 10 самых близких (самых низких) расстояний будут рекомендованы пользователю.

# function to recommend new songs
def Music_Recommendation(song_name, k):
  # to convert dataframe into array
  song_list = (song_data['song']).to_list()
  # to check if song selected by user is available?
  if song_name in song_list :
     print("Song "+"'"+song_name+"'"+" is available")
     song_index = (song_list.index(song_name))
     # total listen count of the song which is selected by user
     song_listen_count = (song_data['listen_count'].iloc[song_index])
     new_distance_list = []
     for i in range(len(song_data)):
        if i != song_index :
          # calculate euclidean distance
          abs_distance = abs(song_listen_count -song_data['listen_count'][i])
          new_distance_list.append([abs_distance,song_data['song'][i]])
     # to sort distance list by ascending order
     new_distance_list = sorted(new_distance_list)
     print("Top " + str(k) + " Recommendation for you.......")
     for i in range(k):
          print(i+1,")",new_distance_list[i][1])
  else:
    print("Song "+"'"+song_name+"'"+" is not available")
    print("Top " + str(k) + " Recommendation for you.......")
    recommend_song = song_data[['song']].head(k)
    for i in range(k):
      print(i+1,")",recommend_song['song'][i])
k = 10
Music_Recommendation('Trahison By Vitalic', k)

Вывод (список 10 лучших рекомендуемых песен)

Github: https://github.com/17IT089/Music-Recommendation-System