BPR

article/2025/9/17 6:30:36

BPB模型概念
BPR(Bayesian Personalized Ranking)推荐模型是基于贝叶斯后验优化的个性化排序算法。从user-iem矩阵训练出多个矩阵,而且一个矩阵表示一个用户的item偏好情况来获得用对多个item的偏好关系的推荐系统。本身不优化用户对物品的评分,只是借由评分来优化用户对物品的排序。
BPR是目前主流的利用基于物品对的协同过滤技术解决OCCF问题的算法之 。
BPR的核心是针对两个物品的相对偏好排序进行建模。最终为每个用户计算其对没有过行为物品的偏好排序,从而进行个性化推荐。
由此,训练集Ds可以构建为:U ∗ I ∗ I ,Ds是三元组( u , i , j )的集合。
BPR模型特点
1、强调个性化推荐,个性化物品偏好排名
2、用后验概率优化个性化推荐的排序
3、基于梯度下降的learnBPR极大化BPR-OPT
4、一般的推荐算法强调用户对项目的打分,只存在用户和单个项目的关系,不去考虑两个项目对用户的影响力,而BPR模型从u , i , j 出发求解u , i ,j的大小。
BPR模型过程
(1)从user-item中提取item-item矩阵
在这里插入图片描述
?表示无签到数据,有两种情况,第一种可能本身就是negative value,用户对item不感兴趣,第二种是缺失值,发生了浏览或者购买行为但是丢失了

  • 表示用户u相对于item j更喜欢item i。
    BPR推荐系统会考虑positive value和negative value,也就是所有item都会被个性化ranking,即使用户对某个item缺失值这个item也能够被ranking,而不是仅仅用negative value代替缺失值。
    在这里插入图片描述
    BPR算法步骤
    基本假设
    1.每个用户之间的偏好行为相互独立
    2.统一用户对不同物品的喜好相互独立
    数据pair预处理
    BPR算法将用户对物品的评分(显示反馈1,隐式反馈0)处理为一个pair集合<i,j>,其中i为评分为1的物品,j为评分为0 的物品,假设用户有M个1的评分,N个0的评分,则该用户共有M*N个pair对。
    数据集就由<u,i,j>表示,相对于物品j,用户u更喜欢物品i。
    优化
    基于前面提到的两个基本假设,优化问题就转化为了极大化以下目标:
    在这里插入图片描述
    θ为模型参数,包括用户的latent matrix P(表示用户的隐含因子矩阵P)物品的latent matrix Q(表达物品的隐含因子矩阵Q)
    在这里插入图片描述
    基于pair-wise的偏序优化,可以避免point-wise模型在对feature-item进行预测时失效(因为feature-item在训练时全被标记为“0”)的问题。

而且feature-item包括两类:1,用户真正讨厌的;2,用户missing的。

对于某个用户来说,在训练时都被标为"0"的item,在预测时的评分也可以排序,因此不影响ranking任务的完成。

即使用pair-wise的优化方式,可以对训练时标记为“0”的item在预测时进行ranking。

但这本身是“矬子里面拔高个”,且训练数据与用户的实际偏好不符。而且,从数据量考虑,也很不经济。
在这里插入图片描述

在这里插入图片描述

import random
from collections import defaultdict
import numpy as np
from sklearn.metrics import roc_auc_score
import scoresclass BPR:user_count = 10000item_count = 5000latent_factors = 10lr = 0.01reg = 0.01train_count = 1000train_data_path = 'train.txt'test_data_path = 'test.txt'size_u_i = user_count * item_countU = np.random.rand(user_count, latent_factors) * 0.01V = np.random.rand(item_count, latent_factors) * 0.01biasV = np.random.rand(item_count) * 0.01test_data = np.zeros((user_count, item_count))test = np.zeros(size_u_i)predict_ = np.zeros(size_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_ratingsdef 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):# sample a useru = random.randint(1, self.user_count)if u not in user_ratings_train.keys():continue# sample a positive item from the observed itemsi = random.sample(user_ratings_train[u], 1)[0]# sample a negative item from the unobserved itemsj = random.randint(1, self.item_count)while j in user_ratings_train[u]:j = random.randint(1, self.item_count)u -= 1i -= 1j -= 1r_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))# update U and Vself.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])# update biasVself.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 predictdef main(self):user_ratings_train = self.load_data(self.train_data_path)self.load_test_data(self.test_data_path)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# trainingfor i in range(self.train_count):self.train(user_ratings_train)predict_matrix = self.predict(self.U, self.V)# predictionself.predict_ = predict_matrix.getA().reshape(-1)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()

