[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 ...
随机推荐
- jquery.lazyload.js实现图片懒加载
个人理解:将需要延迟加载的图片的src属性全部设置为一张相同尽可能小(目的是尽可能的少占宽带,节省流量,由于缓存机制,当浏览器加载了一张图片之后,相同的图片就会在缓存中拿,不会重新到服务器上拿)的图片 ...
- oracle 常用知识积累
一. 基本操作 1. 表操作 1.1 复制建表 create table test as select * from dept; --从已知表复制数据和结构 create table test a ...
- java实现取球类的博弈问题
1.问题描述: 今盒子中有n个小球,A,B两人轮流从盒子中取球,每个人都可以看到对方的取球数目. 规定如下: 取球只能取1,3,7,8四种情况.如果没有球取了,则输了.规定A先取球,给定初始球的数目, ...
- json 的循环输出
json不能用for-of循环,会报错 可以用for-in循环: var json = {'a':'apple','b':'banana','c':'orange','d':'pear'}; for( ...
- Labview中嵌入flex/flash
将flash动画作为ActiveX文档插入LabVIEW程序的前面板的方法 (1)在前面板插入Controls的ActiveX Container控件. (2)在Container控件上单击鼠标右键, ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【Luogu3806】点分治(点分治)
[Luogu3806]点分治(点分治) 题面 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行 ...
- Vue-开发工具的安装
1. github官网下载vue工具:https://github.com/vuejs/vue-devtools.并解压 2. 在有package.json的文件夹下,按住shift右键,选择&qu ...
- 22.jQuery(实例)
1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- RHEL7 网卡绑定
//bond(主要用于6系统) nmcli connection add type bond mode balance-rr con-name bond0 ifname bond0 ipv4.met ...