推荐系统笔记二、矩阵分解协同过滤

一、概述:

矩阵分解模型是把用户偏好和item属性投影到同一个隐因子空间(latent factor space),以用户偏好和item属性的匹配程度来预测评分。通常推荐系统可以用于模型训练的信息主要有用户的显式反馈、隐式反馈和时间信息等。显式反馈(explicit feedback):用户直接表明对item的兴趣,例如评分[1,2,3,4,5]. 隐式反馈(implicit feedback):通过观察用户行为得到的信息,例如浏览历史、搜索记录等。

二、符号定义和度量标准:

  • U:用户集合;I:item集合;
  • R:评分集合, rui 表示用户 uU 对item iI 的评分; r^ui 表示预测评分;
  • K:(u,i)集合,且评分 rui 已知;
  • tui :用户u对item i评分的时间;
  • Ui :已经给item i打分的用户集合; Iu :已经被用户u打分的item集合;

        评价推荐系统时最重要的两个问题是评分准确率和Top-N推荐问题。评分准确率问题常用的度量标准有Root Mean Squared Error (RMSE),Precision,Recall等。Top-N推荐常用的度量标准有NDCG,Average Reciprocal Hit-Rank(ARHR)等。

三、偏置项:

        矩阵分解模型是把用户偏好和item属性投影到同一个隐因子空间(latent factor space),以用户偏好和item属性的匹配程度来预测评分。但是,仅仅这样是不够的,例如A和B两个用户的偏好类似,但是A比较容易满足,倾向于给item打高分;而B倾向于给item打低分(Item上也有类似的情况)。为了解决这个问题,需要为每个用户和item增加一个偏置项。评分 rui 的偏置部分定义为:

bui=μ+bu+bi

其中 μ 是评分集合R中所有评分的均值, bu 是用户u的偏置, bi 是item i上的偏置。可以通过梯度下降算法最优化下面这个式子来求解 bu,bi

minb(u,i)K(ruiμbubi)2+λ(ub2u+ib2i)

正则化项 λ(ub2u+ib2i) 可以避免过拟合。关于梯度下降算法的详细介绍可以参考我的另一篇博文: 深入了解梯度下降算法

        另外还有一种简单的偏置项计算方法,如下所示:

bi=uUi(ruiμ)β1+|Ui|bu=iIu(ruiμbi)β2+|Iu|

式子中的 β1,β2 是平滑因子。这种方法直接通过解析式计算 偏差均值,计算简单,但是结果准确度较差。

四、SVD矩阵分解:

在推荐系统矩阵分解的发展历程中,有研究员提出先对评分矩阵进行补全,从而可以对一个dense矩阵进行分解。但是这样做有两个缺点:一是补全数据和dense 矩阵分解大大增加了计算量;二是不精确的评分补全会导致结果有较大的偏差。所以目前的研究工作都建议使用原始的稀疏评分矩阵,并且使用正则化项来避免过拟合。

        假设用户u投影到f维隐空间后的向量表示为 puRf ,item i的隐空间表示为 qiRf 。隐空间的每一维都表示一个偏好因子,则用户u和item i的匹配程度可以用他们的内积 qipu 来衡量。计算预测评分:

r^ui=μ+bi+bu+qipu

模型参数 bi,bu,qi,pu 通过最优化下面这个目标函数获得:

minbi,bu,qi,pu(u,i)K(ruiμbubiqipu)2+λ{u(b2u+pu2)+i(b2i+qi2)}

        可以用梯度下降方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定 pu 优化 qi ,然后固定 qi 优化 pu ,交替更新。梯度下降方法中参数的更新式子如下(为了简便,把目标函数中的 μ+bi+bu+qipu 整体替换为 r^ui ):

  • bubu+α(ruir^uiλbu)
  • bibi+α(ruir^uiλbi)
  • qiqi+α((ruir^ui)puλqi)
  • pupu+α((ruir^ui)qiλpu)

其中 α 是更新步长。

五、SVD++:

        用户的隐式反馈可以提供额外的偏好信息,能在一定程度上提高预测准确性。例如SVD++把用户是否对item打分作为一种隐式反馈。

