赞
踩
目 录
1.1设计背景..........................................................................................................
1.2项目流程图......................................................................................................
4 系统测试 13
4.3推荐结果 14
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_info的key索引数据
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神经网络模型的设计
2.使用全连接层或者卷积层进一步提取特征
3.将用户、电影多个数据的特征向量融合成一个向量表示,方便进行相似度计算
4.计算特征之间的相似度
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')
fc_sizes=[128, 64, 32]
model = Model(fc_sizes)
train(model)
2.输入数据集的数据,提取整个数据集的用户特征和电影特征。注意数据输入到模型前,要先转成内置的tensor类型并保证尺寸正确。
3.分别得到用户特征向量和电影特征向量,使用Pickle库保存字典形式的特征向量。
2.通过计算用户特征和其他电影特征向量的相似度,构建相似度矩阵。
3.对这些相似度排序后,选取相似度最大的几个特征向量,找到对应的电影ID,即得到推荐清单。
4.加入随机选择因素,从相似度最大的top_k结果中随机选取pick_num个推荐结果,其中pick_num必须小于top_k。
4.2保存结果
4.3推荐结果
因为添加了随机因素,所以这里每一次的运行结果都是随机从用户数据当中挑选一个用户进行推荐
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。