什么是推荐系统(电影推荐模型)

一、推荐系统相关

互联网上有海量的信息工人选择使用,也正是面临这种大量信息使人选择起来耗费大量时间精力或者不知怎么选择。推荐系统本质上一种信息过滤工程,使用一定的计算方法将不太可能让人产生行为的信息过滤掉,对偶的来说也就是保留推荐大概率会让人产生行为的信息。

现在的推荐系统主要思路有基于内容、协同过滤、混合系统
(1)基于内容:针对用户之前的行为,推荐与之前内容相似的信息,使用户再次产生行为。
(2)协同过滤:相似的人往往会对类似的信息感兴趣,通过相似用户的行为进行推荐
(3)混合:即将以上两种方式融合

推荐的流程框架:
(1)召回:从数据中快速产生一个候选集
(2)计分:对候选集进行评分和排序
(3)重排:考虑其他的限制(如用户已经标注不喜欢)进行最后排序

搭建步骤:
(1)准备数据
(2)选择算法
目前主流的推荐算法使预估点击率的算法,GBDT、LR、FM(因子分解)、FFM(基于域的因子分解)、XGBoost、nn
(3)模型训练
(4)效果评估

二、实现一个电影推荐系统
这里实现一个电影推荐系统。基本思路是:行为相似的用户具有相似的喜好,通过对比用户对同一部电影的评价得到喜好相近的用户,再将此用户评价高的电影推荐给他的相似用户,实现推荐。
(1)模型1

#导入库
import os
import json
import random
import math
import re

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
import seaborn as sns

import warnings
warnings.filterwarnings('ignore')

数据为json格式,内容为用户ID、电影ID以及电影评分

#将json数据读入字典
train = dict()
train = json.load(open('train.json'))

构造皮尔逊相关系数,通过两个用户对电影评分的打分情况计算两个用户的喜好相近程度

#皮尔逊相关系数函数
def pearson(rating1,rating2):
    sum_xy = 0
    sum_x = 0
    sum_y = 0
    sum_x2 = 0
    sum_y2 = 0
    num = 0
    
    #循环两个用户的电影评分
    for key in rating1.keys():
        if key in rating2.keys():
            num += 1
            x = rating1[key] #用户1评分
            y = rating2[key] #用户2评分
            sum_xy += x * y
            sum_x += x
            sum_y += y
            sum_x2 += math.pow(x, 2)
            sum_y2 += math.pow(y, 2)
    if num == 0:
        return  0
        # 皮尔逊相关系数分母
    denominator = math.sqrt(sum_x2-math.pow(sum_x, 2) / num) * math.sqrt( sum_y2-math.pow(sum_y, 2) / num)
    if denominator == 0:
        return  0
    else:
        return (sum_xy-(sum_x*sum_y) / num) / denominator

用户推荐函数,通过相关性可以将用户给高分的电影推荐给相关性强的用户

#用户ID推荐
def recommend_1(userID, k=15): 
    
    neighborUser = dict()
    for user in train.keys():
        if userID != user:
            distance = pearson(train[userID], train[user]) #计算相关性
            neighborUser[user]=distance
    #字典排序
    newNU = sorted(neighborUser.items(), key=lambda k:k[1], reverse=True)

    movies = dict()
    for (sim_user, sim) in newNU[:k]:
        for movieID in train[sim_user].keys():
            movies.setdefault(movieID, 0)
            movies[movieID] += sim * train[sim_user][movieID]
    newMovies = sorted(movies.items(), key=lambda  k:k[1], reverse=True)
    return newMovies

模型使用

#计算两个用户的相似度
pearson_r = pearson(train['1738198'], train['428296'])
pearson_r

#给用户推荐电影
recommend_movies = recommend_1('1738198')
recommend_movies

(2)模型2
模型1的数据是已经被整理过的json数据,模型2使用未被整理的数据

#用户评分数据
df = pd.read_csv('combined_data_1.txt', header=None, names=['customer_id', 'rating', 'date'], usecols=[0, 1]) #读取数据
df['rating'] = df['rating'].astype(float) #将rating列转为字符串

#电影信息数据
df_title = pd.read_csv('movie_titles.csv',
                       encoding="ISO-8859-1", header=None, names=['movie_id', 'year', 'name'])
df_title.set_index('movie_id', inplace = True)

截取部分数据,减小运算压力,df = df[:1000000]

#各分数频数
p = df.groupby('rating')['rating'].agg(['count'])

#通过计算数据中的缺失列得到电影数
movie_count = df.isnull().sum()[1]

#计算用户个数
cust_count = df['customer_id'].nunique() - movie_count

#计算评分个数(总数据减去电影数)
rating_count = df['customer_id'].count() - movie_count

#画出每个评分在数据中的占比
ax = p.plot(kind='barh', legend = False, figsize = (10, 5))
plt.title('{:,} 个电影, {:,} 个用户, {:,} 条记录'.format(movie_count, cust_count, rating_count))
plt.axis('off')
for i in range(1,6):
    ax.text(p.iloc[i-1][0]/4, i-1, 'Rating {}: {:.0f}%'.format(i, p.iloc[i-1][0]*100 / p.sum()[0]), color='white', weight='bold')
#通过空值否将数据转为布尔值
df_nan = pd.DataFrame(pd.isnull(df.rating))
#取出布尔值为真的行(没有评分的行)
df_nan = df_nan[df_nan['rating'] == True]
#没有评分的行为电影ID
df_nan = df_nan.reset_index()

movie_np = []
movie_id = 1

#
for i,j in zip(df_nan['index'][1:], df_nan['index'][:-1]):
    # numpy approach
    temp = np.full((1, i-j-1), movie_id)
    movie_np = np.append(movie_np, temp)
    movie_id += 1

# Account for last record and corresponding length
# numpy approach
last_record = np.full((1,len(df) - df_nan.iloc[-1, 0] - 1), movie_id)
movie_np = np.append(movie_np, last_record)

# 将电影ID列取出
df = df[pd.notnull(df['rating'])]
#放入数据
df['movie_id'] = movie_np.astype(int)
df['customer_id'] = df['customer_id'].astype(int)

f = ['count', 'mean']

#计算频数和均值
df_movie_summary = df.groupby('movie_id')['rating'].agg(f)
df_movie_summary.index = df_movie_summary.index.map(int)
#剔除数少数movie
movie_benchmark = round(df_movie_summary['count'].quantile(0.8), 0)
drop_movie_list = df_movie_summary[df_movie_summary['count'] < movie_benchmark].index

#剔除少数customer
df_cust_summary = df.groupby('customer_id')['rating'].agg(f)
df_cust_summary.index = df_cust_summary.index.map(int)
cust_benchmark = round(df_cust_summary['count'].quantile(0.8),0)
drop_cust_list = df_cust_summary[df_cust_summary['count'] < cust_benchmark].index

将数据pivot转为,行为用户ID,列为电影ID,数值为评分,行列计算相关性

#将数据pivot,转为用户为行,电影为列
df_p = pd.pivot_table(df, values='rating', index='customer_id', columns='movie_id')

定义推荐函数

def recommend_2(movie_title, min_count):
    print('依据电影:{}'.format(movie_title))
    print('10部推荐电影:')
    
    #依据电影名取出电影ID
    i = int(df_title.index[df_title['name'] == movie_title][0])
    #放入矩阵得到分数
    target = df_p[i]
    #计算相关性
    similar_to_target = df_p.corrwith(target)
    #生成DataFrame
    corr_target = pd.DataFrame(similar_to_target, columns=['pearson_r'])
    corr_target.dropna(inplace = True)
    #降序重排
    corr_target = corr_target.sort_values('pearson_r', ascending = False)
    corr_target.index = corr_target.index.map(int)
    corr_target = corr_target.join(df_title).join(df_movie_summary)[['pearson_r', 'name', 'count', 'mean']]
    #选取10相关性最强
    print(corr_target[corr_target['count']>min_count][:10].to_string(index=False))

