
1) 【一句话结论】:采用用户行为(协同过滤)与课程内容(基于内容)双特征融合的推荐算法,通过计算用户历史选课行为与目标课程标签的相似度,结合行为权重(如时间衰减),输出兴趣度评分,兼顾推荐准确性与可解释性。
2) 【原理/概念讲解】:推荐算法的核心是匹配用户偏好与课程特征,需结合协同过滤(用户行为相似度)与基于内容推荐(课程标签相似度)的优势。
3) 【对比与适用场景】:
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 协同过滤 | 基于用户行为,计算用户/物品相似度 | 依赖用户行为数据,能发现隐藏关联 | 用户行为丰富(如选课记录多),冷启动问题 | 数据稀疏时效果差,计算复杂(需计算所有用户相似度) |
| 基于内容推荐 | 基于物品内容特征(标签),匹配用户历史特征 | 依赖物品特征,可解释性强 | 课程标签明确(如数学、编程),新课程推荐 | 需高质量标签,用户行为数据少时效果差 |
| 双特征融合 | 结合协同过滤与基于内容推荐 | 优势互补,提升准确性与可解释性 | 用户行为与标签数据均可用,需平衡两者权重 | 需设计融合策略(如加权),计算复杂度较高 |
4) 【示例】:
假设用户U1历史选课:数学(M)、编程(P)、语文(Y);目标课程C1标签:编程(P)、数学(M)。
def calculate_interest(user_history, course_tags, user_sim_score=0, time_weight=0.7):
# 基于内容相似度
user_tags = set(user_history)
course_tags = set(course_tags)
common_tags = user_tags & course_tags
user_vec = [1 if t in user_tags else 0 for t in all_tags]
course_vec = [1 if t in course_tags else 0 for t in all_tags]
content_sim = sum(user_vec[i] * course_vec[i] for i in range(len(all_tags))) / (norm(user_vec) * norm(course_vec))
# 协同过滤相似度(假设已计算,如0.8165)
# time_weight: 近期行为权重(指数衰减,如time_weight = exp(-decay_rate * (current_time - last_time)))
# 融合:加权求和
interest = (user_sim_score * 0.4) + (content_sim * time_weight * 0.6)
return interest
(注:all_tags是所有课程标签集合,norm是向量模长计算)
5) 【面试口播版答案】:
面试官您好,针对用户对某门课程的兴趣度计算,我会采用用户行为(协同过滤)与课程内容(基于内容)双特征融合的推荐算法。核心思路是:先提取用户历史选课的标签(如数学、编程),再结合用户行为相似度(找与用户选课习惯相似的其他用户),通过计算用户历史标签与目标课程标签的相似度(如余弦相似度),并给近期行为加权重(比如最近一个月的行为权重更高),最终输出兴趣度评分。
具体来说,比如用户之前选过“数学”和“编程”课程,目标课程“编程进阶”的标签包含“编程”和“数学”,那么先计算用户历史标签向量与目标课程标签向量的余弦相似度(得到0.82),再结合用户行为相似度(比如与该用户选课习惯最相似的用户也选过这门课,贡献0.4分),最后给近期行为加权重(比如0.7),最终兴趣度是两者加权后的结果(约0.65)。数据结构上,用哈希表存储用户-标签映射(用户ID→标签列表)和课程-标签映射(课程ID→标签列表),这样查询标签信息很快。这样既能利用用户行为数据捕捉潜在偏好,又能利用课程标签解释推荐理由,提升推荐的准确性和可解释性。
6) 【追问清单】:
7) 【常见坑/雷区】: