# 💡 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 更全面!