推荐系统评价指标——(归一化折损累计增益)NDCG

Posted on 2021-11-13 23:54  foghorn  阅读(2432)  评论(0编辑  收藏  举报

Normalized Discounted Cumulative Gain(归一化折损累计增益)

NDCG用作排序结果的评价指标,评价排序的准确性。

推荐系统通常为某用户返回一个item列表,假设列表长度为K,这时可以用NDCG@K评价该排序列表与用户真实交互列表的差距。

解释

增益(Gain)

表示列表中每一个item的相关性分数。

\[Gain(i) = rel(i) \]

在推荐系统中,推荐列表中第\(i\)个物品是用户喜欢的,则\(rel_{i}=1\),否则\(rel_{i}=0\)

累计增益(Cumulative Gain)

表示对K个item的Gain进行累加。

\[CG@K=\sum_{i=1}^{K}rel_{i} \]

折损累计增益(Discounted Cumulative Gain)

考虑排序顺序的因素,使得排名靠前的item增益更高,对排名靠后的item进行折损。

\[DCG@K=\sum_{i=1}^{K}\frac{rel_{i}}{log_{2}(i+1)} \]

归一化折损累计增益(Normalized Discounted Cumulative Gain)

DCG能够对一个用户的推荐列表进行评价,如果用该指标评价某个推荐算法,需要对所有用户的推荐列表进行评价,由于用户真实列表长度不同,不同用户之间的DCG相比没有意义。所以要对不同用户的指标进行归一化,自然的想法就是计算每个用户真实列表的DCG分数,用IDCG表示,然后用每个用户的DCG与IDCG之比作为每个用户归一化后的分值,最后对每个用户取平均得到最终的分值,即NDCG。

\[NDCG_{u}@K=\frac{DCG_{u}@K}{IDCG_{u}} \]

\[NDCG@K=\frac{NDCG_{u}@K}{\left | u \right |} \]

示例

用户 真实值 推荐列表
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
    可能不适合测量可能经常具有几个同样好的结果的查询的性能

直接摘抄的,具体在推荐系统中的含义我也不知道

参考

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes