参考:http://blog.csdn.net/wangjian1204/article/details/50465109
一、概述:
矩阵分解模型是把用户偏好和item属性投影到同一个隐因子空间(latent factor space),以用户偏好和item属性的匹配程度来预测评分。通常推荐系统可以用于模型训练的信息主要有用户的显式反馈、隐式反馈和时间信息等。显式反馈(explicit feedback):用户直接表明对item的兴趣,例如评分[1,2,3,4,5]. 隐式反馈(implicit feedback):通过观察用户行为得到的信息,例如浏览历史、搜索记录等。
二、符号定义和度量标准:
- U:用户集合;I:item集合;
- R:评分集合, rui 表示用户 u∈U 对item i∈I 的评分; 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
的偏置部分定义为:
其中
μ
是评分集合R中所有评分的均值,
bu
是用户u的偏置,
bi
是item i上的偏置。可以通过梯度下降算法最优化下面这个式子来求解
bu,bi
:
正则化项 λ(∑ub2u+∑ib2i) 可以避免过拟合。关于梯度下降算法的详细介绍可以参考我的另一篇博文: 深入了解梯度下降算法
另外还有一种简单的偏置项计算方法,如下所示:
式子中的 β1,β2 是平滑因子。这种方法直接通过解析式计算 偏差均值 ,计算简单,但是结果准确度较差。
四、SVD矩阵分解:
在推荐系统矩阵分解的发展历程中,有研究员提出先对评分矩阵进行补全,从而可以对一个dense矩阵进行分解。但是这样做有两个缺点:一是补全数据和dense 矩阵分解大大增加了计算量;二是不精确的评分补全会导致结果有较大的偏差。所以目前的研究工作都建议使用原始的稀疏评分矩阵,并且使用正则化项来避免过拟合。
假设用户u投影到f维隐空间后的向量表示为
pu∈Rf
,item i的隐空间表示为
qi∈Rf
。隐空间的每一维都表示一个偏好因子,则用户u和item i的匹配程度可以用他们的内积
q⊤ipu
来衡量。计算预测评分:
模型参数
bi,bu,qi,pu
通过最优化下面这个目标函数获得:
可以用梯度下降方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定 pu 优化 qi ,然后固定 qi 优化 pu ,交替更新。梯度下降方法中参数的更新式子如下(为了简便,把目标函数中的 μ+bi+bu+q⊤ipu 整体替换为 r̂ ui ):
- bu←bu+α(rui−r̂ ui−λbu)
- bi←bi+α(rui−r̂ ui−λbi)
- qi←qi+α((rui−r̂ ui)pu−λqi)
- pu←pu+α((rui−r̂ ui)qi−λpu)
其中 α 是更新步长。
五、SVD++:
用户的隐式反馈可以提供额外的偏好信息,能在一定程度上提高预测准确性。例如SVD++把用户是否对item打分作为一种隐式反馈。
对于用户u打分的item,增加一个隐偏好属性 yj∈Rf ,表示用户u对打分item的某种偏好。正则化项 |Iu|−12 用于消除用户评分个数的影响。
模型参数
bi,bu,qi,pu,yj
通过最优化下面这个目标函数获得:
与SVD类似,可以通过梯度下降方法求解参数。
如果要加入多种隐式反馈信息,如收藏、租借等,则在用户偏好属性中加入多个隐式反馈项即可:
六、加入时间信息:
时间信息在推荐中有很重要的地位。一个用户对某个item的评价可能在一年后会发生很大的变化。时间信息可以告诉我们用户在某个时间点对item的喜好程度以及随着时间推移用户偏好的改变。
在SVD模型中,容易随时间发生变化的参数有: bu 如用户打分的严格程度发生改变; bi 如item的流行度发生改变; pu 用户的喜好发生改变。由于item的属性往往是固定不变的,所以可以认为 qi 是恒定的。下面介绍 bu,bi,pu 各项常用的时间函数表示。
bi项:
bi 是一个常数项偏置, bi,Bin(t) 是一个分段函数, Bin(t) 是t所在的分段编号。 例如从2000年到2016年,每一年分为一段,则总共有16段,如果t是2015年的某一天,则 Bin(t)=16 。
和 b1i(t) 相比, b2i(t) 增加了一个周期项 bi,period(t) 用来处理周期性的偏差, 如羽绒服在不同季节评价的偏差 。
bu项:
首先构建用户评分偏置的线性渐变模型(例如用户u的平均评分可能越来越高):定义用户u评分的平均时间为
tu
,那么在
t
时刻:
参数 β 通过交叉验证获得。
式 b1u(t) 每个用户包含两个参数 bu,αu 。
式 b2u(t) 设置 ku 个时间点 tu1,...,tuku ,参数 δ 通过交叉验证学习得到, butl 从评分数据中学习。
b3u(t) 和 b1u(t) 相比,增加了一项 bu,t ,用于处理每一天有可能产生的突变。 例如用户u在某一天对item 的评分都很高,可能是因为他那天心情很好 。
同样的, b4u(t) 在 b2u(t) 的基础上增加了 bu,t 。另外,以上这四种方法都可以添加周期项 bu,period(t) 来处理用户的周期性偏差。
pu项:
随着时间的改变,用户的喜好也在发生变化,所以把用户的偏好
pu
作为一个时间函数会比较合适。
pu
的时间函数和用户的偏置项
bu
类似,例如:
有了前面三项的时间函数,timeSVD++的预测函数如下:
最后有个问题,预测函数中如何设定未来某一天的参数,如 bu,t , pu,t ?事实上,在训练模型中加入局部时间项主要是为了获得更好的稳定项(如 bu , αu⋅devu(t) ),所以在预测过程中可以忽略局部时间项(同时这个也无法计算得到),用稳定项来预测评分。
七、参考资料
Recommender Systems Handbook