生成候选集
生成候选集的时候,是根据用户的历史喜好item进行的。假设用户以前喜欢的 item 为:$i_m, m=1ldots M$。 如果用户过去喜欢的 item 比较多,需要设定一个 liked_topN 值,表示最多就取这么多item,也即$M le liked\_topN$,当然这些item是依据喜好分值排序过的。除了设定 liked_topN 值之外,还可以使用相似度分值来筛选item喜好集(liked set),设定一个喜好阈值,只有喜好分值超过这个阈值,才加入到喜好集中,用于生成候选集。
拿到这些item之后,然后根据相似度为每一个item都生成N篇最相似的文章,然后将所有的item生成的文章组合起来,就是候选集。设候选集的大小为S,则$Slt M*N$。小于的原因是因为候选集中有可能产生用户已经看过的item,需要将这些过滤掉,剩下item自然是小于$M*N$了。
处理候选集
假设某个用户喜欢的item依次为:$i_1,i_2,i_3$。由这三个item可以生成候选集,生成规则为:
事先可以算出所有item两两之间的相似度矩阵,在该矩阵中找出与$i_1$最相似的3个(该值可以设置,用$N$表示)item,记为:$i_{11}, i_{12}, i_{13}$,同理,可以找到与$i_2, i_3$最相似的item,记为:$i_{21}, i_{22}, i_{23}$,$i_{31}, i_{32}, i_{33}$。
然后要在这些候选集中为该用户生成最终的推荐item。该如何做呢?
这个时候,要计算该用户对候选集中的每一个item的喜好分值,最后对这些分值作排序,生成推荐结果。
用$u$表示该用户。则用户对某个item的喜好分值用$P(u,item)$来表示。设$i_{m}$表示该用户喜欢的第m个item,设$i_{mn}$表示由该用户喜欢的第m个item生成的候选集中第n个item,则该用户对候选集中的item的喜好分值可表示为:
$$P(u,i_{mn})=frac{sum_{m=1}^{M}P(u,i_m)SIM(i_m,i_{mn})}{sum_{m=1}^{M}SIM(i_m,i_{mn})}$$
其中,$M$表示该用户喜欢的 item 个数。
这样做了之后,可以权衡相似度和历史喜欢的item之间的分量。下例解释了这样做的好处:
设用户历史偏好中$i_1$是最喜欢的,但是由其生成的$i_{1n},n=1ldots N$与$i_1$的相似度却比较低,而$i_2$在历史偏好中排名第二,但是由其生成的$i_{2n},n=1ldots N$与$i_2$的相似度却比较高,此时最终的结果中用户对$i_{2n},n=1ldots N$的喜欢度比$i_{1n},n=1ldots N$可能更高是合理的。
所以在候选集中权衡相似度与偏好值可以生成更加准确的推荐结果。