m0_56062032 2024-05-11 10:28 采纳率: 68%
浏览 2
已结题

基于统计分析的电影推荐算法

基于统计分析的电影推荐算法代码没有报错但是结果没有输出是什么原因?

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score

# 加载movielens 100K数据集
def load_movielens_data(path='D:/Datamovies/ml-100k/u1.base', test_size=0.2):
    # 读取用户和电影的元数据
    users_df = pd.read_csv(path, sep='\t', header=None, names=['user_id', 'movie_id', 'rating', 'timestamp'])
    
    # 分割数据集为训练集和测试集
    train, test = train_test_split(users_df, test_size=test_size, random_state=42)
    
    # 计算电影之间的相似度
    movie_similarity = cosine_similarity(train[['rating']].values.T)
    
    # 将相似度矩阵转化为DataFrame
    movie_similarity_df = pd.DataFrame(movie_similarity, columns=train['movie_id'].unique())
    
    return train, test, movie_similarity_df

# 推荐电影给用户
def recommend_movies(movie_similarity_df, user_id, num_recommendations=10):
    # 为当前用户找到最相似的用户
    similar_users = movie_similarity_df.apply(lambda x: x.corr(movie_similarity_df.iloc[user_id]))
    
    # 找到这些相似用户评分最高的电影
    recommended_movies = similar_users.nlargest(num_recommendations).index
    
    return recommended_movies

# 评估推荐系统的性能
def evaluate_performance(train, test, movie_similarity_df):
    # 标准化评分
    scaler = StandardScaler()
    train_scaled = scaler.fit_transform(train[['rating']])
    test_scaled = scaler.transform(test[['rating']])
    
    # 训练推荐模型
    model = NearestNeighbors(n_neighbors=10)
    model.fit(train_scaled)
    
    # 预测测试集
    predictions = model.kneighbors(test_scaled, return_distance=False)
    
    # 计算均方根误差
    rmse = mean_squared_error(test['rating'], predictions, squared=False)
    
    # 计算准确率和召回率
    # 这里我们假设我们推荐的列表中只有1个电影是被评分过的,这是简化的情况
    num_test_users = len(test)
    accurate_recalls = [1 if len(set(predictions[i]).intersection(set(train['movie_id'][train['user_id'] == test.iloc[i]['user_id']]))) > 0 else 0 for i in range(num_test_users)]
    total_recalls = [1 if len(set(predictions[i]).intersection(set(train['movie_id'][train['user_id'] == test.iloc[i]['user_id']]))) > 0 else 0 for i in range(num_test_users)]
    accuracy = sum(accurate_recalls) / num_test_users
    recall = sum(total_recalls) / num_test_users
    return rmse,accuracy,recall
