基于python的个性化电影推荐系统

目 录

1 绪论

    1.1设计背景..........................................................................................................

    1.2项目流程图......................................................................................................

2 相关知识简介  2

3 项目设计 3

3.1数据处理 3

3.2神经网络模型设计 6

3.3模型训练 8

3.4启动训练 9

3.5保存特征 9

3.6根据用户喜好推荐电影 10

4 系统测试 13

4.1模型训练结果 13

4.2保存结果 13

4.3推荐结果 14

1、绪论

1.1项目背景

当今互联网趋势下,实体服务行业越来越倾向于与线上的互联网进行深度合作,讲究服务以质量取胜、以人性化、个性化取胜。故在这样的背景下,以传统的打广告的模式来吸引观众去电影院看电影的方式在逐渐被更智能化、更具有针对性的精准推送的线上方式所取代。而如今的推荐系统也非常多样,原理不同,推荐结果也会有所差异,准确率也会有细微的区别,为了更好地服务喜欢看电影的观众,于是便使用ml-1m电影推荐数据集结合神经网络模型对用户的评论进行分析以此来推测用户喜欢的电影类型,并对其推荐其可能会喜欢的电影。

1.1项目流程图

 

2、相关知识简介 

神经网络模型:由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。神经网络具有大规模并行、分布式存储和处理、自组织、自适应和自学能力,特别适合处理需要同时考虑许多因素和条件的、不精确和模糊的信息处理问题。神经网络的发展与神经科学、数理科学、认知科学、计算机科学、人工智能、信息科学控制论、机器人学、微电子学、心理学、光计算、分子生物学等有关,是一门新兴的边缘交叉学科

全连接层:全连接层在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现。

卷积层:卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。

3项目设计

简单查看一下数据确认数据无误之后然后就可以开始了

 

3.1数据处理

  1. 读取用户数据,存储到字典

 

2.读取电影数据,存储到字典

 

3.读取评分数据,存储到字典

# 获得评分数据
def get_rating_info(self, path):
    # 读取文件里的数据
    with open(path, 'r') as f:
        data = f.readlines()
    # 将数据保存在字典中并返回
    rating_info = {}
    for item in data:
        item = item.strip().split("::")
        usr_id, movie_id, score = item[0], item[1], item[2]

        if usr_id not in rating_info.keys():
            rating_info[usr_id] = {movie_id: float(score)}
        else:
            rating_info[usr_id][movie_id] = float(score)

    return rating_info

4.将各个字典中的数据拼接,形成数据读取器

# 创建数据集,把读取并处理后的数据整合到一起
def get_dataset(self, usr_info, rating_info, movie_info):
    trainset = []
    # rating_infokey索引数据
    for usr_id in rating_info.keys():
        usr_ratings = rating_info[usr_id]
        for movie_id in usr_ratings:
            trainset.append({'usr_info': usr_info[usr_id],
                             'mov_info': movie_info[movie_id],
                             'scores': usr_ratings[movie_id]})
    return trainset

5.划分训练集和验证集,生成迭代器,每次提供一个批次的数据

 

3.2神经网络模型的设计

  1. 分别将用户、电影的多个特征数据转换成特征向量

 

 

2.使用全连接层或者卷积层进一步提取特征

 

3.将用户、电影多个数据的特征向量融合成一个向量表示,方便进行相似度计算

 

4.计算特征之间的相似度

 

3.3模型优化

化器使用Adam,学习率设置为0.01,一共训练5个epoch。 用评分数据作为监督信息,神经网络的输出作为预测值,使用均方差(Mean Square Error)损失函数去训练网络模型。

def train(model):
   # 配置参数
   lr = 0.001
   epoches = 10
   paddle.set_device('cpu')
   # 开始训练
   model.train()
   # 获取数据读取器
   data_loader = model.train_loader
   # 设置Adam优化器
   opt = paddle.optimizer.Adam(learning_rate=lr, parameters=model.parameters())

   for epo in range(epoches):
       for idx, data in enumerate(data_loader()):
           # 获取数据,转换为tensor格式
           usr, mov, score = data
           usr_var = [paddle.to_tensor(var) for var in usr]
           mov_var = [paddle.to_tensor(var) for var in mov]
           scores_label = paddle.to_tensor(score)
           # 获得前向计算结果
           _, _, scores_predict = model(usr_var, mov_var)
           loss = F.square_error_cost(scores_predict, scores_label)
           avg_loss = paddle.mean(loss)
           if idx % 500 == 0:
               print("epoch: {}, batch_id: {}, loss: {}".format(epo, idx, avg_loss.numpy()))

           # 损失函数下降,并清除梯度
           avg_loss.backward()
           opt.step()
           opt.clear_grad()
       # 每个epoch保存一次模型
       paddle.save(model.state_dict(), './checkpoint/epoch' + str(epo) + '.pdparams')

3.4启动训练

fc_sizes=[128, 64, 32]
model = Model(fc_sizes)
train(model)

3.5保存特征

  1. 加载预训练好的模型参数。

 

2.输入数据集的数据,提取整个数据集的用户特征和电影特征。注意数据输入到模型前,要先转成内置的tensor类型并保证尺寸正确。

 

3.分别得到用户特征向量和电影特征向量,使用Pickle库保存字典形式的特征向量。

 

3.6根据用户喜好推荐电影

  1. 读取保存的特征,根据一个给定的用户ID、电影ID,我们可以索引到对应的特征向量。

 

2.通过计算用户特征和其他电影特征向量的相似度,构建相似度矩阵。

 

3.对这些相似度排序后,选取相似度最大的几个特征向量,找到对应的电影ID,即得到推荐清单。

 

4.加入随机选择因素,从相似度最大的top_k结果中随机选取pick_num个推荐结果,其中pick_num必须小于top_k。


4系统测试

 

4.1模型训练结果

 

4.2保存结果

 

4.3推荐结果

因为添加了随机因素,所以这里每一次的运行结果都是随机从用户数据当中挑选一个用户进行推荐

 

  • 7
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值