推荐系统中的矩阵分解总结

2023-05-16

最近学习矩阵分解,但是学了好多种类,都乱了,看了这篇文章,系统性的总结了矩阵分解,感觉很棒,故分享如下:

前言

推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filtering),它是基于这样的假设:用户如果在过去对某些项目产生过兴趣,那么将来他很可能依然对其保持热忱。其中协同过滤技术又可根据是否采用了机器学习思想建模的不同划分为基于内存的协同过滤(Memory-based CF)与基于模型的协同过滤技术(Model-based CF)。其中基于模型的协同过滤技术中尤为矩阵分解(Matrix Factorization)技术最为普遍和流行,因为它的可扩展性极好并且易于实现,因此接下来我们将梳理下推荐系统中出现过的经典的矩阵分解方法。

矩阵分解

对于推荐系统来说存在两大场景即评分预测(rating prediction)与Top-N推荐(item recommendation,item ranking)。评分预测场景主要用于评价网站,比如用户给自己看过的电影评多少分(MovieLens),或者用户给自己看过的书籍评价多少分(Douban)。其中矩阵分解技术主要应用于该场景。Top-N推荐场景主要用于购物网站或者一般拿不到显式评分信息的网站,即通过用户的隐式反馈信息来给用户推荐一个可能感兴趣的列表以供其参考。其中该场景为排序任务,因此需要排序模型来对其建模。因此,我们接下来更关心评分预测任务。

对于评分预测任务来说,我们通常将用户和项目(以电影为例)表示为二维矩阵的形式,其中矩阵中的某个元素表示对应用户对于相应项目的评分,1-5分表示喜欢的程度逐渐增加,?表示没有过评分记录。推荐系统评分预测任务可看做是一个矩阵补全(Matrix Completion)的任务,即基于矩阵中已有的数据(observed data)来填补矩阵中没有产生过记录的元素(unobserved data)。值得注意的是,这个矩阵是非常稀疏的(Sparse),稀疏度一般能达到90%以上,因此如何根据极少的观测数据来较准确的预测未观测数据一直以来都是推荐系统领域的关键问题。

重点:推荐系统的评分预测场景可看做是一个矩阵补全的游戏,矩阵补全是推荐系统的任务,矩阵分解是其达到目的的手段。因此,矩阵分解是为了更好的完成矩阵补全任务(欲其补全,先其分解之)。之所以可以利用矩阵分解来完成矩阵补全的操作,那是因为基于这样的假设:假设UI矩阵是低秩的,即在大千世界中,总会存在相似的人或物,即物以类聚,人以群分,然后我们可以利用两个小矩阵相乘来还原它。

1、PureSVD

当然提到矩阵分解,人们首先想到的是数学中经典的SVD(奇异值)分解,在这我命名为PureSVD(传统并经典着),直接上公式:

当然SVD分解的形式为3个矩阵相乘,左右两个矩阵分别表示用户/项目隐含因子矩阵,中间矩阵为奇异值矩阵并且是对角矩阵,每个元素满足非负性,并且逐渐减小。因此我们可以只需要前 k 个因子来表示它。

如果想运用SVD分解的话,有一个前提是要求矩阵是稠密的,即矩阵里的元素要非空,否则就不能运用SVD分解。很显然我们的任务还不能用SVD,所以一般的做法是先用均值或者其他统计学方法来填充矩阵,然后再运用SVD分解降维。

2、FunkSVD

http://sifter.org/~simon/journal/20061211.html

刚才提到的PureSVD首先需要填充矩阵,然后再进行分解降维,同时由于需要求逆操作(复杂度O(n^3)),存在计算复杂度高的问题,所以后来Simon Funk提出了FunkSVD的方法,它不在将矩阵分解为3个矩阵,而是分解为2个低秩的用户项目矩阵,同时降低了计算复杂度:

它借鉴线性回归的思想,通过最小化观察数据的平方来寻求最优的用户和项目的隐含向量表示。同时为了避免过度拟合(Overfitting)观测数据,又提出了带有L2正则项的FunkSVD:

以上两种最优化函数都可以通过梯度下降或者随机梯度下降法来寻求最优解。

3、PMF

