算法开发

协同过滤推荐算法第一版实现实验:课程推荐功能开发

2025-09-02 | Python 3.11 + Pandas + Scikit-learn + FastAPI
算法设计 采用基于用户的协同过滤(User-Based CF)算法,核心思路:通过计算用户学习行为相似度,为目标用户推荐相似用户偏好的课程资源。 实现步骤
  1. 数据预处理与相似度矩阵构建:
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 )
  1. 推荐函数实现:
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]
  1. 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": []
        }
测试与优化
  1. 准确率评估:
- 测试数据集:随机选择200名用户,隐藏其最近学习的3个资源 - 评估指标:推荐列表中包含隐藏资源的比例(准确率) - 测试结果:第一版算法准确率78%,其中「实验报告」类资源推荐准确率最高(85%)
  1. 性能优化:
- 相似度矩阵预计算:每天凌晨离线计算用户相似度矩阵,避免实时计算耗时 - 缓存推荐结果:用户推荐结果缓存3小时,减少重复计算 - 数据降维:使用PCA将用户特征从500维降至100维,相似度计算速度提升3倍 后续优化方向
  1. 算法优化:融合基于内容的推荐(CBM),解决「冷启动」问题(新用户/新资源推荐)
  2. 实时性提升:引入增量更新机制,用户产生新学习行为后10分钟内更新推荐列表
  3. 多样性控制:添加资源类型多样性约束,避免推荐结果过于单一
  4. A/B测试:设计对照实验,对比推荐功能对用户学习时长、资源完成率的提升效果
分享至:

相关学习推荐

数据挖掘

Python数据分析实战:学习行为特征挖掘实验

2025-08-15
查看详情
前端开发

网站3.0版本UI设计与前端开发启动实验

2025-09-01
查看详情