AutoRec模型是2015年由澳大利亚国立大学提出的。 它将 自编码器(AutoEncoder ) 的思想和协同过滤结合,提出了一种单隐层神经网络 推荐模型。因其简洁的网络结构和清晰易懂的模型原理,AutoRec非常适合作为 深度学习推荐模型的入门模型来学习。

一、AutoRec模型的基本原理

AutoRec模型是一个标准的自编码器,它的基本原理是利用协同过滤中的共 现矩阵,完成物品向量或者用户向量的自编码。再利用自编码的结果得到用户对 物品的预估评分,进而进行推荐排序。

协同过滤模型的目的是利用用户对商品的偏好信息来提供个性化推荐。AutoRec是一个新型的基于自动编码器的协同过滤模型。

基本原理是利用协同过滤中的共现矩阵,完成物品向量或用户向量的自编码。再利用自编码的结果得到用户对物品的预测评分,再进行排序,得到Top K。

代码

GitHub:NeWnIx5991/AutoRec-for-CF

import torch
import torch.nn as nn
import numpy as np
from torch.autograd import variable
from data import get_data
import math
import time
import argparse
import torch.utils.data as Data
import torch.optim as optimclass Autorec(nn.Module):def __init__(self,args, num_users,num_items):super(Autorec, self).__init__()self.args = argsself.num_users = num_usersself.num_items = num_itemsself.hidden_units = args.hidden_unitsself.lambda_value = args.lambda_valueself.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 decoderdef loss(self,decoder,input,optimizer,mask_input):cost = 0temp2 = 0cost += (( decoder - input) * mask_input).pow(2).sum()rmse = costfor 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.5return cost,rmsedef train(epoch):RMSE = 0cost_all = 0for 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()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 += lossRMSE += rmseRMSE = np.sqrt(RMSE.detach().cpu().numpy() / (train_mask_r == 1).sum())print('epoch ', epoch,  ' train RMSE : ', RMSE)def test(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()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] = 3mse = ((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)parser.add_argument('--lambda_value', type=float, default=1)parser.add_argument('--train_epoch', type=int, default=100)parser.add_argument('--batch_size', type=int, default=100)parser.add_argument('--optimizer_method', choices=['Adam', 'RMSProp'], default='Adam')parser.add_argument('--grad_clip', type=bool, default=False)parser.add_argument('--base_lr', type=float, default=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)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 = 6040num_items = 3952num_total_ratings = 1000209train_ratio = 0.9path = "./%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 = torch.cuda.is_available()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):train(epoch=epoch)test(epoch=epoch)



参考资料:
AutoRec: Autoencoders Meet Collaborative Filtering
AutoRec–单隐层神经网络推荐模型
推荐系统中的AutoRec
推荐模型AutoRec:原理介绍与TensorFlow2.0实现

排序层-深度模型-2015:AutoRec【单隐层神经网络推荐模型】相关推荐

  1. 神经网络与深度学习三:编写单隐层神经网络

    三:编写单隐层神经网络 1 神经网络概述 这篇文章你会学到如何实现一个神经网络,在我们深入学习技术细节之前,现在先大概快速的了解一下如何实现神经网络,如果你对某些内容不甚理解(后面的文章中会深入其中的 ...

  2. 深度学习笔记:手写一个单隐层的神经网络

    出处:数据科学家养成记 深度学习笔记2:手写一个单隐层的神经网络 笔记1中我们利用 numpy 搭建了神经网络最简单的结构单元:感知机.笔记2将继续学习如何手动搭建神经网络.我们将学习如何利用 num ...

  3. Python实现BP神经网络ANN单隐层回归模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 20世纪80年代中期,David Runelhart.Geoff ...

  4. Python实现BP神经网络ANN单隐层分类模型项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 BP(back propagation)神经网络是1986年由R ...

  5. 理解单隐层ReLU神经网络的全局损失

    摘要   对于单一隐层ReLU神经网络,我们展示在每个可微区间内都是全局极小值.这些局部极小是否唯一可微,取决于数据,隐藏神经元的激活模式,网络大小.我们给出一个是否局部极小值存在它们的定义的区域内的 ...

  6. 假设你有一个多层感知机网络(MLP),输入层有10个节点、一个单隐层共50个神经元,最后是一个3个神经元的输出层。请问网络的结构是什么样子的使用数学形式进行描述?

    假设你有一个多层感知机网络(MLP),输入层有10个节点.一个单隐层共50个神经元,最后是一个3个神经元的输出层.请问网络的结构是什么样子的使用数学形式进行描述? 输入矩阵X的形状是什么? 隐藏层的权 ...

  7. 1.3.1 单隐层网络的数学实现

    神经网络概览 如图所示,整个神经网络的概览大致如下,下面我们会讨论这个网络时如何一步步实现的. 神经网络表示 我们来解释一下这个图中的中间隐藏层是什么含义: 在一个神经网络中,当你使用监督学习来训练他 ...

  8. 手写单隐层神经网络_鸢尾花分类(matlab实现)

    文章目录 思路 留言 效果 代码 mian split training testing 思路 sigmoid函数做激活函数 二分类交叉熵做损失函数 mian函数:数据预处理 split函数:数据集分 ...

  9. matlab中隐含层缺省函数,Matlab双隐层的BP神经网络该如何创建

    看了之前论坛里提供的一个程序: %--------------两个隐层的BP算法-------------% clear all; SamNum=100;%样本数 TestSamNum=100;%测试 ...

最新文章

  1. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
  2. 网站开发之鼠标悬停简单特效实现(四)
  3. 数据结构与算法之RandomPool结构和岛问题
  4. python爬取网页表格数据匹配,python爬虫——数据爬取和具体解析
  5. Android上实现柱状图表
  6. jvm堆内存设置原理
  7. “第八期央企CIO论坛”成功举办
  8. 多用户远程(RDP Wrapper)安装及使用步骤
  9. Android | Tangram动态页面之路(七)硬核的Virtualview
  10. 「2017ACM/ICPC亚洲区域赛北京站现场赛G」Liaoning Ship's Voyage【计算几何】
  11. MySQL进阶探索--之STRAIGHT JOIN用法简介
  12. oracle 倒库详细步骤,新手倒车入库怎么操作 图文并茂详细讲解操作技巧
  13. Cisco 3550交换机IOS备份(真实设备演示)
  14. Verilog学习笔记4:关于5M40ZE64C4N接地的问题
  15. 图像合成:Multi-scale Image Harmonization
  16. python selenium移动端网页下拉刷新
  17. SpringCloud 基础教程(八)-Hystrix熔断器(上)
  18. 使用自制相机运行 VINS-Mono
  19. postgresql系统架构图
  20. Axure 8.1.0.3377 注册激活码

热门文章

  1. pokers -end
  2. 性能测试之tcpcopy引流工具介绍
  3. PostgreSQL分区
  4. 2020-2021考研南京大学软件学院学习经验分享(英语90,842自命题110+)
  5. 如何打造陆金所营销活动配置发布平台
  6. 30题前端工程开发师面试题
  7. SMOTE-类不平衡问题
  8. 沈阳二本计算机工资,想进国家电网?这两所二本超过很多985!
  9. vuex 是什么? 以及它的基本使用
  10. v-model双向绑定原理