http://chatgpt.dhexx.cn/article/FpVhZKIC.shtml

相关文章

两种不同的PBR工作流介绍

本文介绍两种常用的PBR材质工作流&#xff1a;金属/粗糙度工作流&#xff08;Metal/Roughness&#xff09;和镜面反射/光泽度工作流&#xff08;Specular/Glossiness&#xff09;。这两种工作流都可以用来制作一个支持PBR的材质&#xff0c;并用PBR渲染出逼真的效果&#xff0c…

4.3 PBR

1. 实验目的 熟悉PBR的应用场景掌握PBR的配置方法2. 实验拓扑 PBR实验拓扑如图4-8所示: 图4-8:PBR 3. 实验步骤 (1) IP地址的配置 R1的配置 <Huawei>system-view

PBR渲染(二)——PBR皮肤渲染

PBR皮肤渲染 在PBR基础框架的基础上实现皮肤的渲染&#xff0c;要根据皮肤的渲染特性来对基础框架进行扩充和修改&#xff0c;从而实现真实感的PBR皮肤渲染。皮肤一般具有以下渲染特性&#xff1a; 1.次表面散射&#xff08;SSS&#xff09; 2.BRDF高光&#xff08;Specular …

PBR 基础知识干货总结

&#xff08;1&#xff09;什么是PBR&#xff1f; 基于物理的渲染过程。 PBR是一种着色和渲染技术&#xff0c;用于更精确的描述光如何与物体表面互动。 PBR的优势&#xff1a; &#xff08;1&#xff09;方法论和算法基于精确的计算公式&#xff0c;免除创作表面的猜想过程。 …

PBR与Blinnphong解读

我们做光栅化模式的渲染都了解有两种比较常用的渲染方式&#xff0c;一个是blinnphong的渲染&#xff0c;一个是pbr的渲染。 blinnphong&#xff1a; blinnphong的渲染模式更多的是一种经验值模拟光照对物体的效果。所以他不是一个正确的能量守恒的渲染方式。 blinnphong的渲…

【基于物理的渲染(PBR)白皮书】(一) 开篇:PBR核心知识体系总结与概览

本文由浅墨_毛星云 出品&#xff0c;首发于知乎专栏&#xff0c;转载请注明出处 文章链接&#xff1a; https://zhuanlan.zhihu.com/p/53086060 先放出PBR知识体系的架构图&#xff1a; 图很大&#xff0c;建议下载到本地放大查看。原图下载地址&#xff1a; https://raw.gi…

什么是PBR?

一、什么是PBR&#xff1f; 基于物理渲染以前的渲染是在模仿灯光的外观现在是在模仿光的实际行为试图形看起来更真实 二、PBR组成部分 灯光属性&#xff1a;直接照明、间接照明、直接高光、间接高光、阴影、环境光闭塞表面属性&#xff1a;基础色、法线、高光、粗糙度、金属度…

PBR流程介绍和模型规范

&#xff08;1&#xff09;基本流程&#xff1a; &#xff08;1&#xff09;制作中模&#xff1a; 基础模型&#xff1a; 指的是中模&#xff01;&#xff01; 中模导出为.obj 格式&#xff08;跟.fbx格式相比&#xff1a;不会出现模型大小的缩放&#xff09; 高模&#xff1a…

PBR材质:基本原理和简单制作

概要&#xff1a;介绍PBR材质的基本原理以及制作一个简单的PBR材质 参考资料&#xff1a;BASIC THEORY OF PHYSICALLY-BASED RENDERING 如有问题&#xff0c;多多指正。 侵删。 1.PBR是什么&#xff0c;光线的基本原理。 PBR即Physically-based rendering&#xff0c;基于物理…

什么是PBR?pbr入门基础干货

