基于用户的协同过滤算法-----------电影评分与推荐

实验描述:
假设已有大量用户对若干电影的评分数据,现有某用户,也看过一些电影并进行过评分,要求根据已有打分数据为该用户进行推荐。
基本思路:用基于用户的协同过滤算法,也就是根据用户喜好来确定与当前用户最相似的用户,然后再根据最相似用户的喜好为当前用户进行推荐。

  1. 新建一个字典,存储影评者对若干部电影的打分,分值为1-5。
    critics={‘Lisa Rose’: {‘Lady in the Water’: 2.5, ‘Snakes on a Plane’: 3.5,
    ‘Just My Luck’: 3.0, ‘Superman Returns’: 3.5, ‘You, Me and Dupree’: 2.5,
    ‘The Night Listener’: 3.0},
    ‘Gene Seymour’: {‘Lady in the Water’: 3.0, ‘Snakes on a Plane’: 3.5,
    ‘Just My Luck’: 1.5, ‘Superman Returns’: 5.0, ‘The Night Listener’: 3.0,
    ‘You, Me and Dupree’: 3.5},
    ‘Michael Phillips’: {‘Lady in the Water’: 2.5, ‘Snakes on a Plane’: 3.0,
    ‘Superman Returns’: 3.5, ‘The Night Listener’: 4.0},
    ‘Claudia Puig’: {‘Snakes on a Plane’: 3.5, ‘Just My Luck’: 3.0,
    ‘The Night Listener’: 4.5, ‘Superman Returns’: 4.0,
    ‘You, Me and Dupree’: 2.5},
    ‘Mick LaSalle’: {‘Lady in the Water’: 3.0, ‘Snakes on a Plane’: 4.0,
    ‘Just My Luck’: 2.0, ‘Superman Returns’: 3.0, ‘The Night Listener’: 3.0,
    ‘You, Me and Dupree’: 2.0},
    ‘Jack Matthews’: {‘Lady in the Water’: 3.0, ‘Snakes on a Plane’: 4.0,
    ‘The Night Listener’: 3.0, ‘Superman Returns’: 5.0, ‘You, Me and Dupree’: 3.5},
    ‘Toby’: {‘Snakes on a Plane’:4.5,‘You, Me and Dupree’:1.0,‘Superman Returns’:4.0}}

from recommendations import critics
from math import sqrt
2.计算两个用户之间相关系数的函数(可参考文章https://blog.csdn.net/weixin_37325825/article/details/72952744)
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1

if len(si)==0: return 0

n=len(si)

sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])

sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

num=pSum-(sum1sum2/n)
den=sqrt((sum1Sq-pow(sum1,2)/n)
(sum2Sq-pow(sum2,2)/n))
if den==0: return 0

r=num/den

return r

3.传入被推荐者,找到其对应的相似度最高的用户

def topMatches(prefs,person,n=1,similarity=sim_pearson):
scores=[(similarity(prefs,person,other),other) for other in prefs if other != person]
scores.sort()
scores.reverse()
return scores[0:n]
4.将相似度最高的用户中的好评电影推荐给当前用户
def getRecommendations():
person2 = topMatches(critics,‘Lisa Rose’)
for key,value in critics[person2[0][1]].items():
if value>3.0:
print(key)

if name == ‘main’:
getRecommendations()

你可能感兴趣的:(算法)