这种方式对两两用户都利用余弦相似度计算相似度。这种方法的时间复杂度是O(|U|*|U|),这在用户数很大时非常耗时。事实上,很多用户相互之间并没有对同样的物品产生过行为,即相似度为0。这种方式将很多时间浪费在了计算这种用户之间的相似度上,换一个思路,可以首先计算出
∣
N
(
u
)
⋂
N
(
v
)
∣
≠
0
|N(u)\bigcap N(v)|\neq0
∣N(u)⋂N(v)∣=0的用户对
(
u
,
v
)
(u,v)
(u,v),然后再对这种情况除以分母
∣
N
(
u
)
∣
∣
N
(
v
)
∣
\sqrt{|N(u)||N(v)|}
∣N(u)∣∣N(v)∣。为此,可以首先建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。 以下图的用户行为为例。首先,需要建立物品—用户的倒排表,然后,建立一个4×4的用户相似度矩阵W,对于物品a,将W[A][B]和W[B][A]加1,对于物品b,将W[A][C]和W[C][A]加1,以此类推。扫描完所有物品后,我们可以得到最终的W矩阵。这里的W是余弦相似度中的分子部分,然后将W除以分母可以得到最终的用户兴趣相似度。
其中, S(u, K)包含和用户u兴趣最接近的K个用户, N(i)是对物品i有过行为的用户集合,
w
u
v
w_{uv}
wuv是用户u和用户v的兴趣相似度,
r
v
i
r_{vi}
rvi 代表用户v对物品i的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的
r
v
i
r_{vi}
rvi=1。 因此可以给倒排序图中的用户A进行推荐。选取K=3,用户A对物品c、 e没有过行为,因此可以把这两个物品推荐给用户A。根据UserCF算法,用户A对物品c、 e的兴趣是: