hhl987805837 2024-01-03 08:44 采纳率: 66.7%
浏览 7
已结题

错误在第18行,说是什么无法找到键值1


import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

# 1. 读取数据
data = pd.read_csv('u.data', sep='\t', names=['user_id', 'movie_id', 'rating', 'timestamp'])

print(data.head())

# 2. 创建用户-电影评分矩阵
ratings_df = pd.pivot_table(data, index='user_id', columns='movie_id', values='rating').fillna(0)

# 3. 计算用户之间的相似度(这里使用余弦相似度)
user_similarities = cosine_similarity(ratings_df.T)

# 4. 用户相关性分析 - 找出与特定用户最相似的前N个用户
target_user = '1'  # 假设目标用户ID为1
n_top_users = 10
top_similar_users = user_similarities[ratings_df.index.get_loc(target_user)].argsort()[:-n_top_users - 1:-1]
print(f"与用户{target_user}最相似的前{n_top_users}个用户:", ratings_df.index[top_similar_users])


# 5. 协同过滤 - 基于用户相似度进行电影推荐
def recommend_movies(user_id, n_recommendations=10):
    similar_scores = user_similarities[ratings_df.index.get_loc(user_id)]
    similar_indices = similar_scores.argsort()[:-n_recommendations - 1:-1]

    # 获取目标用户未观看过的电影
    movies_seen_by_target_user = ratings_df.loc[user_id].nonzero()[1]

    # 对于每个相似用户,找到他们看过但目标用户没看过的电影,并根据相似用户的评分加权求和
    recommendations = {}
    for i in similar_indices:
        similar_user = ratings_df.index[i]
        movies_seen_by_similar_user = ratings_df.loc[similar_user].nonzero()[1]
        unseen_movies = list(set(movies_seen_by_similar_user) - set(movies_seen_by_target_user))

        for movie in unseen_movies:
            recommendations[movie] = recommendations.get(movie, 0) + ratings_df.loc[similar_user, movie] * \
                                     similar_scores[i]

    # 推荐得分最高的n部电影
    sorted_recommendations = sorted(recommendations.items(), key=lambda x: x[1], reverse=True)
    return [movie for movie, score in sorted_recommendations[:n_recommendations]]


# 6. 对目标用户进行电影推荐

recommended_movies = recommend_movies(target_user)
print(f"为用户{target_user}推荐的{10}部电影:", recommended_movies)
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/295f29808f2c4866866b2b9589ea6b0c.png "#left")

  • 写回答

2条回答 默认 最新

  • yyhff 2024-01-03 09:12
    关注

    u.data 文件应该是csv格式,第一列的userid所对应的数据中,是否有值为1的数据? 如果没有,改代码为相对应的第一列的值

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错