# 💡 Summary 核心问题 **"Top-K 结果的整体质量如何?考虑相关性程度和位置"** # 🧩 Cues # 🪞Notes ## NDCG@K(Normalized Discounted Cumulative Gain) ### 通俗解释 [[MRR(Mean Reciprocal Rank)- 平均倒数排名]] 只看"第一个对不对",但现实中: 1. **不止一个正确答案**(成都旅游攻略有很多篇好文章) 2. **相关性有程度差异**(非常相关 vs 一般相关) 3. **位置很重要**(排第1位的影响大于排第10位的) NDCG 就是解决这些问题的! --- ### 分步理解 #### 步骤1:定义相关性等级 ``` 相关性评分(人工标注或真实行为数据): 0 = 完全不相关 1 = 稍微相关 2 = 相关 3 = 非常相关 4 = 完美匹配 ``` #### 步骤2:计算 CG(Cumulative Gain)- 累积增益 **就是把所有相关性分数加起来** ``` 查询:"成都3天游" 系统返回: 位置1: 成都3天攻略 → 相关性 4 位置2: 成都美食推荐 → 相关性 2 位置3: 北京旅游 → 相关性 0 位置4: 成都7天游 → 相关性 1 位置5: 成都住宿 → 相关性 3 CG@5 = 4 + 2 + 0 + 1 + 3 = 10 ``` **问题**:没考虑位置!排第1和排第5的分数一样? --- #### 步骤3:计算 DCG(Discounted CG)- 折损累积增益 **越靠后的结果,权重越小(折扣)** ``` DCG = Σ (相关性ᵢ / log₂(位置ᵢ + 1)) DCG@5 = 4/log₂(2) + 2/log₂(3) + 0/log₂(4) + 1/log₂(5) + 3/log₂(6) = 4/1 + 2/1.58 + 0/2 + 1/2.32 + 3/2.58 = 4.0 + 1.26 + 0 + 0.43 + 1.16 = 6.85 ``` **解读**: - 位置1的权重 = 1.0(完全计分) - 位置2的权重 = 0.63(打6.3折) - 位置3的权重 = 0.5(打5折) - 位置5的权重 = 0.39(打4折) --- #### 步骤4:计算 IDCG(Ideal DCG)- 理想 DCG **如果排序完美,应该得到的最高分** ``` 理想排序(相关性从高到低): 位置1: 4 → DCG贡献 4/log₂(2) = 4.0 位置2: 3 → DCG贡献 3/log₂(3) = 1.89 位置3: 2 → DCG贡献 2/log₂(4) = 1.0 位置4: 1 → DCG贡献 1/log₂(5) = 0.43 位置5: 0 → DCG贡献 0/log₂(6) = 0 IDCG@5 = 4.0 + 1.89 + 1.0 + 0.43 + 0 = 7.32 ``` --- #### 步骤5:计算 NDCG(归一化) ``` NDCG@5 = DCG@5 / IDCG@5 = 6.85 / 7.32 = 0.936 NDCG 范围: 0-1 1.0 = 完美排序 0.0 = 完全错误 ``` --- ### 完整例子 #### 查询:"成都美食推荐" **系统返回(Top 5):** | 位置 | 标题 | 真实相关性 | DCG 贡献 | |-----|------|-----------|---------| | 1 | 成都火锅大全 | 4 | 4.0/1 = 4.0 | | 2 | 重庆火锅 | 1 | 1.0/1.58 = 0.63 | | 3 | 成都小吃街 | 3 | 3.0/2 = 1.5 | | 4 | 成都美食地图 | 4 | 4.0/2.32 = 1.72 | | 5 | 北京烤鸭 | 0 | 0/2.58 = 0 | ``` DCG@5 = 4.0 + 0.63 + 1.5 + 1.72 + 0 = 7.85 ``` **理想排序(相关性降序):** | 位置 | 相关性 | IDCG 贡献 | |-----|--------|----------| | 1 | 4 | 4.0 | | 2 | 4 | 2.52 | | 3 | 3 | 1.5 | | 4 | 1 | 0.43 | | 5 | 0 | 0 | ``` IDCG@5 = 4.0 + 2.52 + 1.5 + 0.43 + 0 = 8.45 NDCG@5 = 7.85 / 8.45 = 0.929 ``` **解读**:系统做得很好(93%),但不完美 **问题**:把一个4分的结果排到了第4位(应该在前2位) --- ### NDCG 的含义 | NDCG@10 | 含义 | 用户体验 | |---------|------|---------| | **0.9-1.0** | 几乎完美排序 | 优秀 ⭐⭐⭐⭐⭐ | | **0.8-0.9** | 好内容基本在前面 | 良好 ⭐⭐⭐⭐ | | **0.7-0.8** | 有些好内容位置不佳 | 一般 ⭐⭐⭐ | | **0.6-0.7** | 排序问题较大 | 差 ⭐⭐ | | **< 0.6** | 排序很糟糕 | 很差 ⭐ | --- ### NDCG 的特点 #### ✅ 优点 1. **考虑全部结果**:不只看第一个 2. **支持多级相关性**:0-4分,更细致 3. **位置敏感**:越靠前越重要(符合用户行为) 4. **归一化**:不同查询可比较 #### ❌ 缺点 1. **需要人工标注**:每个结果要打分(成本高) 2. **计算复杂**:比 MRR 复杂得多 3. **标注主观**:不同标注者可能打分不一致 --- ## MRR vs NDCG 对比 ### 对比表 | 维度 | MRR | NDCG | |------|-----|------| | **关注点** | 第一个正确答案的位置 | 整体排序质量 | | **相关性** | 二元(对/错) | 多级(0-4分) | | **计算复杂度** | 简单 | 复杂 | | **标注成本** | 低(只判断对错) | 高(需要打分) | | **适用场景** | 单答案问题 | 信息检索、推荐 | --- ### 实际例子对比 #### 场景:"成都旅游攻略" **系统A 返回:** ``` 1. 成都3天游攻略(完美匹配)✅ 相关性4 2. 成都美食推荐(相关)✅ 相关性2 3. 成都交通指南(相关)✅ 相关性2 4. 成都住宿推荐(相关)✅ 相关性2 5. 成都历史文化(稍微相关)✅ 相关性1 MRR = 1/1 = 1.0 ✅ 完美(第1个就对) NDCG@5 = 0.95 ✅ 优秀(排序很好) ``` **系统B 返回:** ``` 1. 成都3天游攻略(完美匹配)✅ 相关性4 2. 北京旅游 ❌ 相关性0 3. 上海攻略 ❌ 相关性0 4. 广州美食 ❌ 相关性0 5. 深圳购物 ❌ 相关性0 MRR = 1/1 = 1.0 ✅ 完美(第1个就对) NDCG@5 = 0.55 ❌ 差(只有第1个好) ```` **结论**: - **MRR 看不出区别**(都是1.0) - **NDCG 能区分**(0.95 vs 0.55) → NDCG 更全面!