Salakhutdinov et al. Probabilistic matrix factorization. NIPS(2008): 1257-1264.

PMF是对于FunkSVD的概率解释版本,它假设评分矩阵中的元素 R_{i,j}是由用户潜在偏好向量 U_{i}^{T}和物品潜在属性向量V_{j}的内积决定的,并且服从均值为 U_{i}^{T}V_{j},方差为 \sigma ^{^{2}}的正态分布:

则观测到的评分矩阵条件概率为:

同时,假设用户偏好向量与物品偏好向量服从于均值都为0,方差分别为 \sigma _{U}^{2}I\sigma ^{_{V}^{2}}I的正态分布:

根据贝叶斯公式,可以得出潜变量U,V的后验概率为:

接着,等式两边取对数 ln 后得到:

最后,经过推导,我们可以发现PMF确实是FunkSVD的概率解释版本,它两个的形式一样一样的。

注:为了方便读者理解,在此举例推导中间项 N\left ( U^{_{i}|0,\sigma _{U}^{2}I} \right ),将此项展开,带入多维正态分布即可得到 。推导如下:

4、BiasSVD

Koren et al. Matrix factorization techniques for recommender systems. Computer 42.8 (2009).

在FunkSVD提出来之后,陆续又提出了许多变形版本,其中相对流行的方法是BiasSVD,它是基于这样的假设:某些用户会自带一些特质,比如天生愿意给别人好评,心慈手软,比较好说话,有的人就比较苛刻,总是评分不超过3分(5分满分);同时也有一些这样的项目,一被生产便决定了它的地位,有的比较受人们欢迎,有的则被人嫌弃,这也正是提出用户和项目偏置项的原因;项亮给出的解释是:对于一个评分系统有些固有属性和用户物品无关,而用户也有些属性和物品无关,物品也有些属性与用户无关,具体的预测公式如下:

其中, \mu为整个网站的平均评分,是真个网站的基调; b_{u} 为用户的评分偏置,代表某个用户的评分基调, b_{i} 为项目的被评分偏置,代表某个项目的属性基调。

5、SVD++

Koren Y. Factor in the neighbors: Scalable and accurate collaborative filtering[J]. ACM Transactions on Knowledge Discovery from Data (TKDD), 2010, 4(1): 1.

在用户除了显式评分外,隐式反馈信息同样有助于用户的偏好建模,因此随后提出了SVD++。它是基于这样的假设:用户除了对于项目的显式历史评分记录外,浏览记录或者收藏列表等隐反馈信息同样可以从侧面一定程度上反映用户的偏好,比如用户对某个项目进行了收藏,可以从侧面反映他对于这个项目感兴趣,具体反映到预测公式为:

其中 N(i)为用户 i所产生隐反馈行为的物品集合; y^{_{s}}为隐藏的对于项目 s的个人喜好偏置,是一个我们所要学习的参数;至于 |N(i))|^{^{\frac{1}{2}}}是一个经验公式。

6、timeSVD

Koren et al. Collaborative filtering with temporal dynamics.  Communications of the ACM 53.4 (2010): 89-97.

它是基于这样的假设:用户的兴趣或者偏好不是一成不变的,而是随着时间而动态演化。于是提出了timeSVD,其中用户的和物品的偏置随着时间而变化,同时用户的隐含因子也随着时间而动态改变,在此物品的隐含表示并未随时间而变化(假设物品的属性不会随着时间而改变)。

其中t 为时间因子,表示不同的时间状态。

7、NMF

Lee et al. Learning the parts of objects by non-negative matrix factorization.  Nature 401.6755 (1999): 788.

这是一篇发表在Nature上的经典论文,谷歌学术显示引用将近9k,它提出了一个假设:分解出来的小矩阵应该满足非负约束。

