基于领域的协同过滤主要有两种:UserCF、ItemCF
基于用户的协同过滤(UserCF)
利用用户的相似度来计算用户的相似度
step1:找到和目标用户兴趣相似的用户集合,用Jaccard相似度、余弦相似度等相似度计算方法;
step2:用户u对物品i的相似度,等价于K个邻居对物品i的兴趣度;
step3:把和用户兴趣相同的k个邻居喜欢的物品进行汇总,去掉用户u已经喜欢过的物品,剩下的按照从大到小进行推荐。
基于物品的协同过滤(ItemCF)
利用用户行为相似度计算物品的相似度:
step1:计算物品之间相似度;
step2:用户u对物品i的兴趣度,等价于物品i的K个邻居物品,受到用户u的兴趣度;
step3:和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名
预测用户u对物品的兴趣度,去掉用户u已经喜欢过的物品,剩下按照从大到小进行推荐.
surprise工具:
surprise工具:https://surprise.readthedocs.io/en/stable/getting_started.html
基于邻域的协同过滤算法:knns.KNNBasic;knns.KNNWithMeans;
knns.KNNWithZScore;knns.KNNBaseline;
主要参数:
k:设置领域的个数;
user_based:是否为基于用户的协同过滤,True则为UserCF,False为ItemCF;
name:相似度计算方式,默认为MSD,也可设置为cosine,pearson,pearson_baseline
movielen数据集进行推荐
代码如下:
from surprise import Reader,Dataset
from surprise import KNNBasic,KNNWithMeans,KNNWithZScore,KNNBaseline
#数据读取
reader = Reader(line_format='user item rating timestamp' , sep = ',',skip_lines=1)
data = Dataset.load_from_file('ratings_sample.csv',reader = reader)
trainset = data.build_full_trainset()
#KNNBasic
algo1 = KNNBasic(k =30,sim_options={'name':'MSD','user_based':True},verbose=True)
algo1.fit(trainset)
uid = str(196)
iid = str(302)
pred1 = algo1.predict(uid, iid,verbose=True)
#KNNWithMeans
algo2 = KNNWithMeans(k = 30,sim_options={'name':'cosine','user_based':False},verbose = True)
algo2.fit(trainset)
pred2 = algo2.predict(uid, iid,verbose=True)
#KNNWithZScore f
algo3 = KNNWithZScore(k =30,sim_options={'name':'MSD','user_based':True},verbose=True)
algo3.fit(trainset)
pred3 = algo3.predict(uid, iid,verbose=True)
#KNNBaseline
algo4 = KNNBaseline(k =30,sim_options={'name':'MSD','user_based':True},verbose=True)
algo4.fit(trainset)
pred4 = algo4.predict(uid, iid,verbose=True)
结果如下:
Computing the msd similarity matrix...
Done computing similarity matrix.
user: 196 item: 302 r_ui = None est = 3.51 {'was_impossible': True, 'reason': 'Not enough neighbors.'}
Computing the cosine similarity matrix...
Done computing similarity matrix.
user: 196 item: 302 r_ui = None est = 3.75 {'actual_k': 0, 'was_impossible': False}
Computing the msd similarity matrix...
Done computing similarity matrix.
user: 196 item: 302 r_ui = None est = 4.80 {'actual_k': 0, 'was_impossible': False}
Estimating biases using als...
Computing the msd similarity matrix...
Done computing similarity matrix.
user: 196 item: 302 r_ui = None est = 3.92 {'actual_k': 0, 'was_impossible': False}
代码及数据集:https://github.com/HuangxinYu359/project/tree/master/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9FsurpriseKNN