Python简单电影推荐算法(根据用户看过的电影名和对其打分进行推荐)

def max_score(film):
    return data[user2][film]
def score_different(use, fil):
    score = 0
    for filmName in fil:
        # sum = abs(data[use][filmName]-user[filmName])
        # if(sum!=0):
        #     score += 3*1/(abs(data[use][filmName] - user[filmName])**2)
        # else:
        #     score+=0;
        score += (abs(data[use][filmName] - user[filmName]))**2
    return score
data = {'user' + str(i): {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
        for i in range(1, 20)}
print("各个用户的电影打分情况:",data)
user = {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
print("用户本人的电影打分情况:",user)
film_len = 0
user2 = ""
Film_Score = 0
user_score =  dict()
for key, value in data.items():
    film = set(value) & set(user)
    #推荐电影的各用户推荐度分数算法:看过的相同电影数*2+(每部3*1/(看过的相同电影的评分差的平方))
    # 例如我: 1:5 2:5
    # user2:  1:8 2:8
    # 课上讲的评分标准为:2*0.5+3*1/(3**2+3**2)
    # 而我的标准为:2*0.5+(3*1/(3**2)+3*1/(3**2))
    Film_Score = score_different(key, film)
    if Film_Score !=0:
        user_score[key] = 3*1/Film_Score+len(film)*0.5
    else:
        user_score[key] = len(film)*0.5+5
    # if len(film) == film_len:
    #     if score_different(key, film) < Film_Score:
    #         film_len = len(film)
    #         user2 = key
    #         Film_Score = score_different(key, film)
    # if len(film) > film_len:
    #     film_len = len(film)
    #     user2 = key
    #     Film_Score = score_different(key, film)
print("输出用户的推荐度分数")
print(user_score)
print("与用户本人最相似的用户:")
user3 = max(zip(user_score.values(),user_score.keys()))
print(max(zip(user_score.values(),user_score.keys())))
# print(user2, data[user2])
print(user3[1],data[user3[1]])
print("为用户推荐电影:")
# print(max(set(data[user2]) - set(user), key=max_score))
# print(max(set(data[user3[1]])-set(user)))
# print(set(data[user3[1]])-set(user))
# max_value = max(set(data[user3[1]])-set(user))
# for i,j in set(data[user3[1]])-set(user):
# user4 = data[user3[1]][1]
# print(user3)
# print(user3[1])
uuu = dict(data[user3[1]])
# print(uuu)  # print(max(uuu))
maxvalue = max(uuu.values())
r_commend_film = []
for m,n in uuu.items():
    if n==maxvalue and m not in user:
        r_commend_film.append(m)
print(r_commend_film)
def max_score(film):
    return data[user2][film]
def score_different(use, fil):
    score = 0
    for filmName in fil:
        # sum = abs(data[use][filmName]-user[filmName])
        # if(sum!=0):
        #     score += 3*1/(abs(data[use][filmName] - user[filmName])**2)
        # else:
        #     score+=0;
        score += (abs(data[use][filmName] - user[filmName]))**2
    return score
data = {'user' + str(i): {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
        for i in range(1, 20)}
print("各个用户的电影打分情况:",data)
user = {'film' + str(randrange(1, 15)): randrange(1, 6) for j in range(randrange(3, 10))}
print("用户本人的电影打分情况:",user)
film_len = 0
user2 = ""
Film_Score = 0
user_score =  dict()
for key, value in data.items():
    film = set(value) & set(user)
    #推荐电影的各用户推荐度分数算法:看过的相同电影数*2+(每部3*1/(看过的相同电影的评分差的平方))
    # 例如我: 1:5 2:5
    # user2:  1:8 2:8
    # 课上讲的评分标准为:2*0.5+3*1/(3**2+3**2)
    # 而我的标准为:2*0.5+(3*1/(3**2)+3*1/(3**2))
    Film_Score = score_different(key, film)
    if Film_Score !=0:
        user_score[key] = 3*1/Film_Score+len(film)*0.5
    else:
        user_score[key] = len(film)*0.5+5
    # if len(film) == film_len:
    #     if score_different(key, film) < Film_Score:
    #         film_len = len(film)
    #         user2 = key
    #         Film_Score = score_different(key, film)
    # if len(film) > film_len:
    #     film_len = len(film)
    #     user2 = key
    #     Film_Score = score_different(key, film)
print("输出用户的推荐度分数")
print(user_score)
print("与用户本人最相似的用户:")
user3 = max(zip(user_score.values(),user_score.keys()))
print(max(zip(user_score.values(),user_score.keys())))
# print(user2, data[user2])
print(user3[1],data[user3[1]])
print("为用户推荐电影:")
# print(max(set(data[user2]) - set(user), key=max_score))
# print(max(set(data[user3[1]])-set(user)))
# print(set(data[user3[1]])-set(user))
# max_value = max(set(data[user3[1]])-set(user))
# for i,j in set(data[user3[1]])-set(user):
# user4 = data[user3[1]][1]
# print(user3)
# print(user3[1])
uuu = dict(data[user3[1]])
# print(uuu)  # print(max(uuu))
maxvalue = max(uuu.values())
r_commend_film = []
for m,n in uuu.items():
    if n==maxvalue and m not in user:
        r_commend_film.append(m)
print(r_commend_film)

以上代码的逻辑对于推荐电影来说不是很严格,单纯的使用其他用户的电影评分数量和评分高低与本用户的数据做比对,并对每个用户计算其推荐指数:

例如: 我看了 {film1:打分5,film2:打分8}。而user1也看了这两部电影,这时user1的推荐指数的计算就涉及到两个标准:

(1)看过相同的电影数量:比如每部+1分,存入新定义的字典中,字典格式 key:value:{用户:分数}

(2)相同电影的打分情况:各部电影分数方差的倒数(要考虑到完全相同,方差为0的情况)(用条件语句就可以解决)

综上,哪个用户的最终得分高,就推荐哪个用户看过的电影(而且是被推荐电影的用户没看过的电影)

以上只是python课堂的一个小作业,还待改进

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值