
1) 【一句话结论】
基于用户协同过滤的推荐系统通过计算用户间的相似度,将相似用户的行为(如好友关系或商品交互)推荐给目标用户,核心是相似度计算与推荐逻辑。
2) 【原理/概念讲解】
老师口吻:咱们先讲协同过滤的基本思想——它利用用户的历史行为(比如好友关系、商品购买/浏览记录)来推断用户偏好,再推荐相似用户的行为对象。这里分两种场景:
核心步骤是:
数据结构上,倒排表的作用很关键——比如“商品1”的倒排表包含所有购买过该商品的用户ID,这样计算相似度时能快速获取共同交互用户,提升效率。
3) 【对比与适用场景】
| 类别 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 用户-用户协同过滤 | 基于用户行为相似度,为用户推荐与自身相似的其他用户的行为对象(如好友、商品) | 相似度计算基于用户向量(交互项目集合),推荐逻辑是“相似用户喜欢什么,我也可能喜欢” | 好友推荐、商品推荐(尤其是冷启动阶段,用户行为少时) | 计算复杂度高(需遍历所有用户对),数据稀疏性问题(用户行为少) |
| 项目-项目协同过滤 | 基于项目间相似度,为用户推荐与用户已交互项目相似的其他项目 | 相似度计算基于项目向量(用户交互集合),推荐逻辑是“喜欢A的用户也喜欢B” | 商品推荐(用户行为多时,项目间相似度易计算) | 需要更多项目交互数据,冷启动问题(新项目无交互记录) |
4) 【示例】
以商品推荐为例,假设用户A和用户B都购买了商品1和商品2,用户C只购买了商品1。计算A和B的余弦相似度:
伪代码示例:
def cosine_similarity(user_vec1, user_vec2):
dot_product = sum(u*v for u,v in zip(user_vec1, user_vec2))
norm1 = sum(u*u for u in user_vec1)
norm2 = sum(v*v for v in user_vec2)
return dot_product / (norm1 * norm2)
# 用户交互数据(0/1矩阵)
user_items = {
"userA": [1,1,0], # 商品1=1, 商品2=1, 商品3=0
"userB": [1,1,0],
"userC": [1,0,0]
}
# 计算userA和userB相似度
sim = cosine_similarity(user_items["userA"], user_items["userB"])
print(f"userA和userB相似度: {sim}") # 输出1
# 推荐给userC
for item in user_items["userB"]:
if item == 1 and user_items["userC"][item-1] == 0: # 商品2(索引1)
print(f"推荐userC商品2")
5) 【面试口播版答案】
面试官您好,我设计的基于用户协同过滤推荐系统核心是通过计算用户间的相似度,为用户推荐相似用户的好友或商品。首先,系统会构建用户-项目(或好友)的交互矩阵,比如用户购买/浏览商品或关注好友的记录。然后计算用户相似度,常用余弦相似度,它计算用户交互向量的夹角余弦值,值越大表示用户偏好越相似。接着,对于目标用户,找到相似度最高的K个用户,统计这些用户喜欢的项目(或好友)中目标用户未接触过的,作为推荐结果。比如,用户A和用户B都关注了用户C,那么推荐给用户A用户B关注的人(如用户D、E)。数据结构上,我们用倒排表来加速查找,比如“商品1”的倒排表包含所有购买过该商品的用户ID,这样计算相似度时能快速获取共同交互用户。优点是能发现隐藏的偏好,推荐个性化内容;缺点是计算复杂度高,数据稀疏时效果差,还有冷启动问题(新用户或新项目无交互记录时推荐不准)。
6) 【追问清单】
7) 【常见坑/雷区】