当前位置: 首页 > news >正文

推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石.

矩阵分解依据用户对物品的评分, 判断出用户和物品的隐语义向量, 然后依据用户和物品的隐语义向量来进行推荐.

推荐系统用到的数据能够有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常很稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵.

1. 基本矩阵分解


矩阵分解方法会将用户和物品映射到 f 维的隐向量空间, 用户对物品的评分表示为两个向量的内积. 亦即, 每一个物品 i 表示为向量 q_i\in\mathbb{R}^f , 每一个用户表示成向量 p_u\in\mathbb{R}^f . 对于物品 i , 向量 q_i 的元素表示的是物品 i 具有这些隐因子的程度, 对于用户 u , 向量 p_u 表示的是用户对各个隐因子的兴趣, 元素的值可正可负. 两个向量的内积

\hat{r_{ui}}=q_i^Tp_u\tag{1}

表示的就是预计的用户对物品的评分. 所以基本的挑战就是计算用户和物品到隐向量的映射.

最简单的就是神秘值分解(Singular value decomposition, SVD), 使用SVD须要分解用户物品评分矩阵, 可是通常该矩阵中有非常多值是缺失的, 这样的情况下的SVD是不可行的. 另外, 仅仅处理已知的这些评分easy导致过拟合. 能够通过填充数据来使得矩阵变得稠密, 可是填充数据的准确性非常是问题.

最主流的做法是仅仅对那些已观測到的评分进行建模, 而且通过使用正则化项来避免过拟合, 亦即求解下面问题:

\min_{q, p}\sum_{(u,i)\in\mathcal{k}}(r_{ui}-q_i^Tp_u)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2)\tag{2}

当中 \mathcal{k} 是所以已知评分的用户-物品对,  \lambda 控制着正则化的程度.

2. 学习算法


两种经常使用的求解上式的算法为随机梯度下降(SGD)和ALS(Alternating Least Square).

2.1 随机梯度下降


对于每一个用户-物品评分, 计算预測误差

e_{ui} = r_{ui} - q_i^Tp_u

然后依照梯度下降的方向更新用户和物品的隐向量:

q_i \leftarrow q_i + \gamma\cdot(e_{ui}\cdotp_{u}-\lambda\cdot q_i)

p_u \leftarrow p_u + \gamma\cdot(e_{ui}\cdot q_{i}-\lambda\cdotp_u)

2.2 ALS(Alternating Least Square)


由于 p_u q_i 都是未知的, 所以公式2不是凸的. 可是, 当我们固定当中一个变量, 则2式变成一个二次函数, 可以被最优的求解. 所以ALS算法的思想就是交替的固定 p_u q_i , 然后求解另外一个变量的二次函数的最优值.

通常SGD都会比ALS要简单并且高速, 可是ALS的并行性比較好, 并且能够较好地处理稀疏数据(?).

3. 加入偏置项


矩阵分解方法的一个优点就是能够灵活的加入很多面向应用的要求. 比方, 通常来说, 不同用户的评分倾向不同, 用的用户的打分普遍较高, 有的普遍较低, 物品亦然. 所以只使用用户和物品之间的交互 q_i^Tp_u 来对评分进行建模不是非常好, 还须要加上一些偏置项. 一种一阶偏置项近似为:

b_{ui}=\mu+b_i+b_u

当中 \mu 描写叙述的是全部评分的平均值,  b_u, b_i 描写叙述的是用户和物品相对于 \mu 的偏差.

评分模型为:

\hat{r_{ui}}=\mu + b_i | b_u + q_i^Tp_u

转化为最优化问题为:

\min_{p\cdot,q\cdot,b\cdot}\sum_{(u,i)\in\mathcal{k}}(r_{ui}-\mu-b_u-b_i-p_u^Tq_i)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2 +b_u^2+ b_i^2)

4. 其它的输入源


