贝叶斯个性化排序(BPR)
介绍
显式反馈:用户对物品的评分,如电影评分
隐式反馈:用户对物品的交互行为,如浏览,购买等,现实中绝大部分数据属于隐式反馈,可以从日志中获取。
BPR是基于用户的隐式反馈,为用户提供物品的推荐,并且是直接对排序进行优化。
BPR(Bayesian Personalized Ranking),中文名称为贝叶斯个性化排序,是当下推荐系统中常用的一种推荐算法。与其他的基于用户评分矩阵的方法不同的是BPR主要采用用户的隐式反馈(如点击、收藏、加入购物车等),通过对问题进行贝叶斯分析得到的最大后验概率来对item进行排序,进而产生推荐。
定义
传统解决方式
BPR的解决方式
基于矩阵分解的BPR
参考文献
https://www.cnblogs.com/pinard/p/9128682.html#commentform
代码部分
import random
from collections import defaultdict
import numpy as np
from sklearn.metrics import roc_auc_score
import scoresclass BPR:#用户数user_count = 943#项目数item_count = 1682#k个主题,k数latent_factors = 20#步长αlr = 0.01#参数λreg = 0.01#训练次数train_count = 1000#训练集train_data_path = 'train.txt'#测试集test_data_path = 'test.txt'#U-I的大小size_u_i = user_count * item_count# 随机设定的U,V矩阵(即公式中的Wuk和Hik)矩阵U = np.random.rand(user_count, latent_factors) * 0.01 #大小无所谓V = np.random.rand(item_count, latent_factors) * 0.01biasV = np.random.rand(item_count) * 0.01#生成一个用户数*项目数大小的全0矩阵test_data = np.zeros((user_count, item_count))#生成一个一维的全0矩阵test = np.zeros(size_u_i)#再生成一个一维的全0矩阵predict_ = np.zeros(size_u_i)#获取U-I数据对应def load_data(self, path):user_ratings = defaultdict(set)with open(path, 'r') as f:for line in f.readlines():u, i = line.split(" ")u = int(u)i = int(i)user_ratings[u].add(i)return user_ratings#获取测试集的评分矩阵def load_test_data(self, path):file = open(path, 'r')for line in file:line = line.split(' ')user = int(line[0])item = int(line[1])self.test_data[user - 1][item - 1] = 1def train(self, user_ratings_train):for user in range(self.user_count):#随机获取一个用户u = random.randint(1, self.user_count)#训练集和测试集的用于不是全都一样的,比如train有948,而test最大为943if u not in user_ratings_train.keys():continue# 从用户的U-I中随机选取1个Itemi = random.sample(user_ratings_train[u], 1)[0]# 随机选取一个用户u没有评分的项目j = random.randint(1, self.item_count)while j in user_ratings_train[u]:j = random.randint(1, self.item_count)#python中的取值从0开始u = u - 1i = i - 1j = j - 1#BPRr_ui = np.dot(self.U[u], self.V[i].T) + self.biasV[i]r_uj = np.dot(self.U[u], self.V[j].T) + self.biasV[j]r_uij = r_ui - r_ujloss_func = -1.0 / (1 + np.exp(r_uij))# 更新2个矩阵self.U[u] += -self.lr * (loss_func * (self.V[i] - self.V[j]) + self.reg * self.U[u])self.V[i] += -self.lr * (loss_func * self.U[u] + self.reg * self.V[i])self.V[j] += -self.lr * (loss_func * (-self.U[u]) + self.reg * self.V[j])# 更新偏置项self.biasV[i] += -self.lr * (loss_func + self.reg * self.biasV[i])self.biasV[j] += -self.lr * (-loss_func + self.reg * self.biasV[j])def predict(self, user, item):predict = np.mat(user) * np.mat(item.T)return predict#主函数def main(self):#获取U-I的{1:{2,5,1,2}....}数据user_ratings_train = self.load_data(self.train_data_path)#获取测试集的评分矩阵self.load_test_data(self.test_data_path)#将test_data矩阵拍平for u in range(self.user_count):for item in range(self.item_count):if int(self.test_data[u][item]) == 1:self.test[u * self.item_count + item] = 1else:self.test[u * self.item_count + item] = 0#训练for i in range(self.train_count):self.train(user_ratings_train)#训练1000次完成predict_matrix = self.predict(self.U, self.V) #将训练完成的矩阵內积# 预测self.predict_ = predict_matrix.getA().reshape(-1) #.getA()将自身矩阵变量转化为ndarray类型的变量self.predict_ = pre_handel(user_ratings_train, self.predict_, self.item_count)auc_score = roc_auc_score(self.test, self.predict_)print('AUC:', auc_score)# Top-K evaluationscores.topK_scores(self.test, self.predict_, 5, self.user_count, self.item_count)def pre_handel(set, predict, item_count):# Ensure the recommendation cannot be positive items in the training set.for u in set.keys():for j in set[u]:predict[(u - 1) * item_count + j - 1] = 0return predictif __name__ == '__main__':#调用类的主函数bpr = BPR()bpr.main()
数据集下载
贝叶斯个性化排序(BPR)相关推荐
- 推荐算法之贝叶斯个性化排序 BPR
就像哲学有不同的流派一样,推荐系统的算法设计思路也可以分为不同的流派.排序学习恰恰就是其中的一种流派.熟悉 RecSys 等推荐系统国际会议的从业者可能会发现,自 2010 年以后的若干年内,陆续出现 ...
- 推荐系统遇上深度学习(二十一)--贝叶斯个性化排序(BPR)算法原理及实战
笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...
- 贝叶斯个性化排序(BPR)算法
在推荐系统中的经典矩阵分解技术中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personalize ...
- 一文读懂开创性文章——贝叶斯个性化排序(BPR)
BPR绝对可以算是推荐系统领域的开创性文章之一,对于经典我们一定要好好体会和理解. BPR是一个基于pairwise的算法,在BPR之前大部分方法都基于pointwise的方法,这存在一定的问题,而B ...
- BPR:面向隐偏好数据的贝叶斯个性化排序学习模型
转自博客:https://blog.csdn.net/qq_20599123/article/details/51315697 BPR面向隐偏好数据的贝叶斯个性化排序学习模型 摘要 引言 相关研究 个 ...
- BPR(贝叶斯个性化排序)
1.什么是BPR以及他产生的背景 BPR全称Bayesian Personalized Ranking,他是一种排序算法,并且使用隐式反馈(如点击,收藏等),通过对问题进行贝叶斯分析得到的最大后验概率 ...
- 推荐常用的排序学习算法——BPR(贝叶斯个性化排序)
文章目录 1. 排序学习 1.1 优势 1.2 排序学习在推荐领域的作用 1.3 排序学习设计思路 1.3.1 单点法(Pointwise) 1.3.2 配对法(Pairwise) 1.3.3 列表法 ...
- BPR贝叶斯个性化排序算法
目录 一.BPR算法的作用 二.显式反馈和隐式反馈 1.显式反馈 2.隐式反馈 三.BPR算法 1.概念 2.相关定义 3.建模思路 四.BPR优化 五.算法流程 六.结束 七.代码实现 一.BPR算 ...
- BPR:贝叶斯个性化排序推荐
BPR:Bayesian Personalized Ranking from Implicit Feedback 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式 ...
最新文章
- think in java interview-高级开发人员面试宝典(二)
- Double Free浅析(泄露堆地址的一种方法)
- PHP数组的排序函数
- unixODBC的使用
- 人脸识别错误代码437是什么意思_lol手游repeat ready check fails什么意思 解决攻略大全...
- 悲剧!因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效...
- DeepStream不支持多 RTSP源(多个摄像头)
- c# 超时时间已到.在操作完成之前超时时间已过或服务器未响应,超时过期了。在操作完成或服务器没有响应之前经过的超时时间。声明已被终止...
- mysql 百万级数据库优化方案
- docker迁移禅道
- 二叉树基础题(五):二叉树的下一个节点最低公共祖先节点
- [洛谷P1024]python一元三次方程求解
- 学渣的刷题之旅 leetcode刷题 13.罗马数字转整数
- linux 个人云存储_2020年NAS首选,超高速读写备份,联想个人云存储A1深度体验
- 数据结构c语言版习题
- 浪潮信息:2025年,实现数据中心风冷、液冷同价
- 想成为富人,你得攒资产
- .俞敏洪+马云+牛根生+史玉柱经典语录
- Javaweb开发了解前端知识四、Jquery(二)
- 『Kubernetes』在Linux中快速安装K8S集群
热门文章
- 码农的2019又开始了,抓不住重点的我很悲催
- html5 indexeddb,关于使用HTML5提供的indexedDB的一下心得
- html写一个猜数字游戏,JS实现网页端猜数字小游戏
- 求逆矩阵计算机方法,求逆矩阵的快速方法(用于编程).pdf
- 虚同步(Virtual Synchrony)核心文献
- Jenkins环境部署
- python绘制派大星_简笔画:如何使用Flash绘制派大星 看完你就知道了
- 【JavaScript-事件】target和this的区别?如何阻止冒泡事件?常见的鼠标事件和键盘事件有哪些?
- 以前Java恐龙,侏罗纪已过去亿万年,恐龙样貌如何被还原?
- matlab对于处理数字图像的优点,学习MATLAB数字图像处理经验谈