通过前面几天的knn相关知识,来计算电影推荐

240826 计算电影推荐_ide

import json
 import numpy as npfrom euclidean_score import euclidean_score
 from pearson_score import pearson_score
 from find_similar_users import find_similar_users
  
 # 为给定用户生成电影推荐
 def generate_recommendations(dataset, user):
     if user not in dataset:
         raise TypeError('User ' + user + ' not present in the dataset')    total_scores = {}
     similarity_sums = {}    for u in [x for x in dataset if x != user]:
         similarity_score = pearson_score(dataset, user, u)        if similarity_score <= 0:
             continue        for item in [x for x in dataset[u] if x not in dataset[user] or dataset[user][x] == 0]:
             total_scores.update({item: dataset[u][item] * similarity_score})
             similarity_sums.update({item: similarity_score})    if len(total_scores) == 0:
         return ['No recommendations possible']    # 生成电影评分列表
     movie_ranks = np.array([[total/similarity_sums[item], item] 
             for item, total in total_scores.items()])    # 根据皮尔逊进行排序
     movie_ranks = movie_ranks[np.argsort(movie_ranks[:, 0])[::-1]]    # 提取推荐电影
     recommendations = [movie for _, movie in movie_ranks]    return recommendations
  
 if __name__=='__main__':
     data_file = 'movie_ratings.json'    with open(data_file, 'r') as f:
         data = json.loads(f.read())
     
     user = 'Michael Henry'
     print "\nRecommendations for " + user + ":"
     movies = generate_recommendations(data, user) 
     for i, movie in enumerate(movies):
         print str(i+1) + '. ' + movie
    # 打印推荐电影列表
     user = 'John Carson' 
     print "\nRecommendations for " + user + ":"
     movies = generate_recommendations(data, user) 
     for i, movie in enumerate(movies):
         print str(i+1) + '. ' + movie
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.