当解决冷启动问题时, 用户的评分信息非常少, 这时候就须要使用用户的其它输入信息, 比方用户隐式反馈(浏览, 购买历史等). 令 N(u) 表示用户有隐反馈的物品. 系统能够通过这些物品来对用户建模, 亦即把每一个物品表示成一个隐向量 x_i\in\mathbb{R}^f , 则用户能够通过下式来描写叙述:

\sum_{i\in N(u)}x_i

能够对上式进行正则化:

|N(u)|^{-0.5}\sum_{i\in N(u)}x_i

也能够使用用户的一些其它属性(性别, 年龄, 收入等)来对用户建模, 令 A_u 表示用户的一些布尔属性,则隐向量 y_{a}\in\mathbb{R}^f 表示用户的某个属性, 用户的全部属性能够通过下式来描写叙述:

\sum_{a\in A(u)}y_a

用户对物品的评分能够表示为:

\hat{r_{ui}}=\mu + b_i | b_u + q_i^T[p_u + |N(u)|^{-0.5}\sum_{i\in N(u)}x_i +\sum_{a\in A(u)}y_a]

5. 时间因素


到如今为止, 模型是静态的, 可是实际中物品的流行程度会随着时间变化, 用户的评分倾向也会变化, 用户的隐向量也会随时间变化. 所以能够将这些变量表示成时间的函数来更好地描写叙述这些现象:

\hat{r}_{ui}=\mu + b_i(t) + b_u(t) + q_i^Tp_u(t)

6. 不同可信度的输入源


不同的评分的可信度不同. 比方广告会影响某个物品的评分, 另外, 有些作弊的用户会对某些物品恶意的打高分或者低分. 另外, 在使用隐式反馈时, 能够使用某些行为(比方浏览)等得次数来表示用户喜欢某个物品的程度. 能够通过为某个评分 r_{ui} 设置权重 c_{ui} 来解决上述问题:

\min_{p\cdot,q\cdot,b\cdot}\sum_{(u,i)\in\mathcal{k}}(c_{ui}(r_{ui}-\mu-b_u-b_i-p_u^Tq_i)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2 +b_u^2+ b_i^2)

 

參考文献:

[1]. Yuhuda Koren, Robert Bell and Chris Volinsky. Matrix Factorization Techniques for Recommender Systems.

相关文章:

  • Java——操作Excel表格,读取表格内容
  • 伊吹萃香
  • BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法
  • 数据库对象
  • 中文分词--逆向最大匹配
  • servlet文件下载2(单文件下载和批量下载)
  • php 上传文件
  • 程序员工作中绕不开的9大问题,你遇到过几个?
  • Adobe将于2020年末停止对Flash的支持
  • quick-cocos2d-x教程9:实例之加上背景图片
  • iOS将数组中的内容分拼接成字符串
  • 如何使用阿里云虚拟主机搭建博客(二)搭建篇
  • create-react-app做的留言板
  • 中国式社交网络就一个“约”字而已
  • 测试人员的GitHub
  • @angular/forms 源码解析之双向绑定
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 11111111
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Consul Config 使用Git做版本控制的实现
  • es6(二):字符串的扩展
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • javascript数组去重/查找/插入/删除
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mybatis初体验
  • mysql_config not found
  • php中curl和soap方式请求服务超时问题
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • swift基础之_对象 实例方法 对象方法。
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零开始在ubuntu上搭建node开发环境
  • 大型网站性能监测、分析与优化常见问题QA
  • 基于 Babel 的 npm 包最小化设置
  • 跨域
  • 爬虫模拟登陆 SegmentFault
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小而合理的前端理论:rscss和rsjs
  • 学习使用ExpressJS 4.0中的新Router
  • 一些css基础学习笔记
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #ifdef 的技巧用法
  • #微信小程序:微信小程序常见的配置传值
  • (BFS)hdoj2377-Bus Pass
  • (C#)一个最简单的链表类
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (算法)N皇后问题
  • (转)树状数组
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core 6 集成和使用 mongodb
  • .NET Standard 的管理策略
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)