2018-09-24——基于用户的协同过滤算法

步骤

(1) 找到和目标用户兴趣相似的用户集合。

(2)  找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

步骤 (1) 的关键就是计算两个用户的兴趣相似度。这里,协同过滤算法主要利用行为的相似度计算兴趣的相似度。

给定用户 u 和用户 v ,令 N(u) 表示用户 u 曾经有过正反馈的物品集合,令 N(v)为用户 v 曾经有过正反馈的物品集合。那么,我们可以通过如下的 Jaccard 公式简单地计算 u 和 v 的

兴趣相似度:

2018-09-24——基于用户的协同过滤算法_第1张图片

或者通过余弦相似度计算:

2018-09-24——基于用户的协同过滤算法_第2张图片

以余弦相似度为例,实现该相似度可以利用如下的伪码:

2018-09-24——基于用户的协同过滤算法_第3张图片

这种方法的时间复杂度是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]。下面的代码实现了上面提到的算法:

2018-09-24——基于用户的协同过滤算法_第4张图片

首先,需要建立物品 — 用户的倒排表(如图所示)。然后,建立一个4×4的用户相似度矩阵W,对于物品a,将W[A][B]和W[B][A]加1,对于物品b,将W[A][C]和W[C][A]加1,以此类推。扫描完所有物品后,我们可以得到最终的W矩阵。这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。

2018-09-24——基于用户的协同过滤算法_第5张图片

如下的公式度量了 UserCF 算法中用户 u 对物品 i 的感兴趣程度:

其中, S(u, K) 包含和用户 u 兴趣最接近的 K 个用户, N(i) 是对物品 i 有过行为的用户集合, Wuv是用户 u 和用户 v 的兴趣相似度, Rvi 代表用户 v 对物品 i 的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的 Rvi =1 。

P64不理解!!!



用户相似度的改进

两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。

2018-09-24——基于用户的协同过滤算法_第6张图片

该公式通过1/(log1+ |N(i)|) 惩罚了用户 u 和用户 v 共同兴趣列表中热门物品对他们相似度的影响。

你可能感兴趣的:(2018-09-24——基于用户的协同过滤算法)