python推介系统方法_基于AutoRec 的推荐系统介绍与python实现
本文要介绍的模型是2015年由澳大利亚国立大学提出的AutoRec。它将自编码器(AutoEncoder) 的思想和协同过滤结合,提出了一种但隐藏层的神经网络推荐model。因为简洁的网络结构和清晰易懂的模型原理,所以非常适合深度学习的推荐model 的入门模型来学习
本文参考了王喆大佬的新书,《深度学习推荐系统》
1.引言
协同过滤模型的目的是利用用户对商品的偏好信息来提供个性化的推荐。AutoRec是一个新型的基于自动编码器的协同过滤模型。论文作者认为AutoRec与现有的将玻尔兹曼机用于协同过滤的神经方法相比具有表征和计算上的优势,并从经验上证明了AutoRec优于当前最先进的方法
2.自编码器模型
在基于评分的协同过滤中,假设有m个用户,n个物品,并且有一个用户-物品的评分矩阵
。每个用户向量u∈U={1.....m}可以被向量
表示
3.AutoRec模型的结构
下图为AutoRec的结构图,从图中可以看出,网络的输入层是物品的评分向量r,输出层是一个多分类层、蓝色的神经元代表模型的k维单隐层,其中k<
AutoRec模型的结构图
以上介绍的AutoRec输入向量是物品的评分向量,因此可称为I-AutoRec(Item based AutoRec).
4.推荐过程
基于AutoRec 模型的推荐过程并不复杂,当输入物品i 的评分向量为
时,模型输出向量
就是所有用户对物品i 的评分预测。那么。其中的第 u 维就是用户对物品i 的预测
=
。
之后通过遍历输入物品向量就可以得到用户 u 对所有物品的评分预测,进而根据评分预测排序得到推荐列表。
与 CF 一样 AutoRec 也分为 U - AutoRec 和 I - AutoRec
5.AutoRec模型的特点和局限性
AutoRec模型使用一个单隐层的AutoEncoder泛化用户或物品评分,使模型具有一定的泛化和表达能力。由于AutoRec模型的结构比较简单,使其存在一定的表达能力不足的问题。
从深度学习的角度来说,AutoRec模型的提出,拉开了使用深度学习的思想解决推荐问题的序幕,为复杂深度学习网络的构建提供了思路。
6.基于ml-1m 数据集测试
data 处理部分
import numpy as np
import argparse
import math
def get_data(path, num_users, num_items, num_total_ratings, train_ratio):
fp = open(path + "ratings.dat")
user_train_set = set()
user_test_set = set()
item_train_set = set()
item_test_set = set()
train_r = np.zeros((num_users, num_items))
test_r = np.zeros((num_users, num_items))
train_mask_r = np.zeros((num_users, num_items))
test_mask_r = np.zeros((num_users, num_items))
random_perm_idx = np.random.permutation(num_total_ratings)
train_idx = random_perm_idx[0:int(num_total_ratings * train_ratio)]
test_idx = random_perm_idx[int(num_total_ratings * train_ratio):]
lines = fp.readlines()
for itr in train_idx:
line = lines[itr]
user, item, rating, _ = line.split("::")
user_idx = int(user) - 1
item_idx = int(item) - 1
train_r[user_idx, item_idx] = int(rating)
train_mask_r[user_idx, item_idx] = 1
user_train_set.add(user_idx)
item_train_set.add(item_idx)
for itr in test_idx:
line = lines[itr]
user, item, rating, _ = line.split("::")
user_idx = int(user) - 1
item_idx = int(item) - 1
test_r[user_idx, item_idx] = int(rating)
test_mask_r[user_idx, item_idx] = 1
user_test_set.add(user_idx)
item_test_set.add(item_idx)
return train_r, train_mask_r, test_r, test_mask_r, user_train_set, item_train_set, user_test_set, item_test_set
model 部分
import torch
import torch.nn as nn
import numpy as np
from torch.autograd import variable
from recommend.auto_rec.data import get_data
import math
import time
import argparse
import torch.utils.data as Data
import torch.optim as optim
class Autorec(nn.Module):
def __init__(self, args, num_users, num_items):
super(Autorec, self).__init__()
self.args = args
self.num_users = num_users
self.num_items = num_items
self.hidden_units = args.hidden_units
self.lambda_value = args.lambda_value
self.encoder = nn.Sequential(
nn.Linear(self.num_items, self.hidden_units),
nn.Sigmoid()
)
self.decoder = nn.Sequential(
nn.Linear(self.hidden_units, self.num_items),
)
def forward(self, torch_input):
encoder = self.encoder(torch_input)
decoder = self.decoder(encoder)
return decoder
def loss(self, decoder, input, optimizer, mask_input):
cost = 0
temp2 = 0
cost += ((decoder - input) * mask_input).pow(2).sum()
rmse = cost
for i in optimizer.param_groups:
for j in i['params']:
# print(type(j.data), j.shape,j.data.dim())
if j.data.dim() == 2:
temp2 += torch.t(j.data).pow(2).sum() # 正则化项
cost += temp2 * self.lambda_value * 0.5
return cost, rmse
def train(self, epoch):
RMSE = 0
cost_all = 0
for step, (batch_x, batch_mask_x, batch_y) in enumerate(loader):
# batch_x = batch_x.type(torch.FloatTensor).cuda()
# batch_mask_x = batch_mask_x.type(torch.FloatTensor).cuda()
batch_x = batch_x.type(torch.FloatTensor)
batch_mask_x = batch_mask_x.type(torch.FloatTensor)
decoder = rec(batch_x)
loss, rmse = rec.loss(decoder=decoder, input=batch_x, optimizer=optimer, mask_input=batch_mask_x)
optimer.zero_grad()
loss.backward()
optimer.step()
cost_all += loss
RMSE += rmse
RMSE = np.sqrt(RMSE.detach().cpu().numpy() / (train_mask_r == 1).sum())
print('epoch ', epoch, ' train RMSE : ', RMSE)
def test(self, epoch):
# test_r_tensor = torch.from_numpy(test_r).type(torch.FloatTensor).cuda()
# test_mask_r_tensor = torch.from_numpy(test_mask_r).type(torch.FloatTensor).cuda()
test_r_tensor = torch.from_numpy(test_r).type(torch.FloatTensor)
test_mask_r_tensor = torch.from_numpy(test_mask_r).type(torch.FloatTensor)
decoder = rec(test_r_tensor)
# decoder = torch.from_numpy(np.clip(decoder.detach().cpu().numpy(),a_min=1,a_max=5)).cuda()
unseen_user_test_list = list(user_test_set - user_train_set) # 得到未出现在训练集中的用户列表
unseen_item_test_list = list(item_test_set - item_train_set) # 得到未出现在训练集中的电影列表
for user in unseen_user_test_list:
for item in unseen_item_test_list:
if test_mask_r[user, item] == 1: # 如果在测试集中存在这条评分记录,则进行记录decoder[user,item]=3
decoder[user, item] = 3
mse = ((decoder - test_r_tensor) * test_mask_r_tensor).pow(2).sum()
RMSE = mse.detach().cpu().numpy() / (test_mask_r == 1).sum()
RMSE = np.sqrt(RMSE)
print('epoch ', epoch, ' test RMSE : ', RMSE)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='I-AutoRec ')
parser.add_argument('--hidden_units', type=int, default=500) # 默认隐藏层单元数为500
parser.add_argument('--lambda_value', type=float, default=1)
parser.add_argument('--train_epoch', type=int, default=100) # 训练次数默认为100次
parser.add_argument('--batch_size', type=int, default=100) # batch_size 默认为100
parser.add_argument('--optimizer_method', choices=['Adam', 'RMSProp'], default='Adam') # 默认使用Adam优化
parser.add_argument('--grad_clip', type=bool, default=False)
parser.add_argument('--base_lr', type=float, default=1e-3) # 基础学习率设为1e-3
parser.add_argument('--decay_epoch_step', type=int, default=50, help="decay the learning rate for each n epochs")
parser.add_argument('--random_seed', type=int, default=1000) # 随机数种子默认设为1000
parser.add_argument('--display_step', type=int, default=1)
args = parser.parse_args()
np.random.seed(args.random_seed)
data_name = 'ml-1m'
num_users = 6040
num_items = 3952
num_total_ratings = 1000209
train_ratio = 0.9 # 90%为训练集
path = "../data/%s" % data_name + "/"
train_r, train_mask_r, test_r, test_mask_r, user_train_set, item_train_set, user_test_set, \
item_test_set = get_data(path, num_users, num_items, num_total_ratings, train_ratio)
args.cuda = False # 垃圾笔记本只能用cpu强行跑。。。
rec = Autorec(args, num_users, num_items)
# if args.cuda:
# rec.cuda()
optimer = optim.Adam(rec.parameters(), lr=args.base_lr, weight_decay=1e-4)
num_batch = int(math.ceil(num_users / args.batch_size))
torch_dataset = Data.TensorDataset(torch.from_numpy(train_r), torch.from_numpy(train_mask_r),
torch.from_numpy(train_r))
loader = Data.DataLoader(
dataset=torch_dataset,
batch_size=args.batch_size,
shuffle=True
)
for epoch in range(args.train_epoch):
rec.train(epoch=epoch)
rec.test(epoch=epoch)
引用:
王喆老师的深度学习推荐系统
原文链接:https://blog.csdn.net/zhuhongming123/article/details/106565025
python推介系统方法_基于AutoRec 的推荐系统介绍与python实现相关推荐
- python 儿童 游戏_儿童编程教学 – 推荐几款Python编程类游戏
自学过编程的小伙伴都知道,在学习的过程中,不仅仅要记下很多的知识点,而且那些知识点,都是非常的干,很干,很干,没有一点乐趣的感觉-.. 所以在很多人学习 在玩游戏的过程中就能学习到编程的网站! 支持多 ...
- 小学生python编程写游戏_小学生开始学Python,开发AI的首选编程语言:推荐一波Python书单...
AlphaGo 都在使用的 Python 语言,是最接近 AI 的编程语言. 教育部考试中心近日发布了"关于全国计算机等级(NCRE)体系调整"的通知,决定自2018年3月起,在全 ...
- python神经网络多元函数_阿里达摩院推荐的最新400集python教程,据说懂中文就能上手...
小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 为了吸取教训,小编一定要分享一下攻略,"怎样获得小编分享的教程 ...
- python有什么用处案例_为什么大家都推荐你学python?看完这5个例子就明白了!...
为什么大家都推荐你学Python?而不是C语言或者是JAVA呢? 因为-- python很灵活,一定程度上函数也可以传参和注入,所以代码的灵活性要大的多. python自带了函数的curry化以及迟滞 ...
- python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...
Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...
- python名片识别_基于Python的名片识别接口调用代码实例
基于Python的名片识别接口调用代码实例 代码描述:基于Python的名片识别接口调用代码实例 #!/usr/bin/python # -*- coding: utf-8 -*- import js ...
- python空间数据处理_基于Python语言的空间数据处理
龙源期刊网 http://www.doczj.com/doc/7b0e0476172ded630a1cb662.html 基于Python语言的空间数据处理 作者:何丽娴甘淑陈应跃 来源:<价值 ...
- 推荐系统_基于内容的推荐
关于推荐系统的算法大概可以分类两类: 一类就是基于用户或者基于商品的协同过滤,我们主要是通过用户行为这个海量数据来挖掘出用户在品味上的一些相似程度,或者说 商品的相似程度,然后我们在利用相似性来进行推 ...
- 电影推荐系统 python简书_基于django和协同过滤/cnn的电影推荐系统
技术前端: bootstrap3 + vue + jquery 后端: django 2.2.1 +djangorestframework (MVC框架) 数据库: mysql 数据集: 1. 豆瓣数 ...
最新文章
- Curl 采集乱码 gzip 原因及解决方案 utf-8
- 深入理解java类加载
- Gson简要使用笔记
- 开源混合云:harvester混合应用架构
- C++的cin和cout取消同步
- 微博 Android 启动广告,使用Xposed去除微博国际版的启动广告
- 产品经理能力产品经理工作积累(3)
- ubuntu下vim语法高亮问题
- JAVA学习之类与对象例题分享(两点确定直线并进行相关操作)
- 微信小程序中使用 web-view 内嵌 H5 时,登录问题的处理方法
- 华为数通VRRP配置实验
- 北航计算机学院复试流程,2018北航计算机考研复试经验
- easyui combobox设置只能选择下拉
- Android kotlin和java反编译后的smali 有什么区别?
- 华为副总裁的演讲,披露了华为在5G领域最新布局
- 教父三部曲观后感总结
- Linux下使用crontab来执行定时任务计划----执行每晚12点多执行移动log日志文件操作
- 关于openfire支持视频聊天
- torch.prob
- s盒c语言算法,AES加密算法中的S盒及其C语言实现
热门文章
- 心中的象牙塔:怎样才能拿到理想的教职offer?
- 想象中的论文答辩和真实的论文答辩,哈哈哈哈哈哈……
- 2019年9月全国程序员工资统计,看看你拖后腿了没?
- 【每日一英语】“baker's dozen”是“十几”呢?
- RasberryPi快速启动(适合首次接触树莓派学习者)
- ab串(要求a在b的右面)
- 将LSTM与word2vec结合实现中文自动写作
- python记录当前系统时间 生成照片直接命名
- ACNO.15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再
- 每个程序员都必须知道的 8 种数据结构