概述
考虑用户之间的相似度或者考虑物品之间的相似度。比如要为一个用户做出推荐,可以先找到与当前用户相似的用户,然后在里面找到当前用户没有购买过的物品推荐过去。同时考虑物品之间的相似度的话,就是针对需要推荐的用户购买过的物品,找到相似的物品进行推荐,比如你现在买了一本机器学习,就可以推荐你机器学习相关的书籍或者是课程等。
基于用户的协同过滤
- 计算用户之间相似度进行相关物品的推荐
- 步骤:
- 找到和目标用户兴趣相似的用户集合
- 找到这个集合中用户喜欢的,且目标用户没有听过的物品推荐给目标用户
- 其中找寻用户的相似用户集合是计算的关键。可以采用Jaccard公式或者余弦相似度进行计算。
- 例如:对用户u,v,令N(u)表示用户u喜欢的物品集合,N(v)表示用户v喜欢的物品集合。则可以计算u,v的相似度。 \(Jaccard: w_{u v}=\frac{|N(u) \cap N(v)|}{|N(u) \bigcup N(v)|} \\ 余弦相似度: w_{u v}=\frac{|N(u) \cap N(v)|}{\sqrt{|N(u)||N(v)|}}\)
- 如果直接计算的话,在用户数量大的时候计算耗时,因为要计算两两用户之间的相似度。但是实际上,很多有用户之间并没有对相同的物品产生行为,也就是很多的\(N(u) \cap N(v)=0\),浪费的大部分时间都在这里,所以可以考虑先过来出来有交集的用户然后在计算。
- 以空间换时间的方法,首先建立物品用户倒排表。然后筛选出有对同种物品有行为的用户对来计算相似性。
- 通过公式\(p(u, i)=\sum_{v \in S(u, K) \cap N(i)} w_{u v} r_{v i}\)计算用户u对物品的感兴趣程度。其中\(S(u,k)\)包含和用户u兴趣最接近的k个用户,\(N(i)\)表示对物品i有操作的用户的集合,\(r_{vi}\)表示用户v对物品i的兴趣度。
- 相似度改进:如果两个用户同时购买了热门的产品并不能说明这两个用户相似。相反如果两个用户都购买了两个不常见的物品,则说明两个用户大概率有共同兴趣。 \(w_{u v}=\frac{\sum_{i \in N(u) \cap N(v)} \frac{1}{\log (1+|N(i))|}}{\sqrt{|N(u)||N(v)|}} \\\) 其中\(\frac{1}{\log 1+|N(i)|}\)表示惩罚用户共同兴趣列表中热门产品对结果的影响,N(i)是对物品i有过行为的用户集合,越热门,N(i)越大
- 缺点:随着用户数目增多,计算用户的兴趣相似度越来越困难,时间复杂度和空间复杂度的增长与用户增长近似平方关系。同时基于用户的推荐解释性不强。
基于物品的推荐系统
- 计算物品之间的相似度,推荐与用户喜欢物品相似的物品
- 假设,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都喜欢物品B。
- 可以通过用户的历史行为信息对推荐结果进行解释
- 步骤:
- 计算物品之间相似度
- 根据物品相似度和用户的历史行为给出推荐列表
- 物品相似度的计算 \(w_{ij} = \frac{|N(i) \cap N(j)|}{|N(i)|} \\\) N(i)表示喜欢物品i的用户,最后的结果表示喜欢物品i的用户有多少比例用户喜欢物品j
- 但是当物品j是热门产品时,则结果会接近于1.这导致不能很好的挖掘长尾信息。下面的公式对热门产品进行惩罚,一定程度上缓解问题。 \(w_{i j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|} |}\) 相当于在分母加上喜欢商品的用户数,削弱热门商品对结果的影响。
- 为了解决用户活跃度对物品相似度的影响: \(w_{i j}=\frac{\sum_{u \in N(i) \cap N(j)} \frac{1}{\log (1+|N(u)|)}}{\sqrt{|N(i)||N(j)|}}\) 比如:某个用户是开书店的,当当网上一大半的的书籍都被买过,这就相当于内存中诞生了一个很大的稠密矩阵,但是其对每个书籍的影响应该很小,比如另一个文艺青年买了十几本书,哪其对这十几本书的影响应该很大。
比较
- 性能:userCf适用用户少,ItemCf适用物品数少于用户数
- 领域:时效性强,个性化兴趣不明显。长尾物品丰富,用户个性化需求强烈的领域
- 实时性:用户有新行为,不一定造成推荐结果的立即变化。一定会导致推荐结果的变化
- 领启动:不能立即计算,因为用户相似度表隔断时间更新。用户只要对一个物品产生行为,就可以给出推荐
- 推荐理由:不能提供很好的推荐解释。利用用户历史行为给用户做推荐解释。
协同过滤的一些问题
数据稀疏: 可扩展性: 同义信息: 孤岛用户: 异常攻击: 隐私问题: 噪声问题: 可解释性