数据准备

使用MovieLens数据集(小型版本),包含用户评分、电影信息和标签。可通过以下代码下载并加载数据:

import pandas as pd

# 加载数据
ratings = pd.read_csv('ml-latest-small/ratings.csv')
movies = pd.read_csv('ml-latest-small/movies.csv')

协同过滤算法

基于用户的协同过滤(User-Based CF)通过计算用户相似度推荐电影:

from sklearn.metrics.pairwise import cosine_similarity

# 创建用户-电影评分矩阵
user_movie_matrix = ratings.pivot_table(index='userId', columns='movieId', values='rating').fillna(0)

# 计算用户相似度
user_similarity = cosine_similarity(user_movie_matrix)
user_similarity_df = pd.DataFrame(user_similarity, index=user_movie_matrix.index, columns=user_movie_matrix.index)

生成推荐

为特定用户推荐未观看过的电影:

def recommend_movies(user_id, n_recommendations=5):
    # 获取相似用户
    similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:6]
    
    # 获取相似用户的高分电影
    similar_users_ratings = user_movie_matrix.loc[similar_users.index]
    mean_ratings = similar_users_ratings.mean(axis=0)
    
    # 过滤已观看电影
    watched_movies = user_movie_matrix.loc[user_id][user_movie_matrix.loc[user_id] > 0].index
    recommendations = mean_ratings.drop(watched_movies).sort_values(ascending=False)
    
    # 返回电影标题
    return movies[movies['movieId'].isin(recommendations.head(n_recommendations).index)]

recommend_movies(user_id=1)

矩阵分解(SVD)

使用奇异值分解提升推荐精度:

from scipy.sparse.linalg import svds

# 标准化评分并应用SVD
ratings_matrix = user_movie_matrix.values
ratings_normalized = ratings_matrix - np.mean(ratings_matrix, axis=1).reshape(-1, 1)
U, sigma, Vt = svds(ratings_normalized, k=50)
sigma = np.diag(sigma)

# 预测评分
predicted_ratings = np.dot(np.dot(U, sigma), Vt) + np.mean(ratings_matrix, axis=1).reshape(-1, 1)
predicted_ratings_df = pd.DataFrame(predicted_ratings, columns=user_movie_matrix.columns, index=user_movie_matrix.index)

评估指标

计算均方根误差(RMSE)评估模型:

from sklearn.metrics import mean_squared_error

def rmse(prediction, ground_truth):
    prediction = prediction[ground_truth.nonzero()].flatten()
    ground_truth = ground_truth[ground_truth.nonzero()].flatten()
    return np.sqrt(mean_squared_error(prediction, ground_truth))

rmse(predicted_ratings, ratings_matrix)

优化建议

  • 引入隐式反馈(如点击数据)
  • 使用深度学习模型(如NeuMF)
  • 实时更新用户相似度矩阵

代码需安装依赖库:pandas, numpy, scikit-learn, scipy。完整项目可参考MovieLens数据集官网

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