m0_56062032 2024-03-18 19:03 采纳率: 68%
浏览 0
已结题

欧氏距离电影推荐评估

欧氏距离电影推荐算法怎样计算其准确率,召回率和F1?


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)
 
  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2024-03-18 19:03
    关注

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

    要计算欧氏距离电影推荐算法的准确率、召回率和F1值,需要使用一个评估数据集来对推荐结果进行比较。假设你已经有了一个包含用户的真实评分和推荐结果的数据集。

    以下是计算准确率、召回率和F1值的步骤:

    1. 准确率(Precision):准确率衡量的是推荐结果中有多少是准确的,即被用户实际观看的电影在推荐结果中的比例。

      • 统计推荐结果中每部电影被用户实际观看的次数,记为TP (True Positives)。
      • 计算总共推荐给用户的电影数量,记为TP + FP (True Positives + False Positives)。
      • 准确率 = TP / (TP + FP)
    2. 召回率(Recall):召回率衡量的是用户实际观看的电影在推荐结果中有多少被成功推荐到,即用户实际观看的电影在推荐结果中的比例。

      • 统计推荐结果中每部电影被用户实际观看的次数,记为TP (True Positives)。
      • 计算用户实际观看的电影数量,记为TP + FN (True Positives + False Negatives)。
      • 召回率 = TP / (TP + FN)
    3. F1值:F1值是综合考虑了准确率和召回率的评价指标,可以用来平衡两者之间的关系。F1值的计算公式为:

      • F1 = 2 * (Precision * Recall) / (Precision + Recall)

    以下是修改后的Python代码,包括计算准确率、召回率和F1值的函数:

    def evaluate_recommendations(user, recommendations):
        true_positives = 0
        false_positives = 0
        false_negatives = 0
    
        # 统计推荐结果中每部电影被用户实际观看的次数
        for movie in recommendations:
            if movie in data[user].keys():
                true_positives += 1
            else:
                false_positives += 1
    
        # 计算用户实际观看的电影数量
        total_watched = len(data[user])
    
        # 计算准确率和召回率
        precision = true_positives / (true_positives + false_positives)
        recall = true_positives / (true_positives + false_negatives)
    
        # 计算F1值
        f1 = 2 * (precision * recall) / (precision + recall)
    
        return precision, recall, f1
    
    # 使用示例
    precision, recall, f1 = evaluate_recommendations(inputUid, Recommendations)
    print("准确率:", precision)
    print("召回率:", recall)
    print("F1值:", f1)
    

    请注意,以上代码是基于给定的评估数据集进行计算的。如果你没有评估数据集,可以手动创建一些测试用例来进行评估。另外,代码中的data是之前从文件中读取的数据,你需要确保数据的正确性和完整性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月26日
  • 已采纳回答 3月18日
  • 创建了问题 3月18日