# 执行推荐系统
def run_recommender_system(path='D:/Datamovies/ml-100k/u1.base', test_size=0.2):
    train, test = load_movielens

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-05-11 10:28
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    可能原因:
    1. 数据集加载不成功,或数据格式不正确。
    2. 模型没有训练,或者训练不完整。
    3. 模型没有使用正确的参数进行测试,或测试集没有正确地加载。
    4. 输出部分代码被注释掉了,或者没有完成。
    5. 算法存在逻辑错误。 解决方法:
    6. 检查数据集路径,文件后缀和文件内容是否正确。可以使用pandas等库读取数据,确保数据集被正确加载。
    7. 检查训练模型是否完整,以及数据是否经过预处理。可以使用KNN等算法来训练模型。
    8. 检查测试时是否使用正确的参数,测试集是否被正确加载。可以使用sklearn的train_test_split方法来划分训练集和测试集。
    9. 检查输出部分代码是否正确,或者是否已经完成。可以在完成算法后再次检查代码的正确性。
    10. 检查算法逻辑是否正确,并尝试进行调试和优化。可以使用实验数据来验证算法的正确性,并进行参数调整。 案例: 假设我们的电影推荐算法代码没有报错,但是结果没有输出,我们可以检查以下几点:
    11. 数据集是否被正确加载。我们可以将load_movielens_data函数的返回值打印出来,确保数据集被正确加载,并且被正确地划分为训练集和测试集。
    12. 训练模型是否正确。我们可以将evaluate_performance函数的输出打印出来,确保算法能够正确地计算均方根误差、准确率和召回率。
    13. 测试时是否使用正确的参数。我们可以将run_recommender_system函数的输出打印出来,确保模型已经正确地被训练,并且使用了正确的参数进行测试。
    14. 输出部分代码是否正确。我们可以检查recommend_movies函数是否正确地实现,并且是否正确地输出了推荐结果。 代码实现: 我们可以按照以下代码实现来检查电影推荐算法的正确性,并且输出推荐结果:
    import numpy as np
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.metrics.pairwise import cosine_similarity
    from sklearn.neighbors import NearestNeighbors
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import mean_squared_error
    from sklearn.model_selection import cross_val_score
    # 加载movielens 100K数据集
    def load_movielens_data(path='D:/Datamovies/ml-100k/u1.base', test_size=0.2):
        # 读取用户和电影的元数据
        users_df = pd.read_csv(path, sep='\t', header=None, names=['user_id', 'movie_id', 'rating', 'timestamp'])
        
        # 分割数据集为训练集和测试集
        train, test = train_test_split(users_df, test_size=test_size, random_state=42)
        
        # 计算电影之间的相似度
        movie_similarity = cosine_similarity(train[['rating']].values.T)
        
        # 将相似度矩阵转化为DataFrame
        movie_similarity_df = pd.DataFrame(movie_similarity, columns=train['movie_id'].unique())
        
        return train, test, movie_similarity_df
    # 推荐电影给用户
    def recommend_movies(movie_similarity_df, user_id, num_recommendations=10):
        # 为当前用户找到最相似的用户
        similar_users = movie_similarity_df.apply(lambda x: x.corr(movie_similarity_df.iloc[user_id]))
        
        # 找到这些相似用户评分最高的电影
        recommended_movies = similar_users.nlargest(num_recommendations).index
        
        return recommended_movies
    # 评估推荐系统的性能
    def evaluate_performance(train, test, movie_similarity_df):
        # 标准化评分
        scaler = StandardScaler()
        train_scaled = scaler.fit_transform(train[['rating']])
        test_scaled = scaler.transform(test[['rating']])
        
        # 训练推荐模型
        model = NearestNeighbors(n_neighbors=10)
        model.fit(train_scaled)
        
        # 预测测试集
        predictions = model.kneighbors(test_scaled, return_distance=False)
        
        # 计算均方根误差
        rmse = mean_squared_error(test['rating'], predictions, squared=False)
        
        # 计算准确率和召回率
        # 这里我们假设我们推荐的列表中只有1个电影是被评分过的,这是简化的情况
        num_test_users = len(test)
        accurate_recalls = [1 if len(set(predictions[i]).intersection(set(train['movie_id'][train['user_id'] == test.iloc[i]['user_id']]))) > 0 else 0 for i in range(num_test_users)]
        total_recalls = [1 if len(set(predictions[i]).intersection(set(train['movie_id'][train['user_id'] == test.iloc[i]['user_id']]))) > 0 else 0 for i in range(num_test_users)]
        accuracy = sum(accurate_recalls) / num_test_users
        recall = sum(total_recalls) / num_test_users
        
        return rmse,accuracy,recall
    # 执行推荐系统
    def run_recommender_system(path='D:/Datamovies/ml-100k/u1.base', test_size=0.2):
        train, test, movie_similarity_df = load_movielens_data(path, test_size)
        
        # 输出电影推荐结果
        print(recommend_movies(movie_similarity_df, user_id=1))
        
        # 评估推荐系统性能
        print(evaluate_performance(train, test, movie_similarity_df))
    run_recommender_system()
    

    我们可以调整测试集的大小,来测试不同大小的测试集对推荐算法的影响。同时我们也可以调整相邻电影的数量,来测试不同的相邻电影数量对推荐算法的影响。

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

报告相同问题?

问题事件

  • 系统已结题 5月19日
  • 已采纳回答 5月11日
  • 创建了问题 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局部变量对蓝图不可见