想象你是米其林餐厅的主厨,要为贵宾准备一场十道菜晚宴。后厨备好了上百道好菜,但你只能端上十道。就算每道菜都做得精致(相关性够高),如果顺序上先来五道红烧肉,再来五道甜品,宾客也会皱眉——这就是“体验”。你需要决定的不只是“哪道菜好吃”,而是“整桌菜怎么搭配、按什么顺序上桌”。在推荐系统里,这个“排菜岗位”就是重排策略,它站在精排之后,像一个掌控全局摆盘的总厨,追求的不再是单道菜的得分,而是整场宴席的舒适与平衡。 重排要解决的核心矛盾,是相关性与多样性的协同:太贪相关性,列表会变得单调同质;太贪多样性,又会让用户觉得“这不是我想要的”。如同主厨在菜品的可口与桌面的均衡之间拿捏分寸。更进一步,重排还要遵守餐厅的硬规矩——哪些食材今天缺货(业务约束)、贵宾忌口(频控与过滤)、哪道招牌菜必须压轴(位置强控)。当新菜单上线后,如何通过宾客反馈判断这次改版成败?答案是科学的 AB 实验。而当宴席规模从十人变成十万人时,后厨的流水线速度(工程实现)又成了新的挑战。 本文将围绕“重排与多样性协同”这条主线,系统讲解重排框架、目标函数、多样性算法、业务约束、AB 评估与工程实现——让你从“会打分”的单点选手,成长为“懂全局体验”的推荐系统工程师。
学习本知识后,你将掌握信息流/首页/广告场景下“全局体验优化”的核心方法论,这是推荐系统从业者从初级晋升到中高级最关键的技能之一。
可视化演示
展示重排流水线(精排->重排->业务约束->最终列表)、多样性度量对比(Before同类聚集vs After类型分散+ILD/Entropy/Coverage)、多目标融合(score=a*rel+b*div+硬约束),交互切换核心维度。
本节配有交互动效(进入视口后自动加载,约 3KB)。
重排流水线四阶段 精排:对候选集打分排序,输出Top-N候选列表 重排:全局列表优化,融合相关性与多样性目标 业务约束:广告位/频率/配比/安全等硬约束过滤 pipeline: rank -> rerank -> constraint -> final_list 毫秒级延迟保障实时重排响应
重排框架概述
米其林餐厅里有个特殊岗位叫“排菜师”(Chef de Partie 的进阶职责)。采购负责挑选优质食材(召回),备菜大厨负责把食材做成精致的半成品(精排),而排菜师要考虑的,是这一整桌宴席该如何呈现——先上开胃菜还是招牌主菜?冷热如何交替?口味浓淡如何穿插?重排在推荐系统中扮演的正是这个角色。它站在精排之后,不再孤立的看“哪条内容分更高”,而是看“整个列表在一起是不是舒服”。
精排通常用 CTR/CVR 预估模型给每条候选内容打一个分,然后按分数降序截断 Top-N。但每一条内容单独看都优质,它们放在一起却未必和谐——比如十条全是同一位明星的八卦新闻。重排的输入正是精排输出的 Top-N 候选列表(通常 50-200 条),输出是最终展示给用户的 10-20 条排序结果。它通过重新排列组合,在单条相关性与整体多样性之间找最佳平衡点。
从技术架构来看,推荐系统通常分为召回→精排→重排→策略下发四个阶段。召回负责从百万级候选粗筛出千级,精排用复杂模型精算出百级,重排再做最后的全局优化。一个典型的大厂信息流系统里,重排模块可能同时承载多样性控制、去重、频控、广告混排等多项职责。它本质上是站在全局视角做列表优化,解决“局部最优≠全局最优”的问题。
回到厨师的比喻:精排像主厨判断“每道菜火候是否到位”,重排像总厨审视“整桌菜是否和谐”。前者是局部质量,后者是全局体验——两者缺一不可。
重排目标函数
排菜师要怎么决定“这桌菜怎么排”?他心中一定有一个评判标准:宾客每吃一道菜有多满意(相关性收益),相邻菜品是否口味重复(多样性损失),以及是否有特殊菜品必须放某个位置(业务约束)。在数学上,这个评判标准被形式化为重排目标函数——一个综合了相关性收益与多样性代价的全局效用函数。
假设候选集合为 $R$,已选进最终列表的集合为 $S$,每次我们要从 $R$ 中挑一个“性价比最高”的内容 $d_i$ 加入 $S$。目标函数既要奖励高相关性的内容,又要惩罚与已选内容太相似的内容。令 $\hat{y}_i$ 为精排模型给出的相关性分数,$\text{sim}(d_i, S)$ 为内容 $d_i$ 与已选集合的最大相似度,重排的贪心决策可写成:
从 NDCG(归一化折损累计增益)的视角看,重排是在精排排序基础上进一步优化一个“考虑了多样性的评估指标”。传统排序指标只看单条相关性,而重排的效用函数把列表的整体分布纳入考量。实际工程中,目标函数还会加入业务代价项——比如广告位导致的体验损伤、连续相同类别的惩罚,形成一个多项目权衡的大函数。
在排菜师眼里,这张目标函数就是他的“排菜评分表”:每挑一道菜,心里计算的是“这道菜有多好吃”减去“它和前几道菜多重复”,最终让整桌菜既美味又丰富。
- 候选排除$d_i \in R \setminus S$ 表示只能从未被选中的候选中挑,避免重复选择同一条内容。
- 加权相关性$\lambda \cdot \hat{y}_i$ 给相关性分数乘上权重 λ,λ 大则相关性对最终选择的贡献大。
- 多样性惩罚项$(1-\lambda) \cdot \max_{d_j \in S} \text{sim}(d_i, d_j)$ 计算候选内容与已选内容中的最大相似度,越相似惩罚越大。
- 取最大值决策$\arg\max$ 表示遍历所有候选,选择“相关性收益减多样性代价”最大的那一个加入列表。
多样性算法
客人最喜欢问主厨的一句话是:“怎么没有别的选择?”如果十道菜都是鸡肉,就算每道都做到极致,宾客也会腻。排菜师需要具体的“搭配算法”。行业里有两大流派:一派靠经验法则(MMR),一派靠概率建模(DPP)。
MMR(最大边际相关性) 是最经典的重排算法。它的思想非常直观:每一步都选择一个候选,使得“这个候选与查询的相关性”尽量大,同时“与已选候选的相似度”尽量小。这就像排菜时,在“宾客爱吃”和“别和上道菜重样”两个目标之间取折中。MMR 的计算复杂度为 O(N²),对百级候选量完全可以接受,因此在工业界被广泛使用。
DPP(行列式点过程) 是更数学化的多样性建模方法。它将整个集合的“多样性得分”定义为一个核矩阵的行列式:如果两个内容很相似,它们共同出现在集合中的概率会被强烈抑制。DPP 的优点是能够全局建模多样性而非两两贪心,缺点是准确求解是 NP-hard,工业界常用贪心近似(每次选择使行列式增量最大的元素)。
滑动窗口惩罚 是一种工程上常用的轻量级多样性方案:不在全局范围内计算两两相似度,只检查候选与最近 K 个已选内容是否同类别或高相似,若是则降权。因为用户注意力往往集中在最近几条,局部多样性就能带来大部分体验收益。它像排菜时“只要不上一种食材连着超过两次”的简单规则,成本低且有效。
排菜师的工具箱里,MMR 像经验老道的手感,DPP 像精确的分子料理配方,滑动窗口则像后厨最简单实用的“限时上菜规则”。你可以根据场景规模和算力预算选择或组合它们。
业务约束融合
宴席不止是美味与均衡——餐厅还有一堆硬规矩:招牌菜必须上(品牌保护)、海鲜每天限量(库存/频控)、客人对花生过敏(禁忌过滤)、主菜必须放在甜品之前(位置规则)。重排算法设计的再好,如果在真实业务中无法落地,也只是纸上谈兵。因此重排框架必须支持业务约束的灵活融合。
业务约束通常分为硬性约束与软性约束。硬性约束是必须满足的过滤条件,比如“已下架商品不出现在列表”“用户 24 小时内看过的内容不重复推荐”“广告位最多出现 1 条且必须间隔 5 条自然内容以上”。这类约束在重排入口作为过滤层先行处理,任何内容不满足条件就无权进入后续的多样性排序。软性约束则是“尽量满足”的偏好,通过惩罚项体现:
工程上,约束往往被封装成可配置的规则引擎。比如频控规则用 Redis 记录用户历史曝光,位次规则用“指定 item 必须出现在第 K 位”的硬编码逻辑,品牌保护则是将特定商家/话题设置为不可被同类挤压的“Protected 集合”。这些配置由业务方通过后台可视化界面动态调整,重排服务实时读取。
在排菜师的工作台上,业务约束就像一张写满“顾客禁忌”和“餐厅规矩”的备忘卡。多样性算法负责让宴席丰盛,而约束系统负责让宴席安全合规——两者协同,才能端出一桌真正的好菜。
- 最大化总收益$\max_S$ 表示我们目标是让整个列表 S 的效用总和最大化,而非单个内容。
- 单条内容效用$\text{utility}(i)$ 综合了这条内容的相关性、多样性贡献以及商业价值,是重排收益的基本单元。
- 惩罚项汇总$\sum_{k} p_k \cdot \text{violation}_k(S)$ 对所有违反软约束的行为按权重求和,比如“连续出现 3 条同类内容”记一次违规。
- 整体相减用“总收益减去总惩罚”作为优化目标,让重排算法在满足业务规则的前提下最大化体验与商业价值。
在线AB评估
新菜单能不能上?宾客的反馈说了算。但餐厅不能只听一两个人的意见,要用科学的方式收集和分析真实用餐数据。推荐系统也一样:重排策略上线前,必须经过严格的 AB 实验 验证。
AB 实验的核心是随机分流:把用户按组哈希到实验组(A)和对照组(B),两组唯一区别是重排策略不同(新版 vs 旧版)。为了保证科学性,分组必须是随机的、稳定的(同一个用户始终在同一组),并且实验期间两组流量要尽可能均匀。在信息流场景中,常见做法是按用户 ID 取模分桶,实验组和对照组各占 10% 流量跑 1-2 周,收集足够的样本。
评估指标上,既要看业务指标(CTR、人均时长、广告收入),也要看体验指标(内容多样性熵、同类连续率、负反馈率)。多样性提升往往会带来“短期 CTR 变化不大但长短期人均时长上升、负反馈下降”的效果——这类指标的关系需要通过关联分析来理解。最终决策要用统计显著性来判断,而不是看均值大小:
理想情况下,实验还要做正交分层:同一个用户可能同时参与多个实验,不同实验的流量要正交不干扰。此外要注意“新奇效应”——新策略刚上线时用户可能因为新鲜感而表现异常,通常需要预留 3-7 天的冷启动期再读数据。
排菜师的判断依据是宾客翻台率、好评率和重复预约率;推荐工程师的判断依据则是 CTR、时长和负反馈。但本质一样:用数据说话,让用户体验来投票。
- 均值差异$\mu_A - \mu_B$ 是实验组与对照组指标均值的差,比如实验组 CTR 为 0.031,对照组为 0.029,差值为 0.002。
- 标准误合并$\sqrt{\frac{\sigma_A^2}{n_A} + \frac{\sigma_B^2}{n_B}}$ 是两组标准误的合成,样本越多、方差越小,标准误越小,差异就越“可信”。
- z 值将差异标准化为 z 分数,当 $|z| > 1.96$ 时,我们以 95% 置信度认为差异源于策略本身。
工程实现要点
举办千人宴时,排菜师的排菜逻辑再完美,也抵不过后厨出菜速度跟不上。推荐系统的重排模块同样面临严苛的工程挑战:一次用户请求在精排之后往往只剩 30-80ms 的预算留给重排,必须在超低延迟下完成“多样性计算+约束校验+排序输出”全流程。
请求级优化是首要关注点。重排服务通常以 RPC 形式被主链路调用,输入是精排结果数组,输出是最终列表。为了压降延迟,工程上会采取多策略:一是向量预计算,提前把每条内容的 Embedding 向量算好存入特征库,重排时直接读取,避免在线推理;二是近似最近邻(ANN)加速,当候选规模较大时用 HNSW 等索引代替精确的两两相似度计算;三是并行分批,MMR 的贪心迭代虽然串行,但相似度计算可以按批次向量化并行。
缓存设计在重排链路中极其关键。热门用户(如头部主播的粉丝群)的请求量巨大,而他们的重排结果在短时间内变化不大,这类结果可以按“用户 ID + 策略版本”作为 Key 缓存 1-5 分钟。此外,特征向量和业务配置也要缓存到本地内存,避免每次请求都打远程存储。缓存命中率直接决定重排服务的 P99 延迟,工程上一般要求将 P99 控制在 50ms 以内。
性能指标与监控告警是保障线上稳定的眼睛。核心指标包括:重排耗时、QPS、缓存命中率、多样性熵、连续相同类型比例、硬约束违例次数。其中“硬约束违例次数”尤其重要——如果某次上线导致广告位超占比,会直接引发用户体验事故。监控系统需要配置多级告警:耗时超 80ms 触发 warn,违例超阈值触发 fatal 并自动回滚策略。
后厨的流水线上,每个环节都在抢时间。重排服务的高性能改造,就像是给排菜师配备了一个“智能备菜台”:食材分类提前放好(向量预计算)、常用配菜提前摆盘(缓存)、每道菜出餐时间实时显示(监控)。没有这些工程支撑,再精妙的排菜蓝图都只能停留在纸面上。
AI 应用场景
信息流推荐(抖音/快手/今日头条)
阶段:重排策略与多样性优化
解决的问题:传统精排只按预估点击率排序,导致同质内容扎堆——连续刷到同类型视频会让用户快速疲劳。重排策略在精排基础上引入 MMR/DPP 多样性算法,在用户停留时长、完播率与内容多样性之间找到平衡。
具体案例:某短视频平台发现重排前“连续同主题视频”占比达 42%,引入滑动窗口惩罚后,该比例降至 18%,人均观看时长提升 6.3%,负反馈率下降 12%。重排服务以 RPC 方式嵌入主链路,P99 延迟控制在 35ms 内。
电商首页(淘宝/京东/拼多多)
阶段:业务约束融合与重排
解决的问题:电商首页既要保证商品相关性和转化率,又要满足商家位次、品牌保护、频控等复杂业务规则。纯排序模型无法感知全局约束,重排框架通过“硬过滤+软惩罚”机制统一处理。
具体案例:某电商大促期间,重排模块将“已购商品不重复推荐”“同店铺商品间隔不超过 2 个”等规则封装为可配置约束,支持运营实时调整。上线后 GMV 提升 2.1%,同时广告位曝光占比稳定控制在 20% 上限内。
广告混排(信息流广告系统)
阶段:全局优化与在线AB评估
解决的问题:广告与自然内容混排时,既要保证广告收益,又不能过多损害用户体验。重排层通过目标函数里的商业价值项与体验惩罚项,把广告相关性、出价、用户忍受度统一建模。
具体案例:某广告平台在重排阶段加入“广告密度软约束”(相邻广告至少间隔 4 条自然内容),通过 AB 实验验证:广告收入持平的情况下,用户负反馈率下降 20%。之后又将该策略推广到全部流量。
Python 演示
import numpy as npfrom typing import List class MMRReranker: """MMR 重排器:在相关性与多样性之间做边际权衡。 贪心策略:每次从未选候选中挑出"相关性收益 - 多样性惩罚"最大的元素。 """ def __init__(self, lambda_: float = 0.7) -> None: self.lambda_ = lambda_ def _cosine_sim(self, a: np.ndarray, b: np.ndarray) -> float: """计算两个特征向量的余弦相似度,范围 [-1, 1]。""" dot = float(np.dot(a, b)) norm_a = float(np.linalg.norm(a)) norm_b = float(np.linalg.norm(b)) if norm_a == 0.0 or norm_b == 0.0: return 0.0 return dot / (norm_a * norm_b) def rerank(self, ids: List[str], scores: List[float], features: List[np.ndarray]) -> List[str]: """执行 MMR 贪心重排,返回重排后的 id 序列。 - ids: 候选内容 id 列表 - scores: 精排模型给出的相关性分数 - features: 每条内容的 embedding 向量 """ cand = list(range(len(ids))) selected_idx: List[int] = [] selected_feats: List[np.ndarray] = [] while cand: best_idx = None best_val = -float("inf") for i in cand: rel = scores[i] if selected_feats: sim = max(self._cosine_sim(features[i], f) for f in selected_feats) else: sim = 0.0 # MMR 核心公式: lambda * rel - (1 - lambda) * max_sim val = self.lambda_ * rel - (1 - self.lambda_) * sim if val > best_val: best_val = val best_idx = i selected_idx.append(best_idx) selected_feats.append(features[best_idx]) cand.remove(best_idx) return [ids[i] for i in selected_idx] if __name__ == "__main__": rng = np.random.default_rng(42) n = 8 ids = ["item-" + str(i) for i in range(n)] # 模拟 4 类内容: news / video / shop / social categories = ["news", "video", "shop", "news", "shop", "video", "news", "social"] scores = [0.90, 0.85, 0.80, 0.78, 0.75, 0.70, 0.65, 0.60] base = {"news": 1.0, "video": 2.0, "shop": 3.0, "social": 4.0} features = [] for c in categories: feat = base[c] + rng.normal(0, 0.1, size=8) features.append(feat) reranker = MMRReranker(lambda_=0.7) result = reranker.rerank(ids, scores, features) print("原始分数排序:", ids) print("MMR重排结果:", result) print("重排后的类别:", [categories[ids.index(x)] for x in result])
self.lambda_ = lambda_保存多样性权重参数,lambda_ 越大越看重相关性,越小越看重多样性。sim = max(self._cosine_sim(features[i], f) for f in selected_feats)计算候选与所有已选内容的最大相似度,这是 MMR 多样性惩罚的关键。val = self.lambda_ * rel - (1 - self.lambda_) * simMMR 核心公式,用相关性收益减去多样性代价得到边际价值。selected_idx.append(best_idx)每轮选出边际价值最高的内容加入结果集,更新已选集合。cand.remove(best_idx)将选过的内容从候选中移除,保证每条内容只出现一次。base[c] + rng.normal(0, 0.1, size=8)用类别向量加噪声模拟内容 embedding,让同类内容彼此相似而不同类内容区分明显。
常见误区
误区“精排不是已经按分数排好了吗?重排无非就是把得分最高的再验算一遍,防止算错,感觉没什么技术含量。”
正解重排与精排的本质区别在于视角:精排是“单点最优”,对每条内容独立打分排序;重排是“全局最优”,考虑内容之间的相互影响。就像选菜时每道菜单独品鉴都是高分,但摆在一起全是甜口就失败了一样,重排解决的是列表层次的体验问题,而非重复打分。
为何常见:初学者容易把“排序”理解为纯粹的分数序,忽略了“列表整体”本身是一个需要优化的对象。
误区“多多样性肯定对用户体验好啊,λ 设置成 0.9 甚至 1.0,让列表内容越多样越好。”
正解λ 是相关性与多样性的权衡系数,并非越大越好。λ 太大(比如 1.0)等价于退化成纯精排;λ 太小(比如 0.1)会让列表中出现大量与用户兴趣不相关的内容,反而拉低 CTR 和时长。正确的做法是通过网格搜索 + AB 实验找到最优值,通常信息流场景 λ 在 0.5-0.8 之间。
为何常见:人们容易把“多样性”和“好体验”划等号,忽略了多样性的本质是“在相关性的前提下增加变化”。
误区“MMR 不就是把所有候选两两算个相似度,最相似的扔掉几条吗?和普通去重没本质区别。”
正解MMR 不是离线一次性去重,而是在线贪心迭代:每一步都在“相关性的增量收益”和“与已选集合的最大相似度惩罚”之间做权衡。它是面向目标和查询的动态决策,而非静态去重。去重视角是“删除重复项”,MMR 视角是“每一步挑选增量价值最高的内容”。
为何常见:理解 MMR 时只盯住了相似度惩罚项,忽略了相关性正项和贪心选择过程。
误区“新策略上线,AB 实验 CTR 涨了 0.1% 就说明策略有效,可以全量推了。”
正解CTR 涨跌需要做统计显著性检验,0.1% 的提升如果 z 值小于 1.96,很可能只是随机波动。此外多样性策略往往不以 CTR 为唯一指标——它可能让 CTR 持平但负反馈率降低、时长提升,这些都需要多指标联合评估。只看单一指标不仅容易误判,还可能伤害长期体验。
为何常见:CTR 是推荐系统最直观的指标,人们倾向于用最简单的指标做判断,忽略了统计方法和多维度评估。
面试题
Q1. 重排阶段的主要输入是什么?
- A.全量内容库的候选集合
- B.精排模型输出的 Top-N 列表← 正确答案
- C.用户历史行为原始日志
- D.全站点击统计报表
答案:B。重排是精排之后的最后一公里,输入是精排已经排序好的 Top-N 候选列表(通常 50-200 条)。A 是召回阶段的输入,C 是特征工程输入,D 是离线分析数据,均非重排输入。
Q2. MMR 公式中 λ=1 时,重排结果等同于什么?
- A.完全随机排序
- B.纯多样性排序
- C.原始精排分数排序← 正确答案
- D.按相似度降序排列
答案:C。MMR 公式为 λ·相关度 − (1−λ)·相似度惩罚。当 λ=1 时,多样性惩罚项的权重为 0,公式退化为只按相关性分数排序,即等同于精排输出。λ=0 时则退化为只考虑多样性。
Q3. 下列哪些属于重排阶段的业务约束?
- A.同一作者的内容最多出现 2 条← 正确答案
- B.已下架商品强制过滤← 正确答案
- C.相邻广告间隔不少于 4 条自然内容← 正确答案
- D.精排模型使用双塔结构
答案:ABC。A 是频控规则,B 是硬性过滤,C 是广告位次约束,都属于重排要处理的业务约束。D 是精排模型的结构设计,与重排约束无关。
Q4. 为什么重排后 CTR 可能没有明显提升但仍然值得做?
- A.因为重排主要为了降低服务器成本
- B.因为多样性优化往往提升长期体验指标← 正确答案
- C.因为 CTR 是完全无关的指标
- D.因为重排只影响广告收入
答案:B。重排的核心价值在全局体验:多样性提升会降低内容扎堆带来的疲劳感,表现为负反馈率下降、人均时长上升、留存改善。这些长期体验指标比短期 CTR 更能反映用户满意度。
Q5. AB 实验中,判断 A/B 两组指标差异是否显著通常使用的指标是?
- A.z 值(Z-Score)← 正确答案
- B.内存使用率
- C.接口超时数
- D.日志文件大小
答案:A。AB 实验用 z 值判断两组均值差异的统计显著性,|z|>1.96 表示 95% 置信度下差异显著。其余选项是工程运维指标,与实验显著性判断无关。
Q6. 重排服务在工程上常用的性能优化手段有哪些?
- A.特征向量预计算并缓存← 正确答案
- B.用 ANN 索引加速相似度计算← 正确答案
- C.热门请求结果缓存 1-5 分钟← 正确答案
- D.用 Python 逐条循环计算相似度
答案:ABC。向量预计算、ANN 近似最近邻、结果缓存都是降低重排延迟的成熟工程手段。D 是反模式——Python 逐条循环会导致严重性能瓶颈,应使用向量化或并行计算。
Q7. 多样性惩罚中,滑动窗口方案与全局 MMR 的最大区别是?
- A.滑动窗口只检查与最近 K 个已选内容的相似度← 正确答案
- B.滑动窗口完全不考虑相关性
- C.滑动窗口能保证数学上全局最优
- D.滑动窗口不适合在线场景
答案:A。滑动窗口只对最近 K 条计算相似度惩罚,近似模拟用户的“近期记忆”,复杂度大幅降低且容易实现。它的代价是可能忽略远距离的重复,属于“局部多样性”而非全局最优。
Q8. 硬约束与软约束的主要区别是?
- A.硬约束不可违反,软约束尽量满足← 正确答案
- B.硬约束只用于离线,软约束只用于在线
- C.两者没有任何区别
- D.硬约束和软约束都是过滤条件
答案:A。硬约束是不可妥协的过滤条件(如下架商品必须移除),不满足就淘汰;软约束通过惩罚项参与目标函数优化(如同类内容连续出现 3 条以上扣分),不满足会降低分数但不会强制淘汰。
Q9. 重排目标函数通常需要权衡哪些因素?
- A.单条内容的相关性← 正确答案
- B.列表整体多样性← 正确答案
- C.业务规则的违规惩罚← 正确答案
- D.用户设备的屏幕分辨率
答案:ABC。重排目标 = 相关性收益 + 多样性贡献 − 业务约束惩罚。屏幕分辨率是前端渲染问题,与重排目标函数无关。
Q10. DPP(行列式点过程)相比 MMR 的优势是?
- A.计算速度更快
- B.能从全局概率角度建模多样性← 正确答案
- C.不需要相关性分数
- D.可以不使用特征向量
答案:B。DPP 通过核矩阵的行列式从全局概率分布角度建模多样性,能够捕捉集合级别的交互效应,而 MMR 是逐步贪心。但 DPP 精确求解复杂度高,工业界通常用贪心近似,并不能直接说它更快。