Bayesian Personalized Ranking from Implicit Feedback 阅读笔记

news2025/1/15 16:53:13

Abstract

BPR主要用于基于隐式反馈(implicit feedback)的Item Recommendation。

尽管有很多做同样事情的算法比如matrix factorization, knearest-neighbor。但他们并不是直接对于物品排名本身进行预测的。

而BPR则是通过贝叶斯分析得到最大的后验估计量来预测排名。

我的理解就是,MF,KNN算法是预测出用户对每个item的感兴趣程度,然后排名,而BPR则是通过预测用户对A的兴趣大于B的概率,从而预测排名。

Bayesian Personalized Ranking

y u i = 1 y_{ui} = 1 yui=1,if interaction (user u, item i) is observed)
y u i = 0 y_{ui} = 0 yui=0,otherwise

在传统隐式反馈模型中,如果用户 u u u和物品 i i i的交互没有被观测到(数据缺失),那么就会被归为负类。那么如果这个模型训练的足够好,那么所有未被观测到的样本,随后都会被预测为 0 0 0

而使用BPR就是为了解决这类问题。

后验概率

构建一个数据集 D s D_s Ds,如果用户 u u u对物品 i i i产生了交互而没用对物品 j j j产生交互,则会得到一个偏好对 ( u , i , j ) (u,i,j) (u,i,j)。即 D s = { ( u , i , j ) ∣ i ∈ I u + ∧ I ∖ I u + } D_s = \{(u,i,j)|i\in I_u^+\land I\setminus I_u^+ \} Ds={(u,i,j)iIu+IIu+}(可以理解为同时有物品 i , j i,j i,j的时候,用户 u u u点击了 i i i

定义 p ( i > u j ∣ θ ) p(i >_u j|\theta) p(i>ujθ)为,用户 u u u θ \theta θ的概率有偏好对 ( u , i , j ) (u,i,j) (u,i,j)

那么我们的任务就是求 θ \theta θ,即根据数据集(用户的对物品的偏序关系 > u >_u >u)
,求使得 p ( θ ∣ > u ) p(\theta|>_u) p(θ>u)最大化的 θ \theta θ。(此时的 θ \theta θ是指的是每个偏序概率的合集)


p ( θ ∣ > u ) ∝ p ( > u ∣ θ ) p ( θ ) p(\theta|>_u) \propto p(>_u|\theta)p(\theta) p(θ>u)p(>uθ)p(θ)

p ( > u ∣ θ ) p(>_u|\theta) p(>uθ)

这就相当于,我们知道了每一对的 i > u j i >_uj i>uj偏序概率。
那么总的概率就是把它们相乘即可
p ( > u ∣ θ ) = Π ( u , i , j ) ∈ D s p ( i > u j ) p(>_u|\theta) = \Pi_{(u,i,j)\in D_s}p(i >_u j) p(>uθ)=Π(u,i,j)Dsp(i>uj)

我们可以用相关性来定义 p p p,即 p ( i > u j ) = σ ( x ^ u , i , j ( θ ) ) p(i >_u j) = \sigma(\hat{x}_{u,i,j}(\theta)) p(i>uj)=σ(x^u,i,j(θ))

  • σ \sigma σ为sigmoid函数, σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
  • x ^ u , i , j ( θ ) \hat{x}_{u,i,j}(\theta) x^u,i,j(θ)是实值函数,返回用户 u u u与物品 i , j i,j i,j之间的关系,可以用矩阵分解或KNN得到。

p ( θ ) p(\theta) p(θ)

假设参数服从正态分布 p ( θ ) ∼ N ( 0 , λ 0 I ) p(\theta)\sim N(0,\lambda_0I) p(θ)N(0,λ0I)
所以 l n ( p ( θ ) ) = λ ∣ ∣ θ ∣ ∣ 2 ln(p(\theta))=\lambda||\theta||^2 ln(p(θ))=λ∣∣θ2

求后验概率

l n ( p ( > u ∣ θ ) p ( θ ) ) ln(p(>_u|\theta)p(\theta)) ln(p(>uθ)p(θ))
= l n ( Π ( u , i , j ) ∈ D s σ ( x ^ u , i , j ( θ ) ) p ( θ ) ) =ln(\Pi_{(u,i,j)\in D_s}\sigma(\hat{x}_{u,i,j}(\theta))p(\theta)) =ln(Π(u,i,j)Dsσ(x^u,i,j(θ))p(θ))
= ∑ ( u , i , j ) ∈ D s l n ( σ ( x ^ u , i , j ) ) − λ θ ∣ ∣ θ ∣ ∣ 2 =\sum_{(u,i,j)\in D_s}ln(\sigma(\hat{x}_{u,i,j}))-\lambda_{\theta}||\theta||^2 =(u,i,j)Dsln(σ(x^u,i,j))λθ∣∣θ2

梯度下降

∑ ( u , i , j ) ∈ D s l n ( σ ( x ^ u , i , j ) ) − λ θ ∣ ∣ θ ∣ ∣ 2 \sum_{(u,i,j)\in D_s}ln(\sigma(\hat{x}_{u,i,j}))-\lambda_{\theta}||\theta||^2 (u,i,j)Dsln(σ(x^u,i,j))λθ∣∣θ2
可以采用随机梯度下降
其中 x u i j = x u i − x u j x_{uij}=x_{ui}-x_{uj} xuij=xuixuj
在这里插入图片描述


参考博客
https://blog.csdn.net/weixin_46099084/article/details/109011670
https://zhuanlan.zhihu.com/p/60704781
https://www.cnblogs.com/pinard/p/9128682.html#commentform

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于蜣螂算法优化概率神经网络PNN的分类预测-附代码

基于蜣螂算法优化概率神经网络PNN的分类预测 - 附代码 文章目录基于蜣螂算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立3.基于蜣螂优化的PNN网络5.测试结果6.参考文献7.Matlab代码摘要:针对PNN神经网络的光滑因…

[GYCTF2020]EasyThinking (ThinkPHP V6.0.0)

[GYCTF2020]EasyThinking 打开以后就注册一些功能,注册admin admin,成功然后尝试search这个方法是否有任意文件读取漏洞,试了试没有任何的回显。 然后个人中心,显示的是自己的历史命令 接下来,呃呃呃就没思路了&…

DFS(五)N皇后

51. N 皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案…

★ 我的世界各类奇葩武器实现!(命令方块1.13+)

新版execute一出很多玩家都不会了。开头先给大家说一下怎么以旧换新: e.g. 旧版: /execute e[typearrow] ~ ~ ~ summon tnt 新版就改为: /execute at e[typearrow] run summon tnt 非常简单! 注记 以下代码块里的命令未经表明一…

Mysql入门技能树-数据类型

数值的隐式类型转换 Joe 需要使用下列表做一项数值计算 create table points(id int primary key auto_increment,x int,y int );计算查询为: select id, (x^2 y^2)/2 as result from points; 得到的结果集中,result 列的类型应该是: 答…

剑指Offer 第1天 第2天

第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …

AtCoder Regular Contest 154 C. Roller(思维题)

题目 T(T<5e3)组样例&#xff0c;每次给定一个数n(n<5e3)&#xff0c; 和长为n的两个数组a,b&#xff0c;你可以执行以下操作任意次&#xff1a; 操作&#xff1a;选择一个下标i(1<i<n)&#xff0c;将替换为&#xff0c;其中被认为是 问若干次操作后&#xff0…

JUC面试(十)——线程池Callable接口

线程池&Callable接口 前言 获取多线程的方法&#xff0c;我们都知道有三种&#xff0c;还有一种是实现Callable接口 实现Runnable接口实现Callable接口实例化Thread类使用线程池获取 Callable接口 这是一个函数式接口&#xff0c;因此可以用作lambda表达式或方法引用的…

JDBC连接池多线程通过CountDownLatch实现线程并发执行

目录 1.连接池 1.1 什么是连接池 1.2 为什么使用连接池 1.3 连接池的工作原理 1.4我们如何手写【难点】 1.4.1编写说明 1.4.2 创建jdbc.properties 1.4.3 封装一个连接类 1.4.4 创建一个连接池接口 1.4.5 创建一个连接池实现类以及对应方法 1.4.6 创建一个连接池的维…

spingboot如何接受前端请求

首先我们是否用的是rest风格开发的的都是适用的.普通参数get 请求发送方注:由于是get请求不用body(json)接收.接受方post请求发送端注意:在请求体(body)里面用x-www-from-urlencoded(不仅可以发请求,还可以发文件)接受体没有5种不同参数类型的传递普通参数[简单数据]&#xff1…

用 Java 实现计算器功能

练习一 1.设计一个类模拟一个计算器 达到什么需求&#xff1f;加减乘除 需要设计一个方法一个计算方法 控制台输出 首先请输入第一个数 例如数字 1 请输入符号 例如 请输入第二个数 例如 2 第二次 数字 3 请输入符号 - 请输入第二个数 2 结果 1 程序解析&#…

27. 作用域

1. 定义 作用域就是一个 python 程序可以直接访问命名空间的正文区域。 在一个 python 程序中&#xff0c;直接访问一个变量&#xff0c;会从内到外依次访问所有的作用域直到找到&#xff0c;否则会报未定义的错误。 python 中&#xff0c;程序的变量并不是在哪个位置都可以访…

【Hadoop】MapReduce原理剖析(Map,Shuffle,Reduce三阶段)

文章目录1. Map阶段1.1 把输入文件(夹)划分为很多InputSplit(Split)1.2 分配并执行map作业2. Shuffle阶段2.1 Partition(分区)2.2 Sort(排序)2.3 Group(分组)2.4 Combiner(规约)2.5 序列化并写入Linux磁盘内存2.6 反序列化读取数据到不同的reduce节点2.7 Reduce端数据进行合并、…

【数据库概论】第五章 数据库完整性

第五章 数据库完整性 目录第五章 数据库完整性5.1 实体完整性5.2 参照实体性5.3 用户定义的完整性1.属性上的约束条件2.元组上的约束条件5.4 完整性约束命名子句5.5 域中的完整性限制5.6 断言5.7 触发器(Trigger)一、定义触发器二、激活触发器三、删除触发器数据库的完整性指的…

好客租房-13.WebMagic

13. 项目接入ES编写爬虫抓取房源数据开发搜索房源接口服务整合前端开发实现搜索功能优化搜索功能增加高亮和分页功能热词推荐功能实现拼音分词13.1 制作假数据13.1.1 WebMagic抓取数据为了丰富我们的房源数据&#xff0c;所以我们采用WebMagic来抓取一些数据&#xff0c;目标网…

还在纠结选择用什么浏览器?手机端用国产浏览器也很香

一说到受欢迎的电脑浏览器&#xff0c;大家肯定不约而同地说谷歌浏览器。微软edge浏览器能够同步书签、插件也非常多&#xff0c;因为这些优势深受国人的喜爱。有人纠结在国内选择谷歌好&#xff0c;还是edge浏览器好呢&#xff1f;可能有的人哪个也不选&#xff0c;反而在电脑…

Docker 解决 `denied: requested access to the resource is denied`

背景 由于不可描述的原因&#xff0c;相对于以前&#xff0c;最近在更加频繁的迁移服务器&#xff0c;简单的 Shell 脚本已经不能满足需求了&#xff0c;于是将所有的项目 Docker 化。 部分不含敏感配置的项目准备放到 DockerHub 上面&#xff0c;但是在 docker push 的时候报…

利用 Algolia 为静态博客搭建实现内容搜索

现在静态博客的标配之一就是博客搜索&#x1f50d;&#xff0c;我也是通过搭建博客发现了它&#xff0c;这篇主要记录一下怎么使用 algolia 完成博客搜索&#xff0c;自己的博客搭建使用的是 docusaurus 。 注册账号 首先需要去 algolia 官网注册自己的账号&#xff0c;可以直…

Java线程池(超详细)

1、基本概念 Java线程需要经过线程的创建&#xff0c;调用和销毁整个过程&#xff0c;频繁的创建和销毁会大大影响性能&#xff0c;所以引入的线程池&#xff1a; 好处&#xff1a; 提升性能&#xff1a;线程池能独立负责线程的创建、维护和分配线程管理&#xff1a;每个Java…

k8s安装kuboard面板

前面介绍了k8s的dashboard面板&#xff0c;这里介绍国人开发的kuboard面板&#xff0c;相较于dashboard面板&#xff0c;kuboard面板对很多运维调试功能做了很多增强。官方文档&#xff1a;https://www.kuboard.cn/install/v3/install.html#kuboard-v3-x-%E7%89%88%E6%9C%AC%E8…