&#xff08;1&#xff09;什么是PBR&#xff1f; 基于物理的渲染过程。 PBR是一种着色和渲染技术&#xff0c;用于更精确的描述光如何与物体表面互动。 PBR的优势&#xff1a; &#xff08;1&#xff09;方法论和算法基于精确的计算公式&#xff0c;免除创作表面的猜想过程…

PBR——概述、基于物理的材质

PBR概述 PBR&#xff0c;即Physically Based Rendering&#xff0c;主要分为基于物理的材质、基于物理的光照和基于物理的相机三个部分&#xff0c;目前来说对大家最为所熟知的是基于物理的材质部分。本文围绕基于物理的材质进行相关介绍。 什么是PBR 其实最早听说PBR这玩意…

PBR基础理论通俗解释

PBR基础理论通俗解释 今天给大家介绍PBR的基础理论, 不会涉及比较深的具体算法, 算是一篇扫盲的文章, 尽量尝试说人话, 让大家能够对PBR有基本的了解. 什么是PBR? PBR是基于物理的渲染(Physically Based Rendering), 也就是说通过模拟物理世界的方式来渲染. 既然有基于物理…

基于物理的渲染PBR(一):pbr的基础理论和推导

初始PBR 最近刚接触pbr不久&#xff0c;我搜寻了许多文章进行阅读并了解后发现&#xff0c;pbr涉及到的知识点繁琐且不容易理解&#xff0c;所以想在博客上给自己记录并总结一下&#xff0c;方便以后回顾并加深记忆。 这里首先借用知乎上的大佬毛星云关于pbr所涉及到的知识要…

策略路由(PBR)

1、基本概念 PBR (Policy-Based Routing&#xff0c;策略路由): PBR使得网络设备不仅能够基于报文的目的IP地址进行数据转发&#xff0c;更能基于其他元素进行数据转发&#xff0c;例如源IP地址、源MAc地址、目的MAc地址、源端口号、目的端口号、VLAN-ID等等。 用户还可以使用A…

技术美术知识学习_04:PBR的个人理解

一、什么是PBR&#xff1f; PBR&#xff08;Physically Based Rendering&#xff09;&#xff0c;中文翻译为基于物理的渲染。 PBR是一种渲染方式&#xff0c;是使用基于物理原理和微平面理论的光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲…

图灵直播|《第一行代码》作者郭霖在线Coding,今晚八点,给你留位!

图源来自Pexels “我们为什么需要 Kotlin&#xff1f;答&#xff1a;消失的 Getter 和 Setter、又见空指针、Smart Cast、打日志、再见Utils、晚安ButterKnife……” 相信很多人初识Kotlin&#xff0c;都是基于谷歌技术大牛 Steve Yegge的一篇文章《为什么说 Kotlin 比你们用的…

撸了郭霖大神写的Framework源码笔记,offer拿到手软

前不久听我一个字节的朋友说了一个神转折的故事。 一名大专生,异常执着地向他们公司投简历,屡战屡败,屡败屡战,前前后后向字节跳动投了九次简历。 你猜后面怎么着?还真让他成功了,第九次居然拿到了offer! 看到这里,不过是一个普普通通的励志故事吧,一个菜鸡凭借自己…

(郭霖)Android图片加载框架最全解析(一),Glide的基本用法

转载请注明出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53759439 本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每天都有文章更新。 现在Android上的图片加载框架非常成熟&#xff0c;从最早…

图灵专访:郭霖的成长之路

各位小伙伴们大家早上好&#xff0c;最近这段时间我真的是快要忙疯了&#xff0c;好多件事情同时在做&#xff0c;实在抽不出时间写原创文章。 正巧想到前段时间和图灵做了一次专访&#xff0c;记录了一些我的成长经历。这篇专访姑且也可以算是一篇原创吧&#xff0c;因为里面的…

第一行代码-第二版(郭霖著)笔记十一(Material Design)

目录 一、什么是Material Design 二、Toolbar 三、滑动菜单 1.DrawerLayout 2.NavigationView 四、悬浮按钮和可交互提示 1.FloatingActionButton&#xff1a;悬浮按钮 2.Snackbar&#xff1a;提示工具 3.CoordinatorLayout&#xff1a;加强版FrameLayout 五、卡片式…