
1) 【一句话结论】
通过整合用户行为、课程属性、用户画像等多源数据,经特征工程转化为模型输入,采用协同过滤(基于用户行为相似性)与内容推荐(基于课程属性匹配)结合的算法,结合准确率、召回率、NDCG及A/B测试评估效果,实现个性化学习资源推荐。
2) 【原理/概念讲解】
老师今天要讲的是课程推荐系统的设计,核心是“数据-特征-算法-评估”四步走:
3) 【对比与适用场景】
| 算法类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 协同过滤 | 基于用户行为数据,通过相似性计算推荐(用户-用户/用户-物品) | 依赖用户行为,能发现冷启动问题(新用户也能推荐) | 用户行为丰富(如学习记录多) | 需处理稀疏矩阵(用户-课程矩阵稀疏),可能过时(推荐结果不更新) |
| 内容推荐 | 基于课程属性(标签、难度等)和用户画像,匹配兴趣 | 依赖课程特征,适合冷启动(新课程也能推荐) | 课程属性明确,用户画像清晰 | 可能忽略用户动态兴趣(如用户兴趣变化后,推荐结果滞后) |
4) 【示例】
假设有一个用户行为数据表(user_behavior),包含用户ID、课程ID、行为类型(点击/完成/评分);课程属性表(course_attr)包含课程ID、标签(如“编程基础”“数据分析”)、难度(1-5级);用户画像表(user_profile)包含用户ID、基础信息、学习历史。
伪代码示例:
# 1. 数据预处理
user_behavior = {user_id: [course_id1, course_id2, ...], ...} # 用户行为序列
course_attr = {course_id: {"tags": ["编程基础"], "difficulty": 3, "related": [related_id]}} # 课程属性
user_profile = {user_id: {"info": {...}, "history": {...}}} # 用户画像
# 2. 特征工程
# 用户兴趣向量:统计用户对每个标签的点击次数,归一化
user_interest = {user_id: {tag: count, ...}, ...}
user_vec = {user_id: normalize(user_interest[user_id])} # 归一化后向量
# 课程特征向量:将标签one-hot,难度数值化
course_vec = {course_id: {"tags": one_hot(tags), "difficulty": difficulty}} # 课程特征矩阵
# 3. 推荐算法(协同过滤)
# 计算用户相似度(余弦相似度)
sim_user = cosine_similarity(user_vec.values())
# 目标用户u,找Top K相似用户
top_k_users = get_top_k_similar_users(u, sim_user[u], k=5)
# 推荐相似用户喜欢的课程(排除已学习)
recommended_courses = set()
for v in top_k_users:
for c in user_behavior[v]:
if c not in user_behavior[u]:
recommended_courses.add(c)
# 4. 评估
# 准确率:推荐列表中用户实际学习的课程占比
accuracy = len(recommended_courses & set(user_behavior[u])) / len(recommended_courses)
# NDCG:基于排序的评估(位置权重)
ndcg = calculate_ndcg(recommended_courses, user_behavior[u])
5) 【面试口播版答案】
面试官您好,针对课程推荐系统,我的设计思路是围绕“数据驱动+算法匹配+效果验证”三个核心展开。首先数据来源方面,我们整合了三类数据:一是用户行为数据(如点击、完成、评分等学习行为),二是课程属性数据(课程标签、难度、关联课程等),三是用户画像数据(基础信息、学习历史等)。然后进行特征工程,将原始数据转化为模型可用的特征,比如用户行为序列转化为用户兴趣向量,课程属性转化为特征矩阵。推荐算法上,我考虑采用协同过滤算法,通过计算用户间的相似性(比如余弦相似度),找到与目标用户兴趣相似的用户,推荐他们喜欢的课程;同时结合内容推荐,根据课程属性匹配用户画像,比如用户喜欢高难度课程,就推荐难度匹配的课程。评估方面,采用准确率、召回率、NDCG等指标,并结合A/B测试,将推荐系统与现有系统对比,验证推荐效果是否提升。
6) 【追问清单】
7) 【常见坑/雷区】