m0_56062032 2024-05-11 11:49 采纳率: 68%
浏览 2

基线baseline的电影推荐算法的准确率召回率

基线baseline的电影推荐算法怎样计算其准确率和召回率?

import numpy as np
import pandas as pd
title=['user_id', 'item_id', 'rating', 'timestamp']
df = pd.read_csv("D:/Datamovies/ml-100k/u3.base",sep='\t',names = title)
test_df=pd.read_csv('D:/Datamovies/ml-100k/u3.test',sep='\t',names=title)
print (np.max(df['user_id']),np.max(df['item_id']))
ratings = np.zeros((943, 1682))
for row in df.itertuples():
    ratings[row[1]-1,row[2]-1] = row[3]
sparsity = float(len(ratings.nonzero()[0]))
sparsity /= (ratings.shape[0] * ratings.shape[1])
sparsity *= 100
print('训练集矩阵密度为: {:4.2f}%'.format(sparsity))
all_mean = np.mean(ratings[ratings!=0])
user_mean = sum(ratings.T)/sum((ratings!=0).T)
item_mean = sum(ratings)/sum((ratings!=0))
#用all_mean填充user_mean和item_mean可能存在的空值Nan
user_mean = np.where(np.isnan(user_mean), all_mean, user_mean)
item_mean = np.where(np.isnan(item_mean), all_mean, item_mean)
def predict_naive(user, item):
    prediction = item_mean[item] + user_mean[user] - all_mean
    return prediction
def rmse(pred, actual):
    '''计算预测结果的rmse'''
    from sklearn.metrics import mean_squared_error
    pred = pred[actual.nonzero()].flatten()
    actual = actual[actual.nonzero()].flatten()
    return np.sqrt(mean_squared_error(pred, actual))
# 用测试集测试
for row in test_df.itertuples():
    user,item,actual = row[1]-1,row[2]-1,row[3]
    predictions=[]
    predictions.append(predict_naive(user, item))
    actuals=[]
    actuals.append(actual)
print('测试结果的rmse为 %.4f' % rmse(np.array(predictions), np.array(actuals)))

  • 写回答

3条回答 默认 最新

  • 笑面虎 2024-05-11 11:49
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】: 您的问题是如何计算基线(baseline)电影推荐算法的准确率(Precision)和召回率(Recall)。在推荐系统中,准确率和召回率是用来衡量推荐质量的两个重要指标。准确率关注的是推荐列表中相关项目的比例,而召回率关注的是推荐系统能够找出的所有相关项目的比例。

    【问题出现原因】: 您提供的代码是一个基于用户和物品平均评分的简单推荐算法,它并没有实现一个完整的推荐系统,因此无法直接计算准确率和召回率。准确率和召回率的计算通常需要以下步骤:

    1. 有一个测试集,包含用户对物品的真实评分。
    2. 有一个推荐列表,是推荐算法为用户生成的预测评分或推荐物品的列表。
    3. 通过比较测试集和推荐列表来计算准确率和召回率。

    【问题解决方案】: 要计算准确率和召回率,您需要修改代码以生成推荐列表,然后与测试集中的真实评分进行比较。以下是计算准确率和召回率的基本步骤:

    1. 对于每个用户,生成一个推荐列表,通常是预测评分最高的N个物品。
    2. 对于每个用户,从推荐列表中找到与测试集中的物品交集。
    3. 计算准确率:推荐列表中的相关物品数除以推荐列表的长度。
    4. 计算召回率:推荐列表中的相关物品数除以测试集中相关物品的总数。

    【提供代码】: 以下是修改后的代码片段,用于生成推荐列表并计算准确率和召回率:

    # ...之前的代码...
    
    # 设置要推荐的Top N物品数量
    TOP_N = 5
    
    # 初始化准确率和召回率
    precision_sum = 0
    recall_sum = 0
    user_count = 0
    
    # 对于每个用户生成推荐列表并计算准确率和召回率
    for user in range(ratings.shape[0]):
        # 计算每个物品的预测评分
        predictions = predict_naive(user, np.arange(ratings.shape[1]))
        # 找到Top N推荐的物品
        top_n_indices = np.argsort(-predictions)[:TOP_N]
        top_n_items = np.array([item_mean.index[rating] for rating in top_n_indices])
        
        # 计算准确率和召回率
        test_items = set(test_df[test_df['user_id'] == user+1]['item_id'] - 1)
        num_correct = len(set(top_n_items) & test_items)
        precision = num_correct / TOP_N if TOP_N != 0 else 0
        recall = num_correct / len(test_items) if len(test_items) != 0 else 0
        
        precision_sum += precision
        recall_sum += recall
        user_count += 1
    
    # 计算平均准确率和召回率
    average_precision = precision_sum / user_count
    average_recall = recall_sum / user_count
    
    print(f'平均准确率: {average_precision:.4f}')
    print(f'平均召回率: {average_recall:.4f}')
    

    【代码运行方式】: 您需要将上述代码片段添加到您现有的代码中,并确保您的环境中安装了numpypandas库。您可以使用Python解释器直接运行整个脚本。

    【代码预期运行结果】: 代码将输出每个用户的平均准确率和召回率。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见