步骤
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
步骤 (1) 的关键就是计算两个用户的兴趣相似度。这里,协同过滤算法主要利用行为的相似度计算兴趣的相似度。
给定用户 u 和用户 v ,令 N(u) 表示用户 u 曾经有过正反馈的物品集合,令 N(v)为用户 v 曾经有过正反馈的物品集合。那么,我们可以通过如下的 Jaccard 公式简单地计算 u 和 v 的
兴趣相似度:
或者通过余弦相似度计算:
以余弦相似度为例,实现该相似度可以利用如下的伪码:
、这种方法的时间复杂度是O(|U|*|U|),这在用户数很大时非常耗时。事实上,很多用户相互之间并没有对同样的物品产生过行为,即很多时
候|N(u)∩N(v)|=0。上面的算法将很多时间浪费在了计算这种用户之间的相似度上。如果换一个思路,我们可以首先计算出|N(u)∩N(v)|≠0的用户对(u,v),然后再对这种情况除以分母
首先建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。令稀疏矩阵C[u][v]= |N(u)∩N(v)|。那么,假设用户u和用户v同时属于倒排表中K个物品对应的用户列表,就有C[u][v]=K。从而,可以扫描倒排表中每个物品对应的用户列表,将用户列表中的两两用户对应的C[u][v]加1,最终就可以得到所有用户之间不为0的C[u][v]。下面的代码实现了上面提到的算法:
首先,需要建立物品 — 用户的倒排表(如图所示)。然后,建立一个4×4的用户相似度矩阵W,对于物品a,将W[A][B]和W[B][A]加1,对于物品b,将W[A][C]和W[C][A]加1,以此类推。扫描完所有物品后,我们可以得到最终的W矩阵。这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。
如下的公式度量了 UserCF 算法中用户 u 对物品 i 的感兴趣程度:
其中, S(u, K) 包含和用户 u 兴趣最接近的 K 个用户, N(i) 是对物品 i 有过行为的用户集合, Wuv是用户 u 和用户 v 的兴趣相似度, Rvi 代表用户 v 对物品 i 的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的 Rvi =1 。
P64不理解!!!
用户相似度的改进
两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。
该公式通过1/(log1+ |N(i)|) 惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。
网友评论