[Stove AI] Машинное обучение 033 — Создание системы рекомендаций фильмов

машинное обучение искусственный интеллект Python алгоритм

[Stove AI] Машинное обучение 033 — Создание системы рекомендаций фильмов

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

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

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


1. Найдите похожих пользователей в наборе данных

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

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

def find_similar_users(dataset, user, user_num=3):
    if user not in dataset: # 首先保证user在dataset中
        raise TypeError('User {} not in dataset!'.format(user))
    
    # 对于所有用户,计算其与user的相似度,此处使用Pearson相关性
    scores=np.array([[other_user,pearson_score(dataset,user,other_user)] for 
                         other_user in dataset if other_user!=user])
    # 相关性都存放在scores这个二维矩阵中,故而可以通过排序来寻找相似用户
    scores_sorted=np.argsort(scores[:,1])[::-1] # 先排序取坐标,再逆序
    # 获取最前面的user_num个相似用户
    top_users=scores_sorted[:user_num]
    return scores[top_users] # 返回这些user的信息

После импорта данных movie_ratings рассчитайте 4 пользователей, наиболее похожих на Джона Карсона, следующим образом:

# 使用电影数据来寻找相似用户
import json
with open("E:\PyProjects\DataSet\FireAI\movie_ratings.json",'r') as file:
    dataset=json.loads(file.read())

user='John Carson'
similar_users=find_similar_users(dataset, user, 4)
print('Users similar to {}---->>>'.format(user))
print('User\t\t\tSimilarity Score\n')
for item in similar_users:
    print('{}\t\t{}'.format(item[0],round(float(item[1]),3)))

------------------------------------- потерять-- ----------------

Users similar to John Carson---->>> User Similarity Score

Michael Henry 0.991 Alex Roberts 0.747 Melissa Jones 0.594 Jillian Hobart 0.567

--------------------------------------------Заканчивать----- ------------------


2. Создайте механизм рекомендаций фильмов

Предположим, что теперь у нас есть несколько оценок пользователей для определенных фильмов, как тогда создать механизм рекомендации фильмов? Рекомендовать другие не просмотренные, но актуальные фильмы пользователям, которые уже видели некоторые из фильмов?

Эти данные о рейтингах фильмов хранятся в файле movie_ratings.json.Первый слой этого файла — это имя пользователя, а второй слой — это имя фильма и оценка, которую пользователь дал фильму. Внутренняя логика рекомендации фильмов пользователю А состоит в том, чтобы сначала найти нескольких пользователей, которые очень похожи на пользователя А, а затем найти набор фильмов, которые эти похожие пользователи оценили, но не оценил пользователь А. Эти фильмы показывают, что пользователь А не оценил. смотрели их, но другие похожие пользователи видели его, фильмы, которые мы рекомендуем, выбраны из этой коллекции фильмов, так как вы выбираете? Критерий выбора должен быть построен.В это время мы можем рассчитать рейтинг рекомендации фильма, который получается путем умножения сходства и балла оценки фильма. Можно считать, что чем выше схожесть, тем больше рекомендованных ими просмотренных фильмов, и чем выше оценки этих пользователей, чем выше качество, тем больше рекомендуется пользователю А.

Основываясь на приведенной выше логике, написанный код выглядит следующим образом:

# 创建电影推荐引擎
def get_recommendations(dataset,user):
    if user not in dataset: # 首先保证user在dataset中
        raise TypeError('User {} not in dataset!'.format(user))
    
    total_scores={} # 存放的key为电影名称,value为对该电影的评价乘以相似度
    similarity_sums={} # 存放的key为电影名称,value为相似度
    for other_user in dataset:
        if other_user ==user: continue  # 确保是其他用户而非自身
        similarity_score=pearson_score(dataset,user, other_user) 
#         print('other user: ', other_user, 'similarity: ', similarity_score)
        if similarity_score<=0: continue # 如果相似度太小则忽略
        
        # 找到还未被该用户评分,但是却被other_user评分过的电影
        # 这部分电影表示相似的other_ser已经看过但是user没有看过的电影,
        # 推荐的电影肯定来自于这部分
        user_not_rating_movies=[]
        for movie in dataset[other_user]: # other_user评分过的电影
#             if movie not in dataset[user] or dataset[user][movie]==0: 
            if movie not in dataset[user]: 

                # 但是user没有评分过,或者user评分为0(是不是系统认为没有评分那评分就是0))
                user_not_rating_movies.append(movie)
#         print(user_not_rating_movies)
        # 计算这些user没有评分过的电影的推荐分数,
        # 推荐分数此处用该电影的评价乘以相似度表示
        for movie in user_not_rating_movies:
            recommend_score=dataset[other_user][movie]*similarity_score
            total_scores.update({movie: recommend_score})
            similarity_sums.update({movie: similarity_score})
#         print('other user: ', other_user, 'total_scores: ', total_scores)
    # 判断total_scores,如果推荐的总数为0,表示所有电影都被user评价过,则不推荐
    if len(total_scores) ==0: return [[0,'No Recommendations']]
    
    # 计算每个电影的推荐等级
    movie_ranks=np.array([[rec_score/similarity_sums[movie],movie] for 
                         movie, rec_score in total_scores.items()])
    # 对第一列进行逆序排列
    movie_ranks_desc=movie_ranks[np.argsort(movie_ranks[:,0])[::-1]]
#     print(movie_ranks_desc)
    return movie_ranks_desc

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

import json
with open("E:\PyProjects\DataSet\FireAI\movie_ratings.json",'r') as file:
    dataset=json.loads(file.read())

user='John Carson'
movie_ranks=get_recommendations(dataset,user)
print('Recommended movies to {}---->>>'.format(user))
for idx, recommend in enumerate(movie_ranks):
    print('{}: {}-->recommend score: {}'.format(idx, recommend[1], recommend[0]))

user='Michael Henry'
movie_ranks=get_recommendations(dataset,user)
print('Recommended movies to {}---->>>'.format(user))
for idx, recommend in enumerate(movie_ranks):
    print('{}: {}-->recommend score: {}'.format(idx, recommend[1], recommend[0]))

------------------------------------- потерять-- ----------------

Recommended movies to John Carson---->>>
0: No Recommendations-->recommend score: 0
Recommended movies to Michael Henry---->>>
0: Jerry Maguire-->recommend score: 3.0
1: Inception-->recommend score: 3.0
2: Anger Management-->recommend score: 2.0

--------------------------------------------Заканчивать----- ----------------

########################резюме########################## ######

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

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

#################################################################


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

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.