推荐系统-矩阵分解

文章一

ref: https://blog.csdn.net/GZHermit/article/details/73920755

推荐任务定义:

在一个标准推荐任务中,我们有mm个用户(user),nn个物品(item),以及一个稀疏评分矩阵R(R∈Rm∗n)R(R∈Rm∗n)。RR中每个RijRij表示用户ii对于物品jj的评分。如果Rij≠0Rij≠0,那么说明用户ii有对物品jj的评分,反之则没有。每一个用户ii可以用向量sui=(Ri1,Ri2,...,Rin)siu=(Ri1,Ri2,...,Rin)表示,同样地,每一个物品jj可以用向量sij=R1j,...,Rmjsji=R1j,...,Rmj表示。对于用户和物品各自的边信息(side information)矩阵,则分别用X∈Rm∗pX∈Rm∗p和Y∈Rn∗qY∈Rn∗q表示。

设ui,vj∈Rkui,vj∈Rk,其中uiui为用户ii的隐因子向量(latent factor vector),vjvj则是物品jj的隐因子向量(latent factor vector),kk是隐空间的维度。因而,对于用户和物品来说,对应的隐因子向量形式分别是U=u1:mU=u1:m和V=v1:nV=v1:n。由于R=UVR=UV,所以如果能够求出UU和VV的话,那么我们可以求出一个非稀疏的评分矩阵RR出来。

给定一个稀疏的评分矩阵RR,以及边信息矩阵XX和YY,我们的目标是学习出UU和VV,从而预测出RR中缺失的评分。(这也叫矩阵的UV分解)


矩阵分解

矩阵分解的思想很简单,对于用户-物品这个评分矩阵RR,我们可以将其分解为用户-特性矩阵,以及特性-物品矩阵。这样做的好处有两点: 
1. 得到了用户的偏好,以及物品的特性 
2. 降低了矩阵的维度。 
举个例子,比如音乐推荐。我们比如有3个用户(u表示),4首音乐(m表示)。 

u1u2u3m1wum21m2wum12m3wum32m4m1m2m3m4u1w12umu2w21umu3w32um


可以想到,在真实的场景中,这个矩阵是极其稀疏的,对于庞大的音乐库来说,每个用户听过的曲目都是极小的一部分。并且由于用户数量和音乐数量极大,所以这个RR实际上是一个极大的矩阵。 
现在假设音乐的风格有以下几类:摇滚,重金属,民谣,说唱,轻音乐。分别用s1,s2,s3,s4,s5s1,s2,s3,s4,s5来表示。那么我们希冀得到用户对于风格偏好的矩阵QQ,以及每个风格在歌曲中所占比重的矩阵PP。 

u1u2u3s1wus11wus21wus31s2wus12wus22wus32s3wus13wus23wus33s4wus14wus24wus34s5wus15wus25wus35s1s2s3s4s5m1wsm11wsm21wsm31wsm41wsm51m2wsm12wsm22wsm32wsm42wsm52m3wsm13wsm23wsm33wsm43wsm53m4wsm14wsm24wsm34wsm44wsm54s1s2s3s4s5u1w11usw12usw13usw14usw15usu2w21usw22usw23usw24usw25usu3w31usw32usw33usw34usw35usm1m2m3m4s1w11smw12smw13smw14sms2w21smw22smw23smw24sms3w31smw32smw33smw34sms4w41smw42smw43smw44sms5w51smw52smw53smw54sm


通过这两个矩阵,我们就可以计算出uiuimimi的评分: 

wumij=∑h=15wusihwsmhj,5是音乐风格种类的数量wijum=∑h=15wihuswhjsm,5是音乐风格种类的数量


通过这种方式,我们即可补全矩阵R。

 

现在的问题是,如何求出矩阵QQ和PP呢? 
很简单的做法,我们可以通过迭代的方式,逐步使得R~=QPTR~=QPT与R之间的距离变小。设置loss函数,然后使用梯度下降法。loss函数设置如下: 

arg minQ,P=L(R,QPT)+λ(||Q||2F+||P||2F)arg minQ,P=L(R,QPT)+λ(||Q||F2+||P||F2)


其中L(⋅,⋅)L(⋅,⋅)是衡量两个矩阵之间距离的loss函数,而(||Q||2F+||P||2F)(||Q||F2+||P||F2)则是正则项,用来约束参数,避免过拟合。||⋅||F||⋅||F是F-范数。这就是最基本的矩阵分解的思想和做法,后面有更进一步,比如考虑多种因素的,引入历史信息的,引入时间信息的。可以参见这篇博客

 


F-范数:

设A=(aij)n∗n∈Cn∗nA=(aij)n∗n∈Cn∗n,令 

||A||F=(∑i=nn∑i=nn|aij|2)12||A||F=(∑i=nn∑i=nn|aij|2)12


