推荐系统测评指标——计算DCG、IDCG以及nDCG的python代码

简介: 推荐系统测评指标——计算DCG、IDCG以及nDCG的python代码

1. 公式


DCG


image.png


其中, K是推荐列表的大小;

i 是指推荐列表中的第 i i i个推荐项; 是指推荐项 i i i 是否被用户点击,若点击则为 1 1 1,否则为 0 0 0,在实际测试中,我们通常吧推荐列表中在测试集的推荐项视为被用户点击的推荐项,不在测试集中的推荐项视为未被用户点击的推荐项;


IDCG:


image.png


注意到IDCG的计算公式与DCG一致,区别在于IDCG是完美的DCG,也即 r i = 1 r_i=1 r

i =1的推荐项在推荐列表 K K K头部, r i = 0 r_i=0 r i =0的推荐项在推荐列表 K K K的末尾。


nDCG:


image.png


NDCG是归一化后的DCG


2. 代码


import numpy as np
def DCG(A, test_set):
    # ------ 计算 DCG ------ #
    dcg = 0
    for i in range(len(A)):
        # 给r_i赋值,若r_i在测试集中则为1,否则为0
        r_i = 0
        if A[i] in test_set:
            r_i = 1
        dcg += (2 ** r_i - 1) / np.log2((i + 1) + 1) # (i+1)是因为下标从0开始
    return dcg
def IDCG(A, test_set):
    # ------ 将在测试中的a排到前面去,然后再计算DCG ------ #
    A_temp_1 = [] # 临时A,用于存储r_i为1的a
    A_temp_0 = []  # 临时A,用于存储r_i为0的a
    for a in A:
        if a in test_set:
            # 若a在测试集中则追加到A_temp_1中
            A_temp_1.append(a)
        else:
            # 若a不在测试集中则追加到A_temp_0中
            A_temp_0.append(a)
    A_temp_1.extend(A_temp_0)
    idcg = DCG(A_temp_1, test_set)
    return idcg
def NDCG(A, test_set):
    dcg = DCG(A, test_set) # 计算DCG
    idcg = IDCG(A, test_set) # 计算IDCG
    if dcg == 0 or idcg == 0:
        ndcg = 0
    else:
        ndcg = dcg / idcg
    return ndcg
if __name__ == "__main__":
  # ------ 计算推荐列表A的NDCG ------ #
  # A:推荐列表,一维list,存储了推荐算法推荐出的推荐项的id
  # test_set:测试集,一维list,存储了测试集推荐项的id
    ndcg_A = NDCG(A, test_set)
相关文章
|
1天前
|
安全 网络安全 开发者
探索Python中的装饰器:简化代码,增强功能网络安全与信息安全:从漏洞到防护
【8月更文挑战第30天】本文通过深入浅出的方式介绍了Python中装饰器的概念、用法和高级应用。我们将从基础的装饰器定义开始,逐步深入到如何利用装饰器来改进代码结构,最后探讨其在Web框架中的应用。适合有一定Python基础的开发者阅读,旨在帮助读者更好地理解并运用装饰器来优化他们的代码。
|
1天前
|
机器学习/深度学习 数据采集 自然语言处理
使用Python进行简单文本分类探索Python中的装饰器:简化代码,提升效率
【8月更文挑战第30天】本文将介绍如何利用Python和scikit-learn库实现基础的文本分类。我们将从数据预处理开始,逐步构建一个文本分类模型,并讨论评估模型性能的不同指标。文章旨在为初学者提供一个清晰的指南,帮助他们理解并实现自己的文本分类项目。
|
1天前
|
数据采集 数据可视化 数据挖掘
探索Python编程的奥秘:从基础到进阶Python中的装饰器:简化代码,提升效率
【8月更文挑战第30天】在这个数字技术飞速发展的时代,掌握一门编程语言已经成为了许多人追求的目标。Python,作为一门易于学习且功能强大的编程语言,吸引了无数初学者和专业人士的目光。本文将带领读者从Python的基础语法出发,逐步深入到函数、模块、面向对象编程等高级特性,最后通过实际案例展示Python在数据分析和网络爬虫领域的应用。无论你是编程新手还是希望提升自己的Python技能,这篇文章都将为你打开一扇通往Python世界的大门。
|
1天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析的新手指南深入浅出操作系统:从理论到代码实践
【8月更文挑战第30天】在数据驱动的世界中,掌握数据分析技能变得越来越重要。本文将引导你通过Python这门强大的编程语言来探索数据分析的世界。我们将从安装必要的软件包开始,逐步学习如何导入和清洗数据,以及如何使用Pandas库进行数据操作。文章最后会介绍如何使用Matplotlib和Seaborn库来绘制数据图表,帮助你以视觉方式理解数据。无论你是编程新手还是有经验的开发者,这篇文章都将为你打开数据分析的大门。
|
1天前
|
算法 数据挖掘 开发者
探索编程之美:从小白到大牛的代码之旅从零到一:我的Python编程之旅
【8月更文挑战第30天】在数字世界的编织中,代码是构成一切的基石。本文将带领读者踏上一段代码探索之旅,从最初的迷茫与困惑,到逐渐找到方向,再到深入理解编程的本质和美学。通过个人的技术感悟和成长历程,我们将一同见证如何通过持续学习、实践和创新,在编程的道路上越走越远。
|
1天前
|
设计模式 开发者 Python
探索Python中的装饰器:简化代码的魔法
【8月更文挑战第30天】在编程的世界里,我们追求的不仅是解决问题,还有优雅的解决方案。Python装饰器正是这样一把钥匙,它打开了简化和优化代码的大门。本文将带领你一探究竟,通过直观的例子,我们将揭开装饰器的神秘面纱,并学会如何运用它们来提升我们的编码效率。
|
2天前
|
Rust IDE 开发工具
如何写出“高颜值”的Python代码
如何写出“高颜值”的Python代码
|
4月前
|
算法 Python Java
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
68 0
Python每日一练(20230426) 删除重复字符、颜色分类、计算圆周率
|
Python
Python计算圆周率
Python计算圆周率
94 0
|
Python
用python采用蒙特卡洛模拟计算圆周率--学习笔记15
用python采用蒙特卡洛模拟计算圆周率--学习笔记15
129 0
下一篇
云函数