UserBasedCF.py
这个python文件是使用跑出基于用户协同过滤的模型并预测推荐电影。
如下是这个python文件使用的第三方库
from MovieLens import MovieLens
from surprise import KNNBasic
from collections import defaultdict
from operator import itemgetter
from time import time
#创建一个MovieLens类
ml = MovieLens()
#导入数据
data = ml.loadMovieLensDataset()
#建立完整的训练集,用KNN算法计算相似度
trainSet = data.build_full_trainset()
#定义相似度量估计等级,这里使用余弦相似度。
#相似性将在用户之间或项目之间进行计算。因为我们需要根据用户计算相似性,所以, 'user_based':True
sim_options = {'name':'cosine',
'user_based':True}
t0=time()
#使用与KNN类似的模型
model = KNNBasic(sim_options=sim_options)
#通过算法训练trainSet
model.fit(trainSet)
#生成相似度矩阵
similarityMatrix = model.compute_similarities()
testUser = '0'
#得到与测试用户类似的前n个用户
user_inner_id = trainSet.to_inner_uid(testUser)
similarityRow = similarityMatrix[user_inner_id]
similarUsers = []
for innerID, score in enumerate(similarityRow):
if (innerID!=user_inner_id):
similarUsers.append((innerID,score))
k=40
#通过相似度进行排序
kNeighbors = sorted(similarUsers, key=lambda x: x[1], reverse=True)[:k]
#获取他们评分的项目,并为每个相似度按用户相似度加权的项目添加评分
candidates = defaultdict(float)
for similarUser in kNeighbors:
innerID = similarUser[0]
userSimilarityScore = similarUser[1]
userRatings = trainSet.ur[innerID]
for rating in userRatings:
#rating[0]是用户的ID
candidates[rating[0]] += userSimilarityScore*(rating[1]/5.0)
#建立测试用户已经看过的电影的字典。 那意味着在训练集中可获得测试用户评级的电影
watched={}
for itemID, _ in trainSet.ur[user_inner_id]:
watched[itemID] = 1
#从相似用户那里得到评分前十的电影,这就是基于用户的协同过滤
count = 0
number = 1
print('Recommended Movies using User Based Collaborative Filtering:')
for itemID, _ in sorted(candidates.items(),key=itemgetter(1),reverse=True):
if not itemID in watched:
movieID = trainSet.to_raw_iid(itemID)
print(number,'-',ml.getMovieName(int(movieID)))
number += 1
count += 1
if (count >= 15):
break
#打印训练的时间
tt=time()-t0
print("User based CF Model trained in %s seconds" % round(tt,3))