recommend_2(‘Love Reinvented’, 0),使用推荐函数进行推荐

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本教程为官方授权出品伴随着大数据时代的到来,作为发掘数据规律的重要手段,机器学习已经受到了越来越多的关注。而作为机器学习算法在大数据上的典型应用,推荐系统已成为各行业互联网公司营销体系中不可或缺的一部分,而且已经带来了真实可见的收益。目前,推荐系统和机器学习已经成为各大公司的发力重点,众多知名公司(如亚马逊、netflix、facebook、阿里巴巴、京东、腾讯、新浪、头条等)都在着眼于将蕴含在庞大数据中的宝藏发掘出来,懂机器学习算法的大数据工程师也成为了新时代最紧缺的人才。精心打造出了机器学习与推荐系统课程,将机器学习理论与推荐系统项目实战并重,对机器学习和推荐系统基础知识做了系统的梳理和阐述,并通过电影推荐网站的具体项目进行了实战演练,为有志于增加大数据项目经验、扩展机器学习发展方向的工程师提供更好的学习平台。本课程主要分为两部分,机器学习和推荐系统基础,与电影推荐系统项目实战。第一部分主要是机器学习和推荐系统基础理论的讲解,涉及到各种重要概念和基础算法,并对一些算法用Python做了实现;第二部分以电影网站作为业务应用场景,介绍推荐系统的开发实战。其中包括了如统计推荐、基于LFM的离线推荐、基于模型的实时推荐、基于内容的推荐等多个模块的代码实现,并与各种工具进行整合互接,构成完整的项目应用。通过理论和实际的紧密结合,可以使学员对推荐系统这一大数据应用有充分的认识和理解,在项目实战中对大数据的相关工具和知识做系统的回顾,并且可以掌握基本算法,入门机器学习这一前沿领域,为未来发展提供更多的选择,打开通向算法工程师的大门。谁适合学:1. 有一定的 Java、Scala 基础,希望了解大数据应用方向的编程人员2. 有 Java、Scala 开发经验,了解大数据相关知识,希望增加项目经验的开发人员3. 有较好的数学基础,希望学习机器学习和推荐系统相关算法的求职人员
### 回答1: 基于内容的推荐系统模型是一种用来为用户推荐内容的算法。这种算法会分析用户之前浏览过的内容,并根据这些内容的相似性来推荐新的内容给用户。例如,如果一个用户之前浏览过很多关于体育的新闻,那么基于内容的推荐系统可能会推荐更多关于体育的新闻给这个用户。基于内容的推荐系统的优点是能够提供精准的推荐,但是缺点是需要大量的用户浏览记录来训练模型,且它不能够发现新的内容。 ### 回答2: 基于内容的推荐系统模型是一种利用物品的特征和用户的兴趣进行推荐模型。它基于物品的内容信息,通过分析物品的属性和特征,来推测用户的兴趣和偏好,进而为用户提供个性化的推荐。 基于内容的推荐系统模型主要包含以下几个步骤: 1. 特征提取:对于每个物品,需要将其表示为一组特征向量。这些特征可以根据物品的内容信息来确定,比如电影可以包括导演、演员、类型等方面的特征。 2. 用户建模:需要将用户的兴趣建模为用户的特征向量。这些特征向量可以通过分析用户的历史行为数据得到,如浏览记录、购买记录等。 3. 特征匹配:通过计算物品特征向量和用户特征向量之间的相似度,来判断用户对物品的兴趣程度。通常使用余弦相似度等度量方式来计算相似度。 4. 推荐生成:根据用户的兴趣程度和相似度,从物品库中选择与用户特征最为匹配的物品作为推荐结果。 基于内容的推荐系统模型的优点是可以为用户提供更加个性化的推荐,更加准确地满足用户的需求;同时,该模型不依赖于其他用户的行为数据,适用于新用户和冷启动问题。然而,由于该模型主要基于物品的特征,可能无法发现用户潜在的兴趣和偏好,也容易陷入推荐类似的物品的局限性。因此,可以结合其他推荐算法如协同过滤算法等,提高推荐的多样性和准确性。 ### 回答3: 基于内容的推荐系统模型使用物品的特征和用户历史行为来生成个性化推荐。其基本流程包括特征提取、相似度计算和推荐候选生成。 首先,模型需要对物品进行特征提取。常用的方法有统计特征、文本特征、图像特征等。例如,对于文章推荐系统,可以提取文章的关键词、主题、情感等特征。 接下来,通过计算物品之间的相似度来确定物品的相关性。常用的相似度计算方法包括余弦相似度、欧氏距离等。以用户历史浏览记录为例,可以根据用户浏览的物品特征与其他物品特征的相似程度来衡量它们的相关性。 最后,根据用户的偏好和历史行为,生成推荐候选。根据用户的喜好和物品的相似度,将相似度较高的物品推荐给用户。推荐候选可以通过基于规则的方法,如最热门、最新的物品,也可以通过机器学习的方法,如协同过滤、基于内容的推荐等来生成。 基于内容的推荐系统模型的优点是可以为用户提供个性化的推荐,因为模型考虑了物品的特征和用户的历史行为。然而,该模型的缺点是可能存在歧义性和局限性,因为模型只考虑了物品的特征,而没有考虑到其他用户的喜好和互动信息。因此,在实际应用中,通常需要与其他推荐算法相结合,以提高推荐效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值