一、关于 NDCG

[LTR] 信息检索评价指标(RP/MAP/DCG/NDCG/RR/ERR)

二、代码实现

1、训练数据的加载解析

import scala.io.Source

/*
* 训练行数据
* */
case class TrainDataRow(target: Int, qid: Int, features: Array[Double]) object TrainDataRow {
// 加载文件数据
// 格式:
// <line> .=. <target> qid:<qid> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
// <target> .=. <positive integer>
// <qid> .=. <positive integer>
// <feature> .=. <positive integer>
// <value> .=. <float>
// <info> .=. <string>
def loadFile(file: String): List[TrainDataRow] = {
Source.fromFile(file).getLines.toList.par.map(x => {
val strArray = x.split(' ')
val label = strArray(0).toInt
val qid = strArray(1).split(':')(1).toInt
val fValArray = strArray.drop(2).map(x => x.split(':')(1).toDouble)
new TrainDataRow(label, qid, fValArray)
}).toList
}
}

2、NDCG 的实现

object NDCG {
/*
* 计算 NDCG 分值
* */
def score(rows: List[TrainDataRow], k: Int): Double = {
val size = k.min(rows.length - 1)
// 理想 DCG
var idealDcg: Double = 0
val sortedList = rows.sortWith((x, y) => x.target > y.target)
for (i <- 0 to size) {
// 计算累计效益
val gain = (1 << sortedList(i).target) - 1
// 计算折扣因子
val discount = 1.0 / (Math.log(i + 2) / Math.log(2))
idealDcg += gain * discount
}
if (idealDcg > 0) {
var dcg: Double = 0
for (i <- 0 to size) {
// 计算累计效益
val gain = (1 << rows(i).target) - 1
// 计算折扣因子
val discount = 1.0 / (Math.log(i + 2) / Math.log(2))
dcg += gain * discount
}
dcg / idealDcg
}
else 0
}
}

3、训练数据集的 NDCG 计算

def calcNDCG(trainDataFile: String, k: Int): Double = {
println("开始计算...")
val start = System.nanoTime()
val data = TrainDataRow.loadFile(trainDataFile) // 加载训练数据文件
println("数据量:" + data.length + ",用时:" + (System.nanoTime() - start) / 1000000 + " ms")
val grpData: Map[Int, List[TrainDataRow]] = data.groupBy(_.qid) // 根据 qid 分组
val resultNDCG = grpData.map(x => NDCG.score(x._2, k)).sum / grpData.size
println(s"NDCG@$k: $resultNDCG")
val end = System.nanoTime()
println("计算运行时间:" + (end - start) / 1000000 + " ms")
resultNDCG
}

by. Memento

[Scala] 实现 NDCG的更多相关文章

  1. Spark Streaming高级特性在NDCG计算实践

    从storm到spark streaming,再到flink,流式计算得到长足发展, 依托于spark平台的spark streaming走出了一条自己的路,其借鉴了spark批处理架构,通过批处理方 ...

  2. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  3. scala练习题1 基础知识

    1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等:     2,在scala REPL中,计算3的平方根,然 ...

  4. 牛顿法求平方根 scala

    你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...

  5. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  6. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  7. Scala快速概览

    IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...

  8. Scala Macros - scalamela 1.x,inline-meta annotations

    在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...

  9. Scala Macros - 元编程 Metaprogramming with Def Macros

    Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...

随机推荐

  1. Caused by: java.lang.ClassNotFoundException: org.hibernate.service.jta.platform.spi.JtaPlatform

    1.错误描述 2014-7-12 22:08:01 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema up ...

  2. Caused by:java.sql.SQLException:ORA-01008:并非所有变量都已绑定

    1.错误描述 Caused by:java.sql.SQLException:ORA-01008:并非所有变量都已绑定 2.错误原因 3.解决办法

  3. TreeNode.trage的使用

    对于trage的使用 msdn是这样解释的 TreeNode.Target 属性 .NET Framework 2.0 其他版本 注意:此属性在 .NET Framework 2.0 版中是新增的. ...

  4. Autofac高级用法之动态代理

    前言 Autofac的DynamicProxy来自老牌的Castle项目.DynamicProxy(以下称为动态代理)起作用主要是为我们的类生成一个代理类,这个代理类可以在我们调用原本类的方法之前,调 ...

  5. 【洛谷T7152】(考试题目)细胞

    题面 题目描述 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每天每个该细胞可以分裂出 x − 1 个新的细胞. 小 X 决定第 ...

  6. [BZOJ1000] A+B Problem

    Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 ...

  7. javascript 特殊的面向对象以及继承详解(入门篇)

    学习Javascript人,大多听说一句话叫js里面一切都是对象.我刚开始接触javascript面向对象编程时候,挺乱的,我当时习惯性的把PHP的面像对象思想套用在js上面,其实js的面向对象与传统 ...

  8. 漫谈PID——实现与调参

    闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...

  9. 杭电oj-1000-A+B

    Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to e ...

  10. Windows cmd命令反斜杠问题

    在Windows的终端输入命令的时候,如果在命令中存在斜杠就无法执行,因为它只支持反斜杠,而在Unix系统中是支持斜杠的,这是两者的区别.所以在Windows终端下执行命令需要注意斜杠问题