Этот тип системы рекомендаций используется во многих местах, таких как Netflix, Youtube, Amazon, Google, Spotify, Google News, Twitter, Facebook, Linked In и многих других.

Что такое рекомендательная система, которая встречается повсюду?

Сколько существует типов рекомендательных систем?

В чем разница между ними?

Эти ответы можно найти в моей предыдущей статье о рекомендательной системе (просто нажмите здесь).

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

  1. Совместная фильтрация на основе пользователей: при таком подходе рекомендации делаются на основе схожих интересов и вкусов пользователей.
  2. Совместная фильтрация на основе элементов: при таком подходе рекомендации делаются на основе сходства элементов.

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

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

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

Пример 1. Совместная фильтрация пользователей и пользователей на основе памяти.

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

  1. После сбора входных фильмов с их оценками, присвоенными входным пользователем, добавление правильного идентификатора фильма из набора данных фильмов во входные фильмы.
  2. Теперь выясняем пользователей, которые смотрели и оценивали те же фильмы, что и во входных фильмах.
  3. Создание фрейма данных подгруппы, в котором пользователи, похожие на пользователей ввода, индексируются с помощью идентификатора пользователя.
  4. Давайте теперь найдем такую ​​группу пользователей, у которой больше фильмов, общих для входящего пользователя, и в отсортированном формате, который дает хорошие рекомендации входящему пользователю.
  5. Здесь я использую корреляцию Пирсона, чтобы найти матрицу сходства пользователей.
  6. Найден коэффициент корреляции Пирсона для разных пользователей и входящего пользователя.
  7. Все корреляции разных пользователей с пользователем ввода хранятся во фрейме данных относительно идентификатора пользователя.
  8. Берутся рейтинги всех фильмов отобранных или лучших пользователей из полученных пользователей с наибольшим сходством с входными пользователями.
  9. Взвешенный рейтинг определяется путем умножения индекса сходства на рейтинги фильмов выбранными или ведущими пользователями.
  10. Затем два столбца, индекс сходства и взвешенные рейтинговые характеристики суммируются с индексными идентификаторами фильмов всех пользователей i, ... e, взвешенной суммой двух характеристик с учетом. их идентификатор фильма получен от выбранных пользователей.
  11. Наконец, средневзвешенный балл получается путем деления рейтинга (суммы) лучших пользователей на индекс (сумма) сходства лучших пользователей. Эти значения отсортированы, чтобы найти наиболее рекомендуемые фильмы для входящего пользователя.
  12. Все остальные детали выбранных фильмов могут быть извлечены из всех наборов данных фильмов, чтобы предоставить входящему пользователю богатый опыт с хорошими деталями для выбора просмотра. Этот окончательный фрейм данных можно найти под кодом.
#2.Finding the users
ratings_df[ratings_df[‘movieId’].isin(inputMovies[‘movieId’].tolist())]
# 3.Using gropuby for indexing the data with similar user id's
userSubsetGroup = userSubset.groupby(['userId'])
#example to find one such user
userSubsetGroup.get_group(37)
#4.Sorting it so users with movie more in common with the input user will have priority
userSubsetGroup = sorted(userSubsetGroup,  key=lambda x: len(x[1]), reverse=True)
#6.finding pearson correlation between users and input user
#Store the Pearson Correlation in a dictionary, where the key is the user Id and the value is the coefficient
pearsonCorrelationDict = {}
#For every user group in our subset
for name, group in userSubsetGroup:
    #Let's start by sorting the input and current user group so the values aren't mixed up later on
    group = group.sort_values(by='movieId')
    inputMovies = inputMovies.sort_values(by='movieId')
    #Get the N for the formula
    nRatings = len(group)
    #Get the review scores for the movies that they both have in common
    temp_df = inputMovies[inputMovies['movieId'].isin(group['movieId'].tolist())]
    #And then store them in a temporary buffer variable in a list format to facilitate future calculations
    tempRatingList = temp_df['rating'].tolist()
    #Let's also put the current user group reviews in a list format
    tempGroupList = group['rating'].tolist()
    #Now let's calculate the pearson correlation between two users, so called, x and y
    Sxx = sum([i**2 for i in tempRatingList]) - pow(sum(tempRatingList),2)/float(nRatings)
    Syy = sum([i**2 for i in tempGroupList]) - pow(sum(tempGroupList),2)/float(nRatings)
    Sxy = sum( i*j for i, j in zip(tempRatingList, tempGroupList)) - sum(tempRatingList)*sum(tempGroupList)/float(nRatings)
    
    #If the denominator is different than zero, then divide, else, 0 correlation.
    if Sxx != 0 and Syy != 0:
        pearsonCorrelationDict[name] = Sxy/sqrt(Sxx*Syy)
    else:
        pearsonCorrelationDict[name] = 0
# To check the output of correlation
pearsonCorrelationDict.items()
# 8.selected users ratings of all movies
topUsersRating=topUsers.merge(ratings_df, left_on='userId', right_on='userId', how='inner')
topUsersRating.head()
#10.Applies a sum to the topUsers after grouping it up by userId
tempTopUsersRating = topUsersRating.groupby('movieId').sum()[['similarityIndex','weightedRating']]
tempTopUsersRating.columns = ['sum_similarityIndex','sum_weightedRating']
tempTopUsersRating.head()
#11.Now we have the weighted average
recommendation_df['weighted average recommendation score'] = tempTopUsersRating['sum_weightedRating']/tempTopUsersRating['sum_similarityIndex']
recommendation_df['movieId'] = tempTopUsersRating.index
recommendation_df.head()
#12.Final dataframe with recommended movie deatils from the selected users 
movies_df.loc[movies_df['movieId'].isin(recommendation_df.head(10)['movieId'].tolist())]

Пример 2. Реализация на основе модели, совместная фильтрация на основе элементов.

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

Здесь я использовал модель KNN, чтобы давать рекомендации, когда один пользователь смотрел фильм определенного жанра.

Рекомендации для вышеперечисленного выглядят следующим образом:

Более подробный код и прогнозы на основе фильмов можно найти в этой записной книжке Jupyter в репозитории Github. Щелкните здесь, чтобы проверить это.

Каждая борьба в вашей жизни сформировала из вас того человека, которым вы являетесь сегодня. Благодарен за сегодня и всегда готов к завтрашнему дню. Единственное невозможное путешествие - это то, чего вы не начали. Так что просто сделай это и сделай это.

Если вы узнали что-то, просто дайте мне знать, проявив некоторую поддержку, и поделитесь этим с кем-нибудь полезным. Если у вас есть какие-либо вопросы или что-то еще, дайте мне знать в поле для комментариев. Подарите миру немного света. Хорошего дня. 🥰🕊🤍