||A||F||A||F是一种与向量的2-范数||x||2||x||2相容的方针范数,称其为方阵A的Frobenius范数,简称F-范数。看这个形式,其实跟L2范数的计算方式一模一样嘛。但是L2范数是没有限制矩阵的形状的,而F范数必须是个方阵。 
关于L2范数为什么可以起到正则化的效果,可以参见这篇博客,个人觉得讲的非常好,浅显易懂。佩服~

文章二

ref:https://www.tuicool.com/articles/RV3m6n

前言

最近一段时间隐语义模型(Latent Factor Model,LFM)在推荐系统中的应用越来越广泛,本文所介绍的矩阵分解方法也是基于这个隐语义模型。

这里需要说明的一点是,这里所说的矩阵分解并不是SVD,之前在这个问题纠结了很久,因为网上很多人还有周围的人都把矩阵分解就当成了SVD,实际上SVD也是矩阵分解的一种技术(SVD在推荐系统中的应用见 http://blog.csdn.net/wuyanyi/article/details/7964883 ,这篇才是真正的SVD推荐的方法,而其他很多网上所指的SVD就是本文所介绍的)。

基本思想

矩阵分解的思想简单来说就是每一个用户和每一个物品都会有自己的一些特性,用矩阵分解的方法可以从评分矩阵中分解出用户——特性矩阵,特性——物品矩阵,这样做的好处一是得到了用户的偏好和每件物品的特性,二是见底了矩阵的维度。图示如下:

用用户对电影来举例子就是:每个用户看电影的时候都有偏好,这些偏好可以直观理解成:恐怖,喜剧,动作,爱情等。用户——特性矩阵表示的就是用户对这些因素的喜欢程度。同样,每一部电影也可以用这些因素描述,因此特性——物品矩阵表示的就是每一部电影这些因素的含量,也就是电影的类型。这样子两个矩阵相乘就会得到用户对这个电影的喜欢程度。

形式化描述

由于评分矩阵的稀疏性(因为每一个人只会对少数的物品进行评分),因此传统的矩阵分解技术不能完成矩阵的分解,即使能分解,那样计算复杂度太高,不现实。因此通常的方法是使用已存在评分计算出出预测误差,然后使用梯度下降调整参数使得误差最小。

首先说明一些符号的含义:戴帽子的rui表示预测u对i的打分,qi表示物品i每个特性的归属度向量,pu表示用户u对每个特性的喜欢程度的向量。因此,物品的预测得分为:

下面我们就需要根据已有的数据计算误差并修正q和p使得误差最小,误差的表示方式如下:

(2)式子可以利用评分矩阵中存在的评分数据,使用随机梯度下降方法进行参数的优化,在此不做介绍。注意第二项是正则式,是为了防止过拟合,具体原理也不太清楚。

计算完阐述后们对于未知的项目就可以使用(1)式子评分。

带偏置的矩阵分解

上面的式子是最基本的矩阵分解思想,但实际情况下,却并不是很好的衡量标准,比如有的网站中的用户偏向评价高分;有一些用户偏向评价高分(有的人比较宽容);有的物品被评价的分数偏高(也许由于等口碑原因)。因此在上面的式子中一般都会加入偏置项,u,bi,bu。综合用下面的式子表示

结果预测式子变成如下:

误差预测变成如下形式

带标签和历史隐式反馈的矩阵分解

由于现实的评分矩阵特别稀疏,因此,为了使得数据更加稠密,下面加入了历史的引述反馈数据(比如用户浏览过浏览过某个电影就可以当做一定成的喜爱的正反馈),隐式反馈表现出来的偏好用下面的式子表示,其中xi表示历史数据所表现出的偏好的向量,跟前面的向量维度相同。前面的权重表示这一项的可信任程度。

同样,我们也可以使用用户的标签(比如年龄,性别,职业)推测用户对每个因素的喜爱程度,形式化如下,ya表示标签所表现出的偏好向量。

加入上面因素后的评分估计表示如下:

带有时间因素的矩阵分解

现实生活中,我们每个人的爱好可能随着时间的改变而改变,每个项目的平均评分也会改变。因此,项目的偏差(即项目高于平均分还是低于平均分)bi,用户的评分习惯(即偏向于高分还是低分)bu,以及用户的喜好矩阵pu都是时间的函数。为了更加准确的表达评分,都需要表示成为时间的函数形式,如下(这里没有考虑历史标签等数据):

小结

矩阵分解在推荐系统中现在用的很广泛,主要是由于很好的扩展性,新的因素很容易添加到模型当中。并且网上有很多开源的库实现算法。 以上的内容根据这篇论文理解而来《MATRIX FACTORIZATION TECHNIQUES FOR RECOMMENDER SYSTEMS》

原文: 矩阵分解(MATRIX FACTORIZATION)在推荐系统中的应用

猜你喜欢

转载自blog.csdn.net/u012968002/article/details/82789332