Scala-Spark digamma stackoverflow问题
这两天在用spark做点击率的贝叶斯平滑,参考雅虎的论文进行了一番尝试。
先上代码:
# click_count, show_count # this method takes time
def do_smooth(data_list):
import scipy.special as sp
a, b, i = 1.0, 1.0, 0
da, db = a, b
while i < 1000 and (da > 1.0E-10 or db > 1.0E-10):
x1, y1, x2 = 0.0, 0.0, 0.0
for lineList in data_list:
x1 += sp.digamma((lineList[0]) + a) - sp.digamma(a)
y1 += sp.digamma((lineList[1]) + a + b) - sp.digamma(a + b)
x2 += sp.digamma((lineList[1]) - (lineList[0]) + b) - sp.digamma(b)
na, nb = a, b
a *= (x1 / y1)
b *= (x2 / y1)
da, db = abs(a - na), abs(b - nb)
i += 1
print i, a, b
return a, b
这是我之前用的python代码,改成scala也相当容易,digamma函数非常耗时,而且还要迭代1000次。最要命的是digamma在scala里面默认的实现会出现栈溢出!!!
var a, b, da, db: Double = 1.0
var index = 0
while (index < 1000 && (da > 1.0E-9 || db > 1.0E-9)) {
var x1,x2,y1 = 0.0
traindata.foreach(p => {
x1 += MBlas.digamma(p(2) + a) - MBlas.digamma(a)
y1 += MBlas.digamma(p(1) + a + b) - MBlas.digamma(a + b)
x2 += MBlas.digamma(p(1) - p(2) + b) - MBlas.digamma(b)
val na = a
val nb = b
a *= (x1 / y1)
b *= (x2 / y1)
da = Math.abs(a - na)
db = Math.abs(b - nb)
})
}
digamma 函数是个递归函数,问题就处在递归上了。
public static double digamma(double x) {
if (x > 0 && x <= S_LIMIT) {
return -GAMMA - 1 / x;
}
if (x >= C_LIMIT) {
double inv = 1 / (x * x);
return FastMath.log(x) - 0.5 / x - inv * ((1.0 / 12) + inv * (1.0 / 120 - inv / 252));
}
return digamma(x + 1) - 1 / x;
}
既然知道问题所在,是不是就可以重写递归为非递归呢?在Stack Overflow上找到了一个答案
val GAMMA = 0.577215664901532860606512090082
val GAMMA_MINX = 1.e-12
val DIGAMMA_MINNEGX = -1250
val C_LIMIT = 49
val S_LIMIT = 1e-5
var value = 0.0
var x = input
while (true) {
if (x >= 0 && x < GAMMA_MINX) x = GAMMA_MINX
if (x < DIGAMMA_MINNEGX) {
x = DIGAMMA_MINNEGX + GAMMA_MINX
} else {
if (x > 0 && x <= S_LIMIT) return value + -GAMMA - 1 / x
if (x >= C_LIMIT) {
val inv = 1 / (x * x)
return value + Math.log(x) - 0.5 / x - inv * ((1.0 / 12) + inv * (1.0 / 120 - inv / 252))
}
value = value - 1.0 / x
x += 1
}
}
经测试,没看出什么问题,可以用了。
不过,上面的代码并没有解决慢的问题,当需要计算CTR的对象比较多时(几百万),仍然比较耗时。所以我决定用两个替代方法:
- 抽样,抽取能在可接受时间内出结果的样本数,得到α和β;
- 直接使用平均值作为α和β
- 使用平均值做迭代初值(推荐)
Scala-Spark digamma stackoverflow问题的更多相关文章
- brdd 惰性执行 mapreduce 提取指定类型值 WebUi 作业信息 全局临时视图 pyspark scala spark 安装
[rdd 惰性执行] 为了提高计算效率 spark 采用了哪些机制 1-rdd 基于分布式内存数据集进行运算 2-lazy evaluation :惰性执行,即rdd的变换操作并不是在运行该代码时立 ...
- Eclipse+maven+scala+spark环境搭建
准备条件 我用的Eclipse版本 Eclipse Java EE IDE for Web Developers. Version: Luna Release (4.4.0) 我用的是Eclipse ...
- 在IntelliJ IDEA中创建和运行java/scala/spark程序
本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spark程序 基本概念介 ...
- eclipse构建maven+scala+spark工程 转载
转载地址:http://jingpin.jikexueyuan.com/article/47043.html 本文先叙述如何配置eclipse中maven+scala的开发环境,之后,叙述如何实现sp ...
- Windows下Eclipse+Scala+Spark开发环境搭建
1.安装JDK及配置java环境变量 本文使用版本为jdk1.7.0_79,过程略 2.安装scala 本文使用版本为2.11.8,过程略 3.安装spark 本文使用版本为spark-2.0.1-b ...
- Scala - Spark Lambda“goesto“ => 分析
/// 定义一个函数AddNoise,参数分别为rdd,Fraction.其中rdd为(BreezeDenseMatrix, BreezeDenseMatrix)元组构成的RDD.Fraction为一 ...
- Eclipse + Idea + Maven + Scala + Spark +sbt
http://jingpin.jikexueyuan.com/article/47043.html 新的scala 编译器idea使用 https://www.jetbrains.com/idea/h ...
- eclipse构建maven+scala+spark工程
前提条件 下载安装Scala IDE build of Eclipse SDK 构建工程 1.新建maven工程 2.配置项目信息 3.新建scala对应的Source Folder 4.添加scal ...
- scala spark 机器学习初探
Transformer: 是一个抽象类包含特征转换器, 和最终的学习模型, 需要实现transformer方法 通常transformer为一个RDD增加若干列, 最终转化成另一个RDD, 1. 特征 ...
随机推荐
- 201521123034《Java程序设计》第八周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 答:这题是在课堂上 ...
- 201521123045 《Java程序设计》第8周学习总结
第08周-集合与泛型 1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1)1.1 实验总结 答: Scanner实现字符串的输入有两种方法,一种是next(),一种nextL ...
- 201521123105 第8周Java学习总结
1.本周学习总结 1.1思维导图 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 1.删除元素的时候从最后一个元素开始,避免删除元素后位置发生变化而导致 ...
- 201521123062《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...
- 201521123080《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...
- 201521123092,《java程序设计》第1周学习总结
1.本周学习总结 这一周是我学习java的第一周,刚接触一门全新的编程语言,觉得还是有点困难的,很多基础性的java知识需要一点点学习,我会请教同学以及查询网上的学习资料,认真学好这一门学科. 本周学 ...
- Java课程设计 购物车系统(个人博客) 201521123052 蓝锦明
1. 团队课程设计博客链接 课程设计团队博客 2. 个人负责模块或任务说明 (1)制作图形菜单引导界面 (2)定义各获取和输出类函数 3. 自己的代码提交记录截图 4. 自己负责模块或任务详细说明 i ...
- JavaSE(十)之Collection总结
前面几篇把集合中的知识大概都详细的说了一遍,但是我觉得还是要总结一下,这样的话,可以更好的理解集合. 一.Collection接口 首先我们要一张图来说明: Collection接口,它是集合的顶层接 ...
- JavaEE error整理(不断更新)
该文章用于整理开发中遇到的一些错误,及解决方法,不断整理更新. 1. 缺包异常 异常1:java.lang.NoClassDefFoundError: org/apache/commons/loggi ...
- 解决在Ubuntu终端下使用cURL获取GBK格式的页面出现乱码问题
问题描述 在Ubuntu下使用终端使用cURL去拿一个GBK的页面,发现返回来的内容里面中文都是乱码 解决方法 通过iconv来处理乱码拿到的内容,进行转码,示例如下: $curl http://ww ...