因为在大部分方法中,原始矩阵R被近似分解为两个低秩矩阵 R=P^{^{T}}Q相乘的形式,这些方法的共同之处是,即使原始矩阵的元素都是非负的,也不能保证分解出的小矩阵都为非负,这就导致了推荐系统中经典的矩阵分解方法可以达到很好的预测性能,但不能做出像User-based CF那样符合人们习惯的推荐解释(即跟你品味相似的人也购买了此商品)。在数学意义上,分解出的结果是正是负都没关系,只要保证还原后的矩阵元素非负并且误差尽可能小即可,但负值元素往往在现实世界中是没有任何意义的。比如图像数据中不可能存在是负数的像素值,因为取值在0~255之间;在统计文档的词频时,负值也是无法进行解释的。因此提出带有非负约束的矩阵分解是对于传统的矩阵分解无法进行科学解释做出的一个尝试。它的公式如下:

其中, P, Q两个矩阵中的元素满足非负约束。

8、WMF

Pan et al. One-class collaborative filtering. ICDM, 2008.
Hu et al. Collaborative filtering for implicit feedback datasets. ICDM, 2008.

对于矩阵分解来说,我们一般是处理的推荐系统中的评分预测任务,但同样矩阵分解也可以用来进行Top-N的推荐,即根据隐式信息来预测用户是否点击某项目。你可以把他看做是二分类问题,即点或者不点。但这不是普通的二分类问题,因为在模型训练的过程中负样本并非都为真正的负样本,可能是用户根本没见过该项目,何来喜不喜欢,没准他看到后喜欢呢,即正样本告诉我们作者喜欢的信息,但负样本并不能告诉我们该用户不喜欢。由于只存在正样本,所以我们把只有正反馈的问题定义为one-class问题,即单类问题。对于单类问题,该作者提出了两种解决策略,一种是加权的矩阵分解,另一种是负采样技术。虽然只是加了一下权重,看起来比较naive,但在于当时的研究背景下,这一小步其实是推荐系统中的一大步。

对于单类问题的研究一直没有停止过,虽然负采样技术是启发式的,即不用通过数据建模的方式来进行预测,但效果还是很好用的。最近几年人们提出了基于模型的方法来处理这种单类问题,即从缺失数据中来进行建模,具体可参见这两篇论文【Hernández-Lobato et al 2014,Liang et al 2016】。

10、LLORMA

Lee et al. Local low-rank matrix approximation. ICML. 2013.

经典的矩阵分解模型是假设整个用户-项目矩阵(即UI矩阵)满足低秩假设(即全局低秩假设),即在整个系统当中,用户和项目总是满足存在相似的某种模式,即物以类聚,人以群分。

这种假设固然有道理,但在当今大数据时代下,全局意义上的低秩假设似乎太强了,尤其是在数据量巨大的情况下(即用户数与项目数都很多的系统当中),因此该论文推翻了全局意义上经典的全局低秩假设,它认为大千世界,林林总总,我们应该去寻找局部的低秩假设(即局部低秩假设)。首先根据某种相似测度来将整个大矩阵分为若干个小矩阵,每个小矩阵当中满足某种相似度阈值,然后再在局部的小矩阵当中做低秩假设。这样,全局的大矩阵可以由多个局部的小矩阵来加权组合构成,具体可参见该论文。

11、SRui

Ma Hao. An experimental study on implicit social recommendation. SIGIR, 2013.

虽然经典的矩阵分解方法已经可以到达比较好的预测性能了,但它固有的弊病仍然是躲不开的,即数据稀疏与冷启动问题。为了缓解数据稀疏我们可以引入丰富的社交信息。即如果两个用户是朋友关系,那么我们假设他们有相同的偏好,同时他们学得的用户隐表示在向量空间应该有相近的距离。用户维度如此,同理,项目维度亦可以利用此思路来约束项目隐表示。即如果两个项目之间的关系较近,那么在低维向量空间中的距离同样也应该较小。这里的项目关系是从UI矩阵中抽取出来的,论文中成为项目隐社交关系(其实项目维度跟社交没啥关系)。具体公式如下:

其中, s_{if}表示用户 i和用户 f的社交相似度, s_{jq}表示项目 j与项目 q的隐社交相似度,在用户维度和项目维度分别增加了平滑项约束,使得学得的隐特征表示更加符合现实意义。

12、ConvMF

Kim et al. Convolutional matrix factorization for document context-aware recommendation.  RecSys 2016.

