协同过滤
协同过滤(Collaborative Filtering),简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要
- 基于memory
- 基于用户协同过滤(User CF)
向用户推荐与其相似的用户喜好的物品,并过滤已经推荐过的。
-
基于item协同过滤(item CF)
用户喜欢的东西,然后从剩下的物品中找到和他历史兴趣近似的物品推荐给他,核心是要通过两个物品被同时喜欢的用户数等决定。
-
基于内容(画像)协同过滤(content CF)
给用户推荐和他们之前喜欢的物品在内容上相似的其他物品。核心任务就是计算物品的内容相似度。
- 基于model
-
ALS协同过滤
利用矩阵分解和交替最小二乘法,预测用户对未浏览物品的喜好程度。
user CF
相似度计算:
假设对于用户u和用户v,N(u)和N(v)分别是他们曾经有过正反馈的物品的集合,那么可以通过Jaccard公式来计算u和v的相似度:
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)|}}
用户u对物品i的感兴趣程度:
p(u, i)=\sum_{v \in S(u, k) \cap N(i)} w_{u v} r_{v i}
其中,s(u,k)包含与用户u兴趣最相近的k的用户列表,N(i)是对物品i有过行为的用户列表,Wuv是用户u与用户v的兴趣相似度,rvi代表用户v对物品i的喜欢程度(由于这里使用的是单一行为的隐反馈数据,因此所有rvi的=1)。
tips:
UserCF算法在业界使用的很少,更多的是使用基于物品的协同过滤算法(ItemCF)。
- 随着用户数量的增长,计算所有用户两两之间的兴趣相似度的时间复杂度将越来越大,且与用户数量的平方呈正比关系。
- UserCF算法很难对推荐的结果做出令人信服的解释。
- 在社交网络站点中,User CF 是一个不错的选择,User CF 加上社会网络信息,可以增加用户对推荐解释的信服程度。
- 针对新闻类的应用,时效性较高,物品变化很快,而用户有相对稳定的场景。此时往往会选择基于用户的协同过滤算法。最后要如何挑选,取决于网站里哪个相似度更稳定。
item CF
物品相似度的一种计算方式:
w_{i j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|}}
其中,|N(i)|是喜欢物品i的用户数,|N(j)|是喜欢物品j的用户数,|N(i)∩N(j)|是同时喜欢物品i和物品j的用户数。当物品ab完全一致(是同一个物品)时,那么N(a)和N(b)应该完全相等,那么wij就为1。即w越接近1,ab越相似。w为0时,说明从用户物品交互角度来看,ab不相似。也可以采用其他计算方式(欧式、杰卡德、皮尔逊、余弦)。
p_{u j}=\sum_{i} w_{j i} r_{u i}
其中pui表示用户u对物品j的兴趣(可能的打分),rui则表示用户u对物品i已有的打分(explicit feedback中为打分,比如0-5分,implicit feedback中为有交互1,无交互0)。i可取自全集,也可挑选和j比较相似的几个物品(设立相似度阈值进行判断)。
tips:
- ItemCF协同过滤越是热门的类,其类内物品的相似度越大。除此之外,不同领域的最热门物品之间的相似度往往也是很高的。
- 对于电子商务,用户数量一般大大超过商品数量,而且物品的变更频率不高,物品的相似度相对于用户的兴趣来讲比较稳定,此时Item CF的计算复杂度较低。基于物品的协同过滤算法,是目前电子商务采用最广泛的推荐算法。
ALS协同过滤
ALS协同过滤步骤:
- 构建物品与item的评分矩阵: y= [u, I ], y 表示 真实矩阵
- 建⽴两个随机的参数矩阵X * Y = [u, k]x [k, I] ~ y’ ,y’= [u, i] 表示 预测矩阵
- y’与y计算损失,为每个用户对每个物品的评分Loss
- 梯度下降优化,两个随机的参数矩阵 [u, k]x [k, I] 内的值为权重(可训练超参数)
- y模型预测结果
Api
pyspark.ml.recomendation.ALS(userCol=用户索引列 , itemCol=物品索引列 , ratingCol=评分列 )
-
pyspark.ml.feature.stringindexer一般选择先将用户id和itemid映射成索引
-
model.fit(评分表Dataframe)
- model.recomendForAllUsers(对单个用户的推荐文章数量) 返回表格中recommendation字段包含【[物品索引,预测评分], 。。。】;实际应用可以将recommendation字段explode展开,去掉评分,反映射回物品id,构建ALS召回hive表,最后foreachpartition落地存储在hbase召回池中