推荐系统原理与实现:协同过滤/内容推荐/深度学习

推荐系统原理与实现:协同过滤/内容推荐/深度学习

1. 推荐系统分类

复制代码
推荐系统方法:
├── 协同过滤(Collaborative Filtering)
│   ├── 基于用户:相似用户喜欢的物品
│   ├── 基于物品:相似物品推荐
│   └── 矩阵分解:SVD/ALS
├── 基于内容(Content-Based)
│   ├── 物品特征匹配
│   └── 用户画像匹配
├── 混合推荐(Hybrid)
│   └── 多种方法组合
└── 深度学习推荐
    ├── Wide & Deep
    ├── DeepFM
    └── Two-Tower

2. 协同过滤

python 复制代码
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)

python 复制代码
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. 基于内容的推荐

python 复制代码
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]

总结

方法 优势 劣势
协同过滤 不需要特征工程 冷启动问题
基于内容 可解释性强 特征工程复杂
矩阵分解 处理稀疏矩阵 难以融入特征
深度学习 自动特征学习 需要大量数据
相关推荐
sun8612207711 分钟前
Hy4 Preview 高效预览与协作应用指南
人工智能
码云之上26 分钟前
10 颗一模一样的「Edit」:中后台 Web Agent 怎么找到对的那一行
前端·人工智能·浏览器
阿里云大数据AI技术35 分钟前
EMR Serverless Ray:让 AI 推理融入数据处理
人工智能·spark
TDengine (老段)44 分钟前
TDengine IDMP 十大实用功能(9)
大数据·数据库·人工智能·物联网·时序数据库·tdengine·idmp
MobotStone1 小时前
毛选从哪篇开始读?
人工智能
QZ166560951591 小时前
政务泛监测体系能力排行:AI 重塑监测边界,治理的颗粒度革命
网络·人工智能·安全·网络安全·政务
模域ModelSphere1 小时前
长回复吐到一半断了,流式推理还能接着写吗?
人工智能
用户1917291270831 小时前
Agent 运行时还是预览版,企业怎么上生产?准入 4 查与隔离回滚实战
人工智能
海螺_AIHCC2 小时前
开源模型挤着发了一圈,先别比榜单,算算显存
人工智能
米小虾2 小时前
给正在干活的 Agent 插一句话:steering 的原理与实现
人工智能·agent