推荐系统三十六式学习笔记:原理篇.矩阵分解12|如果关注排序效果,那么这个模型可以帮到你
目录
- 矩阵分解的不足
- 贝叶斯个性化排序
- AUC
- 构造样本
- 目标函数
- 训练方法
- 总结
矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈,还是 处理隐式反馈都让人颇有微词,这一点是为什么呢?
矩阵分解的不足
前面讲过的两种矩阵分解,本质都是在预测用户对一个物品的偏好程度,哪怕不是预测评分,只是预测隐式反馈,也是这个事实。
得到矩阵分解结果后,常常在实际使用时,又是用这个预测结果来排序。原来的目标是让模型的预测误差最小化,到最后还是只想要一个好点的排序。
这种针对单个用户对单个物品的偏好程度进行预测,得到结果后再排序的问题,在排序学习中的叫做:point-wise,其中point意思就是:只单独考虑每个物品,每个物品 像是空间中孤立的点一样。与之相对应的,还有直接预测物品两两之间相对排序的问题,叫做pair-wise ,pair顾名思义就是成对成双。
前面将的矩阵分解都属于point-wise模型。这类模型的尴尬是:只能收集到正样本,没有负样本,于是认为缺失值就是负样本,再以预测误差为评判标准去逼近这些样本。逼近正样本没有问题,但同时逼近的负样本只是缺失值而已,并不能确认用户到底是不喜欢还是喜欢。虽然这些模型采取了一些措施来规避这个问题,比如负样本采样,但尴尬还是存在的,为了排序而绕路也是事实。
既然如此,能不能直面问题,采用pair-wise 来看待矩阵分解呢?当然可以。实际上,更直接的推荐模型应该是:能够较好地为用户排列出更好的物品相对顺序,而非更精确的评分。
这个问题已经有专业的从业者们提出了方法:贝叶斯个性化排序,简称BPR模型。下面,我们就一探究竟。
贝叶斯个性化排序
在前面的专栏文章中,已提到均方根误差,用于评价模型预测准确度的。现在要关注的是相对排序,用什么指标比较好呢?AUC,全称是Area Under Curve,意思是曲面下的面积,这里的曲线是ROC曲线。
AUC
AUC 这个值在数学上等价于:模型把关心的那一类样本排在其他样本前面的概率。最大是1,完美结果,而0.5是书籍排列,0就是完美的全部排错。
这个非常适合来评价模型的排序效果,比如说,得到一个推荐模型后,按照它计算的分数,能不能把用户真正想消费的物品排在前面。这个模型上线前是可以用日志完全计算出来的。
AUC 怎么计算呢?一般步骤如下:
1、用模型给样本计算推荐分,比如样本都是用户和物品这样一对一对的,同时还包含了有无反馈的标识;
2、得到打过分的样本,每条样本保留两个信息,第一个是分数,第二个是0或者1,1标识消费过,是正样本,0标识没有,负样本;
3、按照分数对样本重新排序,降序排列;
4、给每一个样本赋一个排序值,第一位r1=n,第二位r2=n-1,以此类推;其中要注意,如果几个样本分数一样,需要将其排序值调整为他们的平均值;
5、最终按照下面的这个公式计算就可以得到AUC值;
A U C = ∑ i ∈ ( 样 本 ) T i − M ∗ ( M + 1 ) 2 M ∗ N AUC =\frac{\sum_{i∈(样本)}{T_i-\frac{M*(M +1)}{2}}}{M*N} AUC=M∗N∑i∈(样本)Ti−2M∗(M+1)
这个公式:
第一部分:分母是我们关心的那类样本,也就是正样本,有M个,以及其他的样本有N个,这两类样本相对排序总共的可能性有M*N种;
第二部分:分子是这样计算的:第一名的排序值是r_1,它在排序上不但比过了所有的负样本,而且比过了自己以外的正样本。
正样本和正样本是同一类,所以要排查,于是就有N-M 种组合,以此类推,排序值为rm的就贡献了rm-1,把这些加起来就是分子;
关于AUC,越接近1越好是肯定的,但是并不是越接近0就越差,最差的是接近0.5,如果AUC很接近0的话,只需要把模型预测的结果加个负号就能让AUC接近1;
BPR模型,它提出了一个优化准则和学习框架,那到底BPR做了什么事情呢?主要有三点:
1.一个样本构造方法;
2.一个模型目标函数;
3.一个模型学习框架;
构造样本
前面介绍的矩阵分解,在训练时候处理的样本是:用户、物品、反馈,这样的三元组形式;
其中反馈又包含真实反馈和缺失值,缺失值充当负样本。BPR则不同,提出要关心的是物品之间对于用户的相对排序,于是构造的样本是:用户、物品1、物品2、两个物品相对排序,这样的四元组形式,其中两个物品的相对排序,取值是:
1、如果物品1是消费过的,而物品2不是,那么相对顺序取值为1,是正样本;
2、如果物品1和物品2刚好相反,则是负样本;
3、样本中不包含其他情况:物品1和物品2都是消费过的,或者都是没消费过的。
学习的顺序是反应用户偏好的相对顺序,而在使用时,面对的是所有用户还没消费过的物品,这些物品仍然可以在这样的模型下取得相对顺序,这就比三元组point-wise 样本要直观得多。
目标函数
现在,每条样本包含的是两个物品,样本预测目标是两个物品的相对排序。BPR完成矩阵分解,依然需要像交替最小二乘那样的思想。
先假设矩阵分解结果已经有了,于是计算出用户对于每个物品的推荐分数,只不过这个推荐分数可能并不满足均方根误差最小,而是满足物品相对排序最佳。
得到了用户和物品的推荐分数后,就可以计算四元组的样本中,物品1和物品2的分数差,这个分数可能是正数,也可能是负数,还可能是0;
希望的情况是:如果物品1和物品2相对排序为1,那么希望两者分数之差是个正数,而且越大越好;如果物品1和物品2的相对排序时0,则希望分数之差是负数,且越小越好;
用个符号来表示这个差: X u 12 X_{u12} Xu12,表示的是对于用户u,物品1和物品2的矩阵分解预测分数差。然后再用sigmoid函数把这个分数差压缩到0到1之间。
θ = 1 1 + e ( − X u 12 ) θ=\frac{1}{1+e^{(-X_{u12})}} θ=1+e(−Xu12)1
用这种方式预测了物品1排在物品2前面的似然概率,所以最大化交叉熵就是目标函数了。目标函数通常还要防止过拟合,加上正则项,正则项其实认为模型参数有个先验概率,这也是BPR这个名字中有’贝叶斯’的来历。BPR认为模型的先验概率符合正态分布,对应到正则化就是说L2正则。
所有样本都计算:模型参数先验概率p theta ,和似然概率的乘积,最大化这个目标函数就能够得到分解后的矩阵参数其中theta就是分解后的矩阵参数。
这个目标函数化简和变形后,和把AUC当成目标函数是非常相似的,正因为如此,BPR模型宣称该模型是为AUC而生。
训练方法
有了目标函数之后,就要有训练方法。梯度下降可以,梯度下降又分为批量梯度和随机梯度两个选择,前者收敛慢,后者训练快但不稳定。
因此BPR使用了一个介于两者之间的训练方法,结合重复抽样的梯度下降。具体如下:
1、从全量样本中有放回地随机抽取一部分样本;
2、用这部分样本,采用随机梯度下降优化目标函数,更新模型参数;
3、重复步骤1,直到满足停止条件。
这样,就得到了一个更符合推荐排序要求的矩阵分解模型了;
总结
今天是矩阵分解三篇的最后一篇,传统的矩阵分解,无论是隐式反馈还是显示反馈,都是希望更加准确地预测用户对单个物品的偏好,而实际上,如果能够预测用户对物品之间的相对偏好,则更加符合实际需求的直觉。
BPR就是这样一整套针对排序的推荐算法,它事实上提出了一个优化准则和一个学习框架,至于其中优化的对象是不是矩阵分解并不是它的重点。但我在这里结合矩阵分解对其进行了讲解,同时还介绍了排序时最常用的评价指标AUC及其计算方法。
相关文章:
推荐系统三十六式学习笔记:原理篇.矩阵分解12|如果关注排序效果,那么这个模型可以帮到你
目录 矩阵分解的不足贝叶斯个性化排序AUC构造样本目标函数训练方法 总结 矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈&…...
Kafka之ISR机制的理解
文章目录 Kafka的基本概念什么是ISRISR的维护机制ISR的作用ISR相关配置参数同步过程示例代码总结 Kafka中的ISR(In-Sync Replicas同步副本)机制是确保数据高可用性和一致性的核心组件。 Kafka的基本概念 在Kafka中,数据被组织成主题…...
如何设计一个点赞系统
首先我们定义出一个点赞系统需要对外提供哪些接口: 1.用户对特定的消息进行点赞; 2.用户查看自己发布的某条消息点赞数量以及被哪些人赞过; 3.用户查看自己给哪些消息点赞过; 这里假设每条消息都有一个message_id, 每一个用户都…...
对象存储测试工具-s3cmd
一、环境安装 官网:https://s3tools.org/s3cmd 下载安装包:https://s3tools.org/download GitHub:https://github.com/s3tools/s3cmd/releases 本文安装包:https://github.com/s3tools/s3cmd/releases/download/v2.0.2/s3cmd-2.0…...
OpenCV--图像色彩空间及转换
图像色彩空间及转换 python代码和笔记 python代码和笔记 import cv2 色彩空间,基础:RGB或BGR OpenCV中: 一、HSV(HSB):用的最多, Hue:色相-色彩(0-360),红色:0,绿色&…...
RIP解决不连续子网问题
#交换设备 RIP解决不连续子网问题 一、不连续子网的概念 相同主网下的子网,被另一个主网分割,例如下面实验拓扑在某公司的网络整改项目中,原先R1 和RS 属于同一主网络 10.0.0.0/8,现被 R2、R3、R4 分离,整网采用了 …...
动态轮换代理IP是什么?有什么用?
如果您要处理多个在线帐户,选择正确的代理类型对于实现流畅的性能至关重要。但最适合这项工作的代理类型是什么? 为了更好地管理不同平台上的多个账户并优化成本,动态住宅代理IP通常作用在此。 一、什么是轮换代理? 轮换代理充当…...
MAC配置VScode中C++项目debug环境
文章目录 配置步骤问题解决Unable to start debugging. LLDB exited unexpectedly with exit code 137 (0x89). 配置步骤 在Mac上配置VS Code以进行C调试涉及几个步骤: 安装必要的工具: 确保您已经安装了Visual Studio Code和C插件。 检查是否安装了Clang…...
PostgreSQL源码分析——CREATE CAST
CREATE CAST源码分析 CREATE CAST用法 CREATE CAST —— 定义一个用户自定义的类型转换 用法如下: CREATE CAST (source_type AS target_type)WITH FUNCTION function_name [ (argument_type [, ...]) ][ AS ASSIGNMENT | AS IMPLICIT ]CREATE CAST (source_type…...
解锁5G新营销:视频短信的优势与全方位推广策略
随着5G时代的全面来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其巨大的潜力。视频短信群发以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受&…...
视频监控平台功能:国外的硬盘录像机NVR通过ISUP协议(原ehome协议)接入AS-V1000视频平台
目录 一、背景说明 二、ISUP协议介绍 1、海康ISUP协议概述 2、ISUP协议支持主码流和子码流切换 (1)灵活配置和个性化 (2)适应不同网络带宽,提高使用体验 3、海康ehome相关文章 三、ISUP协议接入说明 1、平台侧…...
PostgreSQL查询用户
在 PostgreSQL 中,可以通过查询系统表来确定当前用户是否是超级管理员(超级用户)。具体来说,可以使用 pg_roles 系统表,该表包含数据库中所有角色的信息。 以下是查询当前用户是否是超级用户的 SQL 语句: …...
力扣1539.第k个缺失的正整数
力扣1539.第k个缺失的正整数 占位运算 只要n<k ,k;最终k就是结果 class Solution {public:int findKthPositive(vector<int>& arr, int k) {for(int n : arr){if(n < k) k ;else break;}return k;}};...
如何快速解决屏幕适配问题
下面将利用postcss插件快速解决屏幕适配问题。仅用少量代码,新手均可快速使用。 Step1. 安装 npm install postcss-px-to-viewport-8-plugin --save-dev Step2. 新建 postcss.config.js 文件,做基础配置 module.exports {plugins: {postcss-px-to-v…...
Go基础编程 - 09 - 通道(channel)
通道(channel) 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇:结构体 Go语言的并发模式:不要通过共享内存来通信,而应该通过通信来共享内存。 Go语言…...
[SAP ABAP] 数据类型
1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息,并且可以存储8位数字 输出结果: 提示Tips:日期和时间类型的变量可以直接进…...
什么是Vue开发技术
概述 Vue.js 是一个用于构建用户界面的渐进式框架,它设计得非常灵活,可以轻松地被集成到任何项目中。 vue是视图的发音,其目的是帮助开发者易于上手,提供强大的功能构建复杂的应用程序 示例 以下是vue基本的语法概述 声明式渲…...
【QT】
通信服务端实现 widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox>//消息 #include <QTcpServer> #include <QList> #include <QTcpSocket> QT_BEGIN_NAMESPAC…...
【转载】使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目
使用 .NET Upgrade Assistant(升级助手)升级 .NET 老旧版本项目:https://blog.csdn.net/ChaITSimpleLove/article/details/134711604...
SpringBoot如何自定义启动Banner 以及自定义启动项目控制台输出信息 类似于若依启动大佛 制作教程
前言 Spring Boot 项目启动时会在控制台打印出一个 banner,下面演示如何定制这个 banner。 若依也会有相应的启动动画 _ooOoo_o8888888o88" . "88(| -_- |)O\ /O____/---\____. \\| |// ./ \\||| : |||// \/ _||||| -:- |||||- \| | \\…...
访问控制列表(Access Control Lists,ACL)与哈希查找的爱恨情怨
访问控制列表(Access Control Lists,ACL)与哈希查找 什么是访问控制列表ACL?直接说ACL是干啥的ACL概念为什么需要ACLACL类型ACL匹配机制使用例子 哈希查找什么是哈希查找?哈希查找的基本原理哈希查找的步骤 哈希查找在…...
一文讲清楚分销裂变是什么?怎么做好分销裂变?【附案例】
在数字化营销日益盛行的今天,分销裂变作为一种高效的推广手段,受到了越来越多企业的青睐。那么,分销裂变究竟是什么?我们又该如何做好分销裂变呢?林叔将从定义、方法以及案例分析三个方面进行阐述。 一、分销裂变是什…...
Mybatis Plus 详解 IService、BaseMapper、自动填充、分页查询功能
结构直接看目录 前言 MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 愿景 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效…...
鸿蒙开发组件:【FA模型的Context】
FA模型的Context FA模型下只有一个Context。Context中的所有功能都是通过方法来提供的,它提供了一些featureAbility中不存在的方法,相当于featureAbility的一个扩展和补全。 接口说明 FA模型下使用Context,需要通过featureAbility下的接口…...
Linux下手动修改服务器时间(没网环境下)
在客户服务器上更新程序时,发现服务器时间不对,现在应该是下午13:44:00,但服务器却显示为:21:40:53,所有是不对的。 date解决办法: 1、由于服务器是没有网的,只能手动设置时间,输入…...
嵌入式系统软件开发环境_3.主要功能和典型产品
1.嵌入式系统软件开发环境的主要功能 由于嵌入式系统的软件开发通常采用的是交叉开发方式,因此其开发环境中的工具应支持这种交叉开发的特点。嵌入式系统软件开发环境的功能应覆盖嵌入式软件开发过程,即编码过程、编译过程、构建过程、下载过程、调式过程…...
使用Python保护或加密Excel文件的7种方法
目录 安装Python Excel库 Python 使用文档打开密码保护 Excel 文件 Python 使用文档修改密码保护 Excel 文件 Python 将 Excel 文件标记为最终版本 Python 保护 Excel 工作表 Python 在保护 Excel 工作表的同时允许编辑某些单元格 Python 锁定 Excel 工作表中的特定单元…...
【嵌入式Linux】<总览> 文件IO(更新中)
文章目录 前言 一、常用函数 1. open函数 2. close函数 3. write函数 4. read函数 5. dup函数 6. dup2函数 二、文件读写细节 1. 换行符 2. 文件描述符 3. errno和perror 前言 在Linux系统中,一切皆文件。因此,掌握Linux下文件IO常用的函数…...
【无线传感网】分簇路由算法介绍
目录 1、LEACH路由算法 2、PEGASIS 算法 3、TEEN 算法 5、APTEEN 5、LEACH-C 算法 无线传感网中的路由协议就是寻找一条路径让网络中节点沿着这条路径将数据信息传输出去。路由协议的两大关键要点就是路径的优化和数据的分组,在传统计算机网络中,是将网络的拓扑…...
java 利用poi读取wps嵌入式图片,自测
代码 主要工具类 需要引入依赖: package com.chenkang.demo.util;import cn.wps.officeDocument.x2017.etCustomData.CellImagesDocument; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.…...
网站建设微信运营公司/口碑营销5t
当前行业提供的大部分人工智能数据都以朗读式训练数据为主,然而人与机器之间的交互不应该只是一问一答的简单对话或者命令控制,而是要理解语言的上下文,识别人的情感需求并做出相应的反馈”。 随着技术突破带来的用户体验的提升,…...
在网站留外链怎么做/许昌seo公司
场景:多个相同的Windows服务(部署在不同的服务器上, 仅配置文件不同)需要附加WCF服务, 而网站在访问这些类似的WCF服务时, 不知道其明确地址所以无法直接引用。于是, 无配置便成了必然的选择! 下面是无配置…...
永城做网站/app优化
引言:邢不行的系列帖子“量化小讲堂”,通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助。个人微信:xingbuxing0807,有问题欢迎交流。KDJ指标选股有效吗KDJ指标是最常用的技术指标之一…...
网站维护能自己做吗/英文网站seo
实验16:EEPROM-IIC 主程序 /************************************************************************************** * EEPROM-IIC实验 * 实现现象:下载程序后数码管后4位显示0,按K1保存显示的数据&#x…...
ps网站参考线怎么做/推广公司经营范围
GIF gif中快捷键 执行sql ctrlenter 作用 比如ip之类的参数需要使用. 这样每次可以用 ${ip} 表示,然后dataGrip根据语法自动识别该变量,就算sql中多次使用,你通过参数 P 按钮修改一次,全局生效. 提高便利性....
怎么编辑网站后台/网络宣传方式有哪些
题面在这里! 显然直接枚举左端点(右端点)就OK啦。 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define ll long long using namespace std; const int N1e55;int n,a[N]…...