r^ui=μ+bi+bu+qi(pu+|Iu|12jIuyj)

对于用户u打分的item,增加一个隐偏好属性 yjRf ,表示用户u对打分item的某种偏好。正则化项 |Iu|12 用于消除用户评分个数的影响。

        模型参数 bi,bu,qi,pu,yj 通过最优化下面这个目标函数获得:

minbi,bu,qi,pu(u,i)K(ruiμbubiqi(pu+|Iu|12jIuyj))2+λ{u(b2u+pu2)+i(b2i+qi2+yi2)}

与SVD类似,可以通过梯度下降方法求解参数。

        如果要加入多种隐式反馈信息,如收藏、租借等,则在用户偏好属性中加入多个隐式反馈项即可:

r^ui=μ+bi+bu+qi(pu+|I1u|12jI1uy1j+|I2u|12jI2uy2j+)

六、加入时间信息:

时间信息在推荐中有很重要的地位。一个用户对某个item的评价可能在一年后会发生很大的变化。时间信息可以告诉我们用户在某个时间点对item的喜好程度以及随着时间推移用户偏好的改变。

        在SVD模型中,容易随时间发生变化的参数有: bu 如用户打分的严格程度发生改变; bi 如item的流行度发生改变; pu 用户的喜好发生改变。由于item的属性往往是固定不变的,所以可以认为 qi 是恒定的。下面介绍 bu,bi,pu 各项常用的时间函数表示。

bi项:

b1i(t)=bi+bi,Bin(t)

bi 是一个常数项偏置, bi,Bin(t) 是一个分段函数, Bin(t) 是t所在的分段编号。 例如从2000年到2016年,每一年分为一段,则总共有16段,如果t是2015年的某一天,则 Bin(t)=16

b2i(t)=bi+bi,Bin(t)+bi,period(t)

b1i(t) 相比, b2i(t) 增加了一个周期项 bi,period(t) 用来处理周期性的偏差, 如羽绒服在不同季节评价的偏差

bu项:

        首先构建用户评分偏置的线性渐变模型(例如用户u的平均评分可能越来越高):定义用户u评分的平均时间为 tu ,那么在 t 时刻:

devu(t)=sign(ttu)|ttu|β

参数 β 通过交叉验证获得。

b1u(t)=bu+αudevu(t)

b1u(t) 每个用户包含两个参数 bu,αu

b2u(t)=bu+kul=1eδ|ttul|butlkul=1eδ|ttul|

b2u(t) 设置 ku 个时间点 tu1,...,tuku ,参数 δ 通过交叉验证学习得到, butl 从评分数据中学习。

b3u(t)=bu+αudevu(t)+bu,t

b3u(t) b1u(t) 相比,增加了一项 bu,t ,用于处理每一天有可能产生的突变。 例如用户u在某一天对item 的评分都很高,可能是因为他那天心情很好

b4u(t)=bu+kul=1eδ|ttul|butlkul=1eδ|ttul|+bu,t

同样的, b4u(t) b2u(t) 的基础上增加了 bu,t 。另外,以上这四种方法都可以添加周期项 bu,period(t) 来处理用户的周期性偏差。

pu项:

        随着时间的改变,用户的喜好也在发生变化,所以把用户的偏好 pu 作为一个时间函数会比较合适。 pu 的时间函数和用户的偏置项 bu 类似,例如:

pu(t)=pu+αudevu(t)+pu,t

有了前面三项的时间函数,timeSVD++的预测函数如下:

r^ui=μ+bi(tui)+bu(tui)+qi{pu(tui)+|Iu|12jIuyj}

        最后有个问题,预测函数中如何设定未来某一天的参数,如 bu,t pu,t ?事实上,在训练模型中加入局部时间项主要是为了获得更好的稳定项(如 bu αudevu(t) ),所以在预测过程中可以忽略局部时间项(同时这个也无法计算得到),用稳定项来预测评分。

七、参考资料

Recommender Systems Handbook

你可能感兴趣的:(推荐系统,协同过滤,矩阵分解,时间信息)