m0_56062032 2024-03-18 19:47 采纳率: 68%
浏览 17

欧氏距离电影推荐算法

怎样把给所有用户推荐的电影都保存起来?


import pandas as pd
from math import *
import numpy as np

"""
读取movies文件,设置列名为’videoId', 'title', 'genres'
读取ratings文件,设置列名为'userId', 'movieId', 'rating', 'timestamp'
通过两数据框之间的 videoId 连接
保存'userId', 'rating', 'movieId', 'title'为data数据表
"""
movies = pd.read_csv("D:/Datamovies/ml-latest-small/movies.csv", names=['movieId', 'title', 'genres'])
ratings = pd.read_csv("D:/Datamovies/ml-latest-small/ratings.csv",names=['userId', 'movieId', 'rating', 'timestamp'])
data = pd.merge(movies, ratings, on='movieId')
data[['userId', 'rating', 'movieId', 'title']].sort_values('userId').to_csv('D:/Datamovies/ml-latest-small/data.csv',index=False)
 
"""
新建一个data字典存放每位用户评论的电影和评分, 如果字典中没有某位用户,则使用用户ID来创建这位用户,否则直接添加以该用户ID为key字典中
"""
file = open("D:/Datamovies/ml-latest-small/data.csv",'r', encoding='UTF-8')
data = {}
for line in file.readlines():
    line = line.strip().split(',')
    if not line[0] in data.keys():
        data[line[0]] = {line[3]:line[1]}
    else:
        data[line[0]][line[3]] = line[1]
 
 
"""
找到两位用户共同评论过的电影,然后计算两者之间的欧式距离,最后算出两者之间的相似度,欧式距离越小两者越相似
"""
def Euclidean(user1, user2):
    user1_data = data[user1]
    user2_data = data[user2]
    distance = 0
    for key in user1_data.keys():
        if key in user2_data.keys():
           distance += pow(float(user1_data[key]) - float(user2_data[key]), 2)
 
    return 1 / (1 + sqrt(distance))
 
"""
计算某个用户与其他用户的相似度
"""
def top_simliar(userID):
    res = []
    for userid in data.keys():
        # 排除与自己计算相似度
        if not userid == userID :
            simliar = Euclidean(userID, userid)
            res.append((userid, simliar))
    res.sort(key=lambda val: val[1])
    return res[:4]
 
"""
从控制台输入需要推荐的用户ID,如果用户不在原始数据集中则报错,重新输入
"""
getIdFlag = 0
while not getIdFlag:
    inputUid = str(input("请输入用户ID\n"))
    try:
        uid = data[inputUid]
        getIdFlag = 1
    except Exception:
        print("用户ID错误,请重新输入\n")
 
 
"""
根据与当前用户相似度最高的用户评分记录,按降序排列,推荐出改用户还未观看的评分最高的10部电影
"""
def recommend(user):
    top_sim_user = top_simliar(user)[0][0]
    items = data[top_sim_user]
    recommendations = []
    for item in items.keys():
        if item not in data[user].keys():
            recommendations.append((item, items[item]))
    recommendations.sort(key=lambda val: val[1], reverse=True)  # 按照评分排序
    return recommendations[:10]
 
"""
根据输入的用户ID,输出为他推荐的影片
"""
Recommendations = recommend(inputUid)
print("为用户" + inputUid + "推荐下列评分最高的十部影片\n")
for video in Recommendations:
    print(video)
  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-18 19:47
    关注

    m0_56062032 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据你的需求,保存给所有用户推荐的电影可以通过以下步骤实现:

    1. 在代码中,已经将给用户推荐的电影保存在了一个名为recommendations的变量中。可以使用该变量将推荐结果保存到一个新的数据结构或者文件中。

    2. 选择合适的数据结构。根据需要,可以选择将推荐结果保存到列表、字典或者数据表等数据结构中。比较常用的选择是将结果保存到一个名为recommendations的字典中,其中键为用户ID,值为推荐的电影列表。

    3. 将推荐结果保存到字典中。在recommend函数中,可以使用一个新的字典来存储推荐结果。在每次循环中,将用户ID作为键,推荐的电影列表作为值,并将该键值对添加到字典中。

    4. 保存字典到文件中。可以使用Python的文件操作函数,例如openwrite,将推荐结果保存到一个文本文件或者CSV文件中。

    以下是修改后的代码示例,展示了如何将推荐结果保存到一个字典,并将字典保存到一个文本文件中:

    # 新建一个空字典来保存推荐结果
    recommendations_dict = {}
    
    # 从控制台输入需要推荐的用户ID,如果用户不在原始数据集中则报错,重新输入
    getIdFlag = 0
    while not getIdFlag:
        inputUid = str(input("请输入用户ID\n"))
        try:
            uid = data[inputUid]
            getIdFlag = 1
        except Exception:
            print("用户ID错误,请重新输入\n")
    
    # 根据输入的用户ID,进行推荐
    recommendations = recommend(inputUid)
    
    # 将推荐结果保存到字典中
    recommendations_dict[inputUid] = recommendations
    
    # 将推荐结果字典保存到文件中
    with open("recommendations.txt", "w") as file:
        for user, movies in recommendations_dict.items():
            file.write(f"用户{user}的推荐电影:\n")
            for movie in movies:
                file.write(f"电影ID: {movie[0]}, 评分: {movie[1]}\n")
    
    print("推荐结果已保存到recommendations.txt文件中")
    

    请注意,以上是一种简单的实现方法,具体的数据结构和保存方式可以根据实际需求进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改