介绍

显式反馈:用户对物品的评分,如电影评分
隐式反馈:用户对物品的交互行为,如浏览,购买等,现实中绝大部分数据属于隐式反馈,可以从日志中获取。
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)相关推荐

  1. 推荐算法之贝叶斯个性化排序 BPR

    就像哲学有不同的流派一样,推荐系统的算法设计思路也可以分为不同的流派.排序学习恰恰就是其中的一种流派.熟悉 RecSys 等推荐系统国际会议的从业者可能会发现,自 2010 年以后的若干年内,陆续出现 ...

  2. 推荐系统遇上深度学习(二十一)--贝叶斯个性化排序(BPR)算法原理及实战

    笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据 ...

  3. 贝叶斯个性化排序(BPR)算法

    在推荐系统中的经典矩阵分解技术中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personalize ...

  4. 一文读懂开创性文章——贝叶斯个性化排序(BPR)

    BPR绝对可以算是推荐系统领域的开创性文章之一,对于经典我们一定要好好体会和理解. BPR是一个基于pairwise的算法,在BPR之前大部分方法都基于pointwise的方法,这存在一定的问题,而B ...

  5. BPR:面向隐偏好数据的贝叶斯个性化排序学习模型

    转自博客:https://blog.csdn.net/qq_20599123/article/details/51315697 BPR面向隐偏好数据的贝叶斯个性化排序学习模型 摘要 引言 相关研究 个 ...

  6. BPR(贝叶斯个性化排序)

    1.什么是BPR以及他产生的背景 BPR全称Bayesian Personalized Ranking,他是一种排序算法,并且使用隐式反馈(如点击,收藏等),通过对问题进行贝叶斯分析得到的最大后验概率 ...

  7. 推荐常用的排序学习算法——BPR(贝叶斯个性化排序)

    文章目录 1. 排序学习 1.1 优势 1.2 排序学习在推荐领域的作用 1.3 排序学习设计思路 1.3.1 单点法(Pointwise) 1.3.2 配对法(Pairwise) 1.3.3 列表法 ...

  8. BPR贝叶斯个性化排序算法

    目录 一.BPR算法的作用 二.显式反馈和隐式反馈 1.显式反馈 2.隐式反馈 三.BPR算法 1.概念 2.相关定义 3.建模思路 四.BPR优化 五.算法流程 六.结束 七.代码实现 一.BPR算 ...

  9. BPR:贝叶斯个性化排序推荐

    BPR:Bayesian Personalized Ranking from Implicit Feedback 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式 ...

最新文章

  1. think in java interview-高级开发人员面试宝典(二)
  2. Double Free浅析(泄露堆地址的一种方法)
  3. PHP数组的排序函数
  4. unixODBC的使用
  5. 人脸识别错误代码437是什么意思_lol手游repeat ready check fails什么意思 解决攻略大全...
  6. 悲剧!因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效...
  7. DeepStream不支持多 RTSP源(多个摄像头)
  8. c# 超时时间已到.在操作完成之前超时时间已过或服务器未响应,超时过期了。在操作完成或服务器没有响应之前经过的超时时间。声明已被终止...
  9. mysql 百万级数据库优化方案
  10. docker迁移禅道
  11. 二叉树基础题(五):二叉树的下一个节点最低公共祖先节点
  12. [洛谷P1024]python一元三次方程求解
  13. 学渣的刷题之旅 leetcode刷题 13.罗马数字转整数
  14. linux 个人云存储_2020年NAS首选,超高速读写备份,联想个人云存储A1深度体验
  15. 数据结构c语言版习题
  16. 浪潮信息:2025年,实现数据中心风冷、液冷同价
  17. 想成为富人,你得攒资产
  18. .俞敏洪+马云+牛根生+史玉柱经典语录
  19. Javaweb开发了解前端知识四、Jquery(二)
  20. 『Kubernetes』在Linux中快速安装K8S集群

热门文章

  1. 码农的2019又开始了,抓不住重点的我很悲催
  2. html5 indexeddb,关于使用HTML5提供的indexedDB的一下心得
  3. html写一个猜数字游戏,JS实现网页端猜数字小游戏
  4. 求逆矩阵计算机方法,求逆矩阵的快速方法(用于编程).pdf
  5. 虚同步(Virtual Synchrony)核心文献
  6. Jenkins环境部署
  7. python绘制派大星_简笔画:如何使用Flash绘制派大星 看完你就知道了
  8. 【JavaScript-事件】target和this的区别?如何阻止冒泡事件?常见的鼠标事件和键盘事件有哪些?
  9. 以前Java恐龙,侏罗纪已过去亿万年,恐龙样貌如何被还原?
  10. matlab对于处理数字图像的优点,学习MATLAB数字图像处理经验谈