Normalized Discounted Cumulative Gain(归一化折损累计增益)
NDCG用作排序结果的评价指标,评价排序的准确性。
推荐系统通常为某用户返回一个item列表,假设列表长度为K,这时可以用NDCG@K评价该排序列表与用户真实交互列表的差距。
解释
增益(Gain)
表示列表中每一个item的相关性分数。
在推荐系统中,推荐列表中第\(i\)个物品是用户喜欢的,则\(rel_{i}=1\),否则\(rel_{i}=0\)
累计增益(Cumulative Gain)
表示对K个item的Gain进行累加。
折损累计增益(Discounted Cumulative Gain)
考虑排序顺序的因素,使得排名靠前的item增益更高,对排名靠后的item进行折损。
归一化折损累计增益(Normalized Discounted Cumulative Gain)
DCG能够对一个用户的推荐列表进行评价,如果用该指标评价某个推荐算法,需要对所有用户的推荐列表进行评价,由于用户真实列表长度不同,不同用户之间的DCG相比没有意义。所以要对不同用户的指标进行归一化,自然的想法就是计算每个用户真实列表的DCG分数,用IDCG表示,然后用每个用户的DCG与IDCG之比作为每个用户归一化后的分值,最后对每个用户取平均得到最终的分值,即NDCG。
示例
用户 | 真实值 | 推荐列表 |
---|---|---|
A | 12 | [3,10,15,12,17] |
B | 3 | [20,15,18,14,30] |
C | 5 | [2,5,7,8,15] |
D | 14 | [56,14,25,12,19] |
E | 20 | [21,24,36,54,45] |
代码
import math
# 推荐列表
R = [[3, 10, 15, 12, 17],
[20, 15, 18, 14, 30],
[2, 5, 7, 8, 15],
[56, 14, 25, 12, 19],
[21,24,36,54,45]]
# 用户访问列表
T=[[12], [3], [5], [14], [20]]
def indicators_5(rankedList, testList):
Len_T = len(testList)
NDCG_i = 0
for i in range(len(rankedList)):
for j in range(len(rankedList[i])):
if testList[i][0] == rankedList[i][j]:
# 注意j的取值从0开始
NDCG_i+=1/(math.log2(1+j+1))
break
NDCG_i /= Len_T
print(f'NDCG@5={NDCG_i}')
if __name__ == '__main__':
indicators_5(R, T)
NDCG的局限性 (Limitations of NDCG)
(来源:维基百科)
-
The NDCG does not penalize for bad documents in the results
NDCG不会对结果中的不良文件进行处罚 -
Does not penalize missing documents in the results
不惩罚结果中缺少的文件 -
May not be suitable to measure performance of queiries that may often have several equally good results
可能不适合测量可能经常具有几个同样好的结果的查询的性能
直接摘抄的,具体在推荐系统中的含义我也不知道