51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在电商推荐系统中,如何计算用户与商品的相似度?假设有用户购买历史(如用户A购买过商品1、3,用户B购买过商品1、2),给出一种高效算法(如协同过滤中的基于物品的CF),并分析时间复杂度和适用场景。

淘天集团T-STAR 日常实习生难度:中等

答案

1) 【一句话结论】:在电商推荐系统中,采用基于物品的协同过滤(Item-Based CF),通过预计算并存储商品间的相似度矩阵,对用户购买过的商品推荐相似商品,该算法时间复杂度低(推荐阶段为O(U*K),K为Top K相似商品数),适合商品数量庞大的场景(如淘宝百万级商品)。

2) 【原理/概念讲解】:老师口吻,解释核心思想。基于物品的协同过滤的核心是“商品相似度驱动推荐”,即先计算所有商品之间的相似度,再基于用户购买行为推荐相似商品。具体步骤:

  • 数据准备:收集用户购买历史,构建用户-商品矩阵(用户A→{商品1,3},用户B→{商品1,2})。
  • 相似度计算:选择度量(如余弦相似度),计算任意两个商品之间的相似度。余弦相似度公式为:
    ( \text{sim}(i,j) = \frac{\sum_{u \in U} \mathbf{r}{u,i} \cdot \mathbf{r}{u,j}}{\sqrt{\sum_{u \in U} (\mathbf{r}{u,i})^2} \cdot \sqrt{\sum{u \in U} (\mathbf{r}{u,j})^2}} ),其中( \mathbf{r}{u,i} )表示用户u对商品i的评分(购买行为可视为评分1),共现用户数量可简化为用户集合的交集大小(如商品1和商品2的共现用户为{A,B},则相似度为1)。
  • 推荐生成:对于用户购买的商品,查找该商品相似度最高的其他商品(Top K),推荐给用户。例如,用户A购买商品1和3,商品1的相似商品是商品2(相似度1),商品3无其他共现用户,故推荐商品2。

类比:把商品看作“物品”,用户购买行为是“喜欢”,那么相似的商品就是“同类型”(如都是“运动鞋”),推荐就是“给你喜欢的‘运动鞋’的同类型‘篮球鞋’”,通过计算物品间的“相似性”来传递偏好。

3) 【对比与适用场景】:用表格对比基于物品和基于用户的CF:

维度基于物品的CF(Item-Based CF)基于用户的CF(User-Based CF)
定义计算商品间的相似度,推荐相似商品计算用户间的相似度,推荐相似用户购买的商品
计算对象商品-商品相似度用户-用户相似度
时间复杂度计算阶段:O(N²)(N为商品数),推荐阶段:O(U*K)(U为用户数,K为Top K相似商品数)计算阶段:O(U²)(U为用户数),推荐阶段:O(U*K)(K为Top K相似用户数)
适用场景商品数量庞大(如电商百万级商品),用户行为稀疏用户数量较少(如社交推荐),用户行为密集
注意点需高效存储和查询商品相似度矩阵(如稀疏矩阵、缓存)需高效存储和查询用户相似度矩阵,用户间相似度计算效率低(用户数多时)

4) 【示例】:以用户A(购买商品1、3)、用户B(购买商品1、2)为例,计算商品1和商品2的余弦相似度(共现用户为{A,B},共现用户数=2,用户1的购买用户数=2,用户2的购买用户数=2,故相似度=2/(√2*√2)=1)。推荐步骤:

  • 计算商品1的相似商品:商品2(相似度1),商品3(共现用户{A},相似度=1/ (√1*√1)=1)。
  • 用户A未购买商品2,故推荐商品2。
    伪代码(简化版):
# 用户购买历史
user_items = {'A': [1, 3], 'B': [1, 2]}
# 计算商品相似度(余弦相似度,共现用户数量)
item_sim = {}
for item1 in user_items['A']:
    for item2 in user_items['A']:
        if item1 != item2:
            common_users = set(user_items['A']) & set(user_items['B'])
            if item1 in common_users and item2 in common_users:
                sim = 1  # 共现用户相同
            else:
                sim = 0
            item_sim[(item1, item2)] = sim
# 推荐给用户A
recommended = []
for item in user_items['A']:
    for similar_item, s in item_sim.items():
        if similar_item[0] == item and similar_item[1] not in user_items['A']:
            recommended.append((similar_item[1], s))
recommended.sort(key=lambda x: x[1], reverse=True)
# 输出推荐结果:商品2,相似度1

5) 【面试口播版答案】:面试官您好,针对电商推荐系统中计算用户与商品相似度的问题,我主要介绍基于物品的协同过滤(Item-Based CF)算法。核心思路是先预计算并存储商品间的相似度矩阵,再对用户购买过的商品推荐相似商品。具体来说:

  1. 收集用户购买历史(比如用户A买过商品1、3,用户B买过商品1、2);
  2. 计算商品间的相似度(以余弦相似度为例,通过共现用户数量计算,如商品1和商品2的共现用户为{A,B},相似度为1);
  3. 对用户购买的商品,推荐该商品相似度最高的其他商品(用户A买过商品1和3,商品1的相似商品是商品2,所以推荐用户A商品2)。
    时间复杂度方面,计算商品间相似度是O(N²),但推荐阶段只需查询Top K相似商品(如Top 100),复杂度降为O(U*K),适合大规模商品场景(如淘宝百万级商品)。适用场景主要是电商这类商品数量庞大的场景,因为基于用户的CF计算用户间相似度时,用户数量远大于商品数量,效率低。总结来说,基于物品的协同过滤通过商品相似度计算,高效地推荐用户可能感兴趣的商品,是电商推荐系统中常用的方法。

6) 【追问清单】:

  • 问题1:相似度计算方法有哪些?如何选择?
    回答要点:常用余弦相似度(适合高维稀疏数据,如购买行为)、皮尔逊相关系数(适合连续评分数据,如打分)。选择依据是数据稀疏性和计算效率(余弦相似度计算简单,适合电商场景)。
  • 问题2:如何处理冷启动问题(新用户或新商品)?
    回答要点:新用户可通过基于内容的推荐(如商品属性、热门商品)或热门商品推荐;新商品可通过用户首次购买行为(如首次购买的用户)或属性相似度(如商品标签、价格区间)推荐。
  • 问题3:如何优化大规模商品场景下的相似度计算效率?
    回答要点:使用缓存(如Redis)存储相似度矩阵,避免重复计算;采用稀疏矩阵存储(如CSR格式),减少内存占用;分批计算相似度(如按商品类别分批)。

7) 【常见坑/雷区】:

  • 坑1:混淆基于用户和基于物品的CF,错误认为基于物品的CF适合小数据集。
    雷区:需明确基于物品的CF适合大规模商品场景,基于用户的适合小规模用户场景。
  • 坑2:时间复杂度分析错误,误认为基于物品的CF计算所有用户对的时间复杂度(O(U²))。
    雷区:基于物品的CF计算商品间相似度是O(N²),而非用户间。
  • 坑3:适用场景描述不准确,如说基于物品的CF不适合电商场景。
    雷区:电商场景(商品数百万级)是典型适用场景,需强调其优势。
  • 坑4:未提及相似度计算的具体方法(如余弦相似度),显得不具体。
    雷区:需说明常用相似度度量(如余弦相似度)及其适用场景。
  • 坑5:未考虑冷启动问题,回答不全面。
    雷区:面试官可能会追问新用户/新商品的处理方法,需提前准备。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1