基于用户信任和商品相似度的随机游走推荐模型

标题读起来很拗口,原文是TrustWalker: A Random Walk Model for Combining Trust-based and Item-based Recommendatio,翻译得不好见谅

 

如上图所示,每个人对一些商品有过评分,用直线连接的用户之间存在信任关系,现在我们要预测U1对五角星的评分是多少。基本思路是:随机选择U1信任的一个用户,比如选择了U2,U2对五角星有评分,那就拿U2对五角星的评分作为U1对五角星的评分的估计;如果随机选择的不是U2而是U3,U3对五角星没有过评分,则继续找U3信任的用户,看看这些用户有没有对五角星作为评分。

上述只是粗略的思想介绍,下面进入详细的算法讲解。

 在进行随机游走之前先得建立用户之间的信任关系图,如果没有显式的社交关系,我们就根据人口统计学相关的知识(比如性别、年龄、种族、地区、教育经历等)计算用户之间的相似度,相似度很高的认为他们之间有信任关系。

目标:估计用户$u_0$对荐i的评分。 

每次随机游走源于用户$u_0$,在信任网络上前进了k步后到达某个用户$u$。如果u已评价过项目i,则停止此次游走,返回$r_{ui}$作为此次随机游走的结果。如果u没有评价过i,则有2个选择:

(1)以概率$\phi_{u,i,k}$停在用户u,选择u评价过的与i最相似的m个项目的评分,根据\eqref{pui}式计算$P_{ui}$作为返回结果:

\begin{equation}P_{ui}=\frac{\sum_{item\;j\;which\;similar\;to\;i}{YSim(i,j)\times{r_{uj}}}}{\sum_{item\; j \;which \;similar\; to \;i}{YSim(i,j)}}\label{pui}\end{equation}

其中$YSim(i,j)$是项目i和j的云相似度,下文会详细介绍。

(2)以概率$1-\phi_{u,i,k}$继续游走,从当前用户u信任的邻居中随机选择一个直接邻居v。

参数$\phi_{u,i,k}$不是固定不变的,它是停留在用户u的概率,这与u评价过的项目与目标项目i的相似度有关,我们可以简单地认为u评价过的项目中与项目i最相似的那个相似度越大,$\phi_{u,i,k}$就应该越大。此外在信任网络中游走得越深则噪声越大,$\phi_{u,i,k}$(即停止游走的概率)应该越大。

$\phi_{u,i,k}=\max_{j\in{RI_u}}{\frac{YSim(i,j)}{1+e^{-\frac{k}{2}}}}$

其中$RI_u$是用户u评价过的项目集合。

每次随机游走遇到以下3种情况就停止:

(1)遇到一个评价过项目i的用户u

(2)决定停止于某个用户u,将与i最相似的m个项目的聚合评分作为随机游走的结果返回。

(3)随机游走可能面临永远不会停止的情况,为避免这种情况,引入“六度人脉”的概念,设定随机游走步数k的最大值为6。

在上文中计算项目i和j的相似度时,我们没有使用传统的Pearson相似度,是因为Pearson相关系数有它的缺陷。在云模型中整体的特征用期望Ex、熵En、超熵He这3个特征来表示,$C=(Ex,En,He)$称为云向量。

$YSim(i,j)=cos(C_i,C_j)=\frac{C_i\cdot{C_j}}{\parallel{C_i}\parallel\times\parallel{C_j}\parallel}$

$U_{ij}$表示同时评价过项目i和项目j的用户。

$C_i=(Ex_i,En_i,He_i)$

$Ex_i=\frac{1}{|U_{ij}|}\sum_{u\in{U_{ij}}}{r_{ui}}$

$He_i=\sqrt{\frac{\pi}{2}}\times{\frac{1}{|U_{ij}|}}\sum_{u\in{U_{ij}}}{|r_{ui}-Ex_i|}$

$En_i=\sqrt{s^2-\frac{1}{3}He_i}$

$s^2=\frac{1}{|U_{ij}|-1}\sum_{u\in{U_{ij}}}{(r_{ui}-Ex_i)^2}$

随机游走需要执行T次,每次返回$r_t$,取它们的平均值作为最终的结果。

$\hat{r}_{u,i}=\bar{r}=\frac{1}{T}\sum_{t=1}^{T}{r_t}$

那么T取多少才算合适呢?我们定义所有随机游走得到的结果$r_t$的方差为:

$\sigma^2=\frac{1}{T}\sum_{t=1}^T{(r_t-\bar{r})^2}$

当方差稳定后,即$|\sigma_{i+1}^2-\sigma_i^2|\le{\varepsilon}$时算法终止,在实践中可以设定$\varepsilon=0.0001$

posted @ 2015-05-03 16:09  高性能golang  阅读(2935)  评论(0编辑  收藏  举报