当然矩阵分解的优点之一是可扩展性好,这当然不是吹的,比如16年的这篇文章就是将矩阵分解(MF)与图像处理领域很火的卷积神经网络(CNN)做了完美结合。

矩阵分解作为协同过滤模型中经典的方法,性能当然没的说。但它存在的数据稀疏与冷启动问题一直以来都是它的痛点,因此结合外部丰富的信息成为了缓解上述问题的有效途径。其中文本数据作为web中主流的数据形式成为了首选,并且对于文本的处理,大部分还是基于one-hot的表示,因此无法捕捉文档中上下文的关键信息,于是作者将两者做了结合,具体细节请参见论文,该公式如下:

其中,在使得用户隐向量与项目隐向量做内积尽可能逼近真实评分的同时,对项目隐向量做了额外约束,即让项目隐向量跟CNN学得的文档特性尽可能的接近。

13、NCRPD-MF

Hu et al. Your neighbors affect your ratings: on geographical neighborhood influence to rating prediction. S IGIR 2014.

刚才说到,MF的可扩展性好,一方面是可以和主流模型做无缝集成,另一方面是可以和多种信息源做特征融合,比如14年的这篇文章,它是融合了文本评论信息,地理邻居信息,项目类别信息以及流行度等信息,具体预测公式如下:

其中, q{_{w}}为文本特征的低维向量表示, v_{i}为地理邻居的低维向量表示, d_{c}为项目类别的低维特征表示。

总结

首先因为低秩假设,一个用户可能有另外一个用户与他线性相关(物品也一样),所以用户矩阵完全可以用一个比起原始UI矩阵更低维的矩阵表示,pureSVD就可降维得到两个低维矩阵,但是此方法要求原始矩阵稠密,因此要填充矩阵(只能假设值),因此有了funkSVD直接分解得到两个低维矩阵。因为用户,物品的偏置爱好问题所以提出了biasSVD。因为用户行为不仅有评分,且有些隐反馈(点击等),所以提出了SVD++。因为假设用户爱好随时间变化,所以提出了timeSVD。因为funkSVD分解的两个矩阵有负数,现实世界中不好解释,所以提出了NMF。为了符合TopN推荐,所以提出了WMF。推翻低秩假设,提出了LLORMA(局部低秩)。因为以上问题都未解决数据稀疏和冷启动问题,所以需要用上除了评分矩阵之外的数据来使推荐更加丰满,即加边信息。


参考链接:https://zhuanlan.zhihu.com/p/35262187

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

推荐系统中的矩阵分解总结 的相关文章

