推荐系统原理与实现:协同过滤/内容推荐/深度学习
1. 推荐系统分类
推荐系统方法:
├── 协同过滤(Collaborative Filtering)
│ ├── 基于用户:相似用户喜欢的物品
│ ├── 基于物品:相似物品推荐
│ └── 矩阵分解:SVD/ALS
├── 基于内容(Content-Based)
│ ├── 物品特征匹配
│ └── 用户画像匹配
├── 混合推荐(Hybrid)
│ └── 多种方法组合
└── 深度学习推荐
├── Wide & Deep
├── DeepFM
└── Two-Tower
2. 协同过滤
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 用户-物品矩阵
# R[i][j] = 用户 i 对物品 j 的评分
R = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[0, 0, 5, 4],
])
# 基于用户的协同过滤
user_sim = cosine_similarity(R)
print("用户相似度矩阵:")
print(user_sim)
# 基于物品的协同过滤
item_sim = cosine_similarity(R.T)
print("物品相似度矩阵:")
print(item_sim)
# 预测评分
def predict_user_cf(R, user_sim, user_id, item_id, k=2):
similar_users = np.argsort(user_sim[user_id])[::-1][1:k+1]
ratings = R[similar_users, item_id]
weights = user_sim[user_id, similar_users]
return np.dot(ratings, weights) / (weights.sum() + 1e-8)
3. 矩阵分解(SVD)
from surprise import SVD, Dataset, Reader
from surprise.model_selection import cross_validate
# 加载数据
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)
# SVD 模型
model = SVD(n_factors=50, n_epochs=20, lr_all=0.005, reg_all=0.02)
# 交叉验证
results = cross_validate(model, data, measures=['RMSE', 'MAE'], cv=5)
print(f"RMSE: {results['test_rmse'].mean():.4f}")
4. 基于内容的推荐
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
# 物品特征
items = ['action movie with explosions', 'romantic comedy love story', ...]
# TF-IDF 向量化
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(items)
# 计算相似度
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)
def get_recommendations(title, cosine_sim=cosine_sim):
idx = indices[title]
sim_scores = list(enumerate(cosine_sim[idx]))
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
sim_scores = sim_scores[1:11]
item_indices = [i[0] for i in sim_scores]
return df['title'].iloc[item_indices]
总结
| 方法 |
优势 |
劣势 |
| 协同过滤 |
不需要特征工程 |
冷启动问题 |
| 基于内容 |
可解释性强 |
特征工程复杂 |
| 矩阵分解 |
处理稀疏矩阵 |
难以融入特征 |
| 深度学习 |
自动特征学习 |
需要大量数据 |