推荐系统实战:用Python代码实现一个简单的电影推荐算法
·
数据准备
使用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数据集官网。
更多推荐
所有评论(0)