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课堂的一个小作业,还待改进