
1) 【一句话结论】针对教育系统(用户行为驱动)推荐课程/习题,适用协同过滤(基于用户行为);期货交易系统(市场特征驱动)推荐交易策略,适用基于内容的推荐(基于市场特征);若需兼顾两者,采用混合推荐(用户行为+市场特征)。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 推荐算法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 协同过滤 | 基于用户/物品的相似度 | 不依赖物品特征,依赖行为 | 教育系统(用户行为驱动) | 数据稀疏时效果差,冷启动难 |
| 基于内容 | 基于物品的特征相似度 | 依赖物品特征,不依赖行为 | 期货系统(市场特征驱动) | 特征提取不准确会导致推荐偏差 |
| 混合推荐 | 结合用户行为与物品特征 | 两者结合,精度更高 | 教育系统+期货系统(需兼顾两者) | 权重分配需合理,避免过度依赖某一方 |
4) 【示例】
# 用户-物品行为矩阵(用户ID, 课程ID, 行为值)
data = [[1, 'A', 1], [1, 'B', 1], [2, 'A', 1], [2, 'C', 1]]
# 计算用户相似度(余弦相似度)
def user_similarity(u1, u2):
common_items = [item for item in data if item[0] in (u1, u2)]
if not common_items: return 0
vec1 = {item[1]: 1 for item in data if item[0]==u1}
vec2 = {item[1]: 1 for item in data if item[0]==u2}
common = set(vec1.keys()) & set(vec2.keys())
return sum(vec1[i]*vec2[i] for i in common) / (len(common) ** 0.5 * len(common) ** 0.5)
# 推荐给用户1(未点击的课程)
unwatched_courses = [c for c in data if c[1] not in [row[1] for row in data if row[0]==1]]
for course in unwatched_courses:
similar_users = [u for u in data if u[1]==course[1]]
similar_users = [u[0] for u in similar_users]
similar_users.remove(1)
similar_users = [u for u in similar_users if user_similarity(1, u)>0.5]
if similar_users:
recommended_course = similar_users[0]
print(f"推荐给用户1课程{course[1]}(相似用户{recommended_course}喜欢)")
5) 【面试口播版答案】
“面试官您好,针对教育系统(用户行为驱动)推荐课程/习题,我建议采用协同过滤,原理是‘物以类聚,人以群分’,通过分析用户历史点击、作业提交等行为,计算用户相似度,推荐相似用户喜欢的课程;期货交易系统(市场特征驱动)则采用基于内容的推荐,通过分析K线、成交量等市场特征,推荐相似形态的交易策略。若需兼顾两者,可使用混合推荐,结合用户行为和物品特征提升精度。总结来说,教育系统选协同过滤,期货系统选基于内容,混合推荐更优。”
6) 【追问清单】
7) 【常见坑/雷区】