算法开发
协同过滤推荐算法第一版实现实验:课程推荐功能开发
算法设计
采用基于用户的协同过滤(User-Based CF)算法,核心思路:通过计算用户学习行为相似度,为目标用户推荐相似用户偏好的课程资源。
实现步骤
测试与优化
- 数据预处理与相似度矩阵构建:
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
读取用户-资源评分数据(学习时长标准化为0-5分)
user_item_matrix = pd.read_csv('user_item_rating.csv', index_col='user_id')
填充缺失值(未学习资源评分为0)
user_item_matrix = user_item_matrix.fillna(0)
计算用户间余弦相似度
user_similarity = cosine_similarity(user_item_matrix)
user_similarity_df = pd.DataFrame(
user_similarity,
index=user_item_matrix.index,
columns=user_item_matrix.index
)
- 推荐函数实现:
def get_user_recommendations(user_id, top_n=5):
# 1. 获取目标用户的相似用户(相似度Top 20)
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:21].index
# 2. 获取相似用户已学习但目标用户未学习的资源
user_learned = user_item_matrix.loc[user_id][user_item_matrix.loc[user_id] > 0].index
similar_users_items = user_item_matrix.loc[similar_users]
# 3. 计算资源推荐得分(加权平均相似度)
item_scores = {}
for item in similar_users_items.columns:
if item not in user_learned:
# 获取评分该资源的相似用户
users_who_rated = similar_users_items[item][similar_users_items[item] > 0].index
if len(users_who_rated) > 0:
# 加权得分 = Σ(用户相似度 * 用户评分) / Σ(用户相似度)
weighted_score = (user_similarity_df[user_id][users_who_rated] *
similar_users_items[item][users_who_rated]).sum()
total_similarity = user_similarity_df[user_id][users_who_rated].sum()
item_scores[item] = weighted_score / total_similarity
# 4. 返回Top N推荐资源
sorted_items = sorted(item_scores.items(), key=lambda x: x[1], reverse=True)[:top_n]
return [item[0] for item in sorted_items]
- FastAPI接口封装:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(title="学习资源推荐API")
class RecommendRequest(BaseModel):
user_id: int
top_n: int = 5
@app.post("/recommend/courses")
def recommend_courses(request: RecommendRequest):
try:
recommended_item_ids = get_user_recommendations(
request.user_id,
request.top_n
)
# 关联资源详情(从数据库获取)
recommended_items = get_item_details(recommended_item_ids)
return {
"code": 200,
"message": "success",
"data": recommended_items
}
except Exception as e:
return {
"code": 500,
"message": f"推荐失败:{str(e)}",
"data": []
}
- 准确率评估:
- 性能优化:
- 算法优化:融合基于内容的推荐(CBM),解决「冷启动」问题(新用户/新资源推荐)
- 实时性提升:引入增量更新机制,用户产生新学习行为后10分钟内更新推荐列表
- 多样性控制:添加资源类型多样性约束,避免推荐结果过于单一
- A/B测试:设计对照实验,对比推荐功能对用户学习时长、资源完成率的提升效果
分享至: