UserBasedCF.py

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值