随机推荐

  • xstart使用方法

    出处 xff1a 点击打开链接 有时工作中 xff0c 我们需要用到Linux图形用户界面环境进行一些操作 xff08 比如装Oracle数据库等等 xff09 xff0c 这时就需要用xstart远程连接linux图形用户界面 xff0c
  • 资源网站-转自知乎

    作者 xff1a 吴剃中 链接 xff1a https zhuanlan zhihu com p 21479053 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 一 找资源利器 PS
  • java网络故障报修系统J2EE

    目 录 第一章 绪论 1 1 1 课题开发背景 1 1 2 课题研究意义 1 1 3 本课题主要工作 1 第二章 相关技术介绍 3 2 1 JSP技术 3 2 2 MySQL数据库 3 2 3 J2EE 技术 4 2 4 B S架构 5 第
  • linux脚本中的命令command not found的原因及解决方法

    场景描述 xff1a 一个生产的数据库备份脚本 xff0c 使用定时任务crontab配置自动执行bakup sh xff0c 报错信息是 expdp xff1a command not found 可是 xff0c 我在linux中 xf
  • ubuntu防火墙安装和设置-ufw

    ubuntu防火墙使用的是iptables 为了简化iptables设置 xff0c ubuntu提供了一个名为ufw的工具 本文主要介绍ufw使用方法 如果ufw没有安装 xff0c 那么可以使用如下命令安装 xff1a sudo apt
  • Win10/11+Ubuntu 双系统 修改grub默认启动选项 | 默认等待时间

    文章目录 进入Ubuntu xff0c 修改配置更新配置 本文环境为Win11 43 Ubuntu22 04 进入Ubuntu xff0c 修改配置 span class token function sudo span span clas
  • 2022-08-14 SSH 相关命令详解

    SSH 相关命令详解 sshssh keygenssh copy idssh agent 和 ssh addssh keyscansshd ssh ssh OpenSSH 远端登陆客户端 xff0c 默认22端口 描述 xff1a span
  • 浅谈Centos用户权限管理

    一 用户与组的概念 1 xff0e 理解linux多用户 xff0c 多任务的特性 Linux是一个真实的 完整的多用户多任务操作系统 xff0c 多用户多任务就是可以在系统上建立多个用户 xff0c 而多个用户可以在同一时间内登录同一个系
  • Linux centos升级nodejs,解决升级NodeJS遇到的问题,升级GLIBC、GLIBCXX、gcc(含资源包下载)

    公司网站用的Nuxt开发的 xff0c 本地开发环境NodeJS已经升级到16 14 2版本 xff0c 服务器也要从12版本升级到16 14 2 如需本次安装的资源 xff0c 请下滑到文章下面下载整套资源 NodeJS版本下载地址 xf
  • 关于UEFI引导的理解

    UEFI 和 Legacy区别 UEFT和Legacy是引导模式 xff0c 是用来引导系统的 按下开机键到看到windows标识 Legacy 传统BIOS模式 xff0c 启动顺序 xff1a 开机 gt BIOS初始化 gt BIOS
  • IDEA license server 地址

    旧地址 xff1a http jetbrains license server 新地址 xff1a http fls jetbrains agent com
  • 线性探测再散列

    哈希表又称散列表 哈希表存储的基本思想是 xff1a 以数据表中的每个记录的关键字 k为自变量 xff0c 通过一种函数H k 计算出函数值 把这个值解释为一块连续存储空间 xff08 即数组空间 xff09 的单元地址 xff08 即下标
  • 特征选择的几种方法

    目录 1 过滤法 xff08 Filter xff09 1 1 方差选择法 1 2 相关系数法 1 3 卡方检验 1 4 互信息法 1 5 relief算法 2 包裹法 xff08 Wrapper xff09 2 1 递归特征消除法 2 2
  • Excel调用有道词典实现批量翻译

    如图所示 xff0c 我们在B2单元格中写入公式 xff1a 61 FILTERXML WEBSERVICE 34 http fanyi youdao com translate amp i 61 34 amp A2 amp 34 amp
  • Python的使用技巧:any all的短路

    注意迭代类型和list的结果是不一样的 xff1a if name 61 61 39 main 39 a 61 1 2 3 if any print i is None for i in a print 6666666666 1 2 3 6
  • curl升级到7.87(centos7和TencentOS2.4 tk)

    centos7升级curl到7 8 7 按照之前写过的一篇文章 大致按描述操作即可 只不过需要做一点点修正 CentOS 7升级curl 乐大师的博客 CSDN博客 centos7 curl升级 更新操作中会报错安装失败 提示如下 nbsp
  • Python中raise…from用法

    本来这几天是计划阅读string模块的源码 xff0c 恰好其中一段异常处理的代码我觉得很新奇 xff0c 也就是raise from的用法 xff0c raise的用法大家都知道 因为我之前没遇到过 xff0c 所以就去网上查了相关的资料
  • AI模型隐私风险及防护技术

    一 背景 随着AI成为新一代关键技术趋势 xff0c 围绕着AI的服务也越来越普及 特别是结合了云计算以后 xff0c 机器学习数据的标注 模型训练及预测等服务纷纷上云 xff0c 为用户提供了强大的算力和优秀的算法 xff0c 极大方便了
  • 汉诺塔的图解递归算法

    一 xff0e 起源 xff1a 汉诺塔 xff08 又称河内塔 xff09 问题是源于印度一个古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 大梵天命令婆罗门把圆
  • 推荐系统中的矩阵分解总结

    最近学习矩阵分解 xff0c 但是学了好多种类 xff0c 都乱了 xff0c 看了这篇文章 xff0c 系统性的总结了矩阵分解 xff0c 感觉很棒 xff0c 故分享如下 前言 推荐系统中最为主流与经典的技术之一是协同过滤技术 xff0