[Scala] 实现 NDCG
一、关于 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的更多相关文章
- Spark Streaming高级特性在NDCG计算实践
从storm到spark streaming,再到flink,流式计算得到长足发展, 依托于spark平台的spark streaming走出了一条自己的路,其借鉴了spark批处理架构,通过批处理方 ...
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
随机推荐
- 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(一)
利用PowerDesigner15在win7系统下对MySQL 进行反向工程 1.首先,安装以下的驱动 2.找到"C:\Windows\System32" 3.双击"od ...
- Linux查看网络的联机状态
Linux查看网络的联机状态 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ netstat -a^C unix 3 [ ] 流 已连接 14923 @/tmp ...
- raid功能中spanning和striping模式有什么区别?
RAID 0 又称为Stripe(条带化,串列)或Striping 它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可 ...
- html中的块元素和内联元素的区别
一.定义 块元素一般都从新行开始,它可以容纳内联元素和其他块元素,可设置高度.宽度和边距等. 内联元素一般都是基于语义级的基本元素,它只能容纳文本或其他内联元素,主要特点是:和其他元素位于同一行上,高 ...
- 异常-----The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。
1, 找到新建页面所在的工程名字,然后左键选中,右键弹出功能菜单,选择Build Path,进入配置路径. 2, 在java build path 页面的下选择Libraries栏目(默认选择),点击 ...
- Hibernate【与Spring整合】
前言 前面已经学习了如何使用Spring与Struts2进行整合,本博文主要讲解如何使用Spring对Hibernate进行整合 Spring和Hibernate整合的关键点: SessionFact ...
- [APIO2009]会议中心
[APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...
- [SDOI2012]Longge的问题
题目大意: 网址:https://www.luogu.org/problemnew/show/P2303 大意:给定一个N,求\(\Sigma_{i=1}^N gcd(i, N);\). 题目解法: ...
- 【Luogu3455】【POI2007】ZAP-Queries(莫比乌斯反演)
[Luogu3455][POI2007]ZAP-Queries(莫比乌斯反演) 题面 题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x ...
- 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...