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. 特征 ...
随机推荐
- 团队作业10——事后分析(Beta版本)
团队作业10--事后分析(Beta版本) 目录 一.设想与目标 二.计划 三.资源 四.变更管理 五.设计与实现 六.测试与发布 七.总结 八.图片和贡献分分配 一.设想和目标 1.我们的软件要解决什 ...
- 基于GUI的四则运算
基于GUI的四则运算 李志强 201421123028 连永刚 201421123014 林方言 201421123023 coding 地址 https://git.coding.net/lizhi ...
- 201521123029《java程序设计》第2周学习总结
1. 本周学习总结 (1)完成了课后习题,对所学知识进一步巩固. (2)学会了JAVA中的选择结构,循环结构,其中条件必须为布尔表达式,与C++非0即真不同. (3)学会java中的break和con ...
- Java课程设计 购物车系统(个人博客) 201521123052 蓝锦明
1. 团队课程设计博客链接 课程设计团队博客 2. 个人负责模块或任务说明 (1)制作图形菜单引导界面 (2)定义各获取和输出类函数 3. 自己的代码提交记录截图 4. 自己负责模块或任务详细说明 i ...
- 201521123114 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.数据库的定义:是为了实现一定目的按某种规则组织起来的"数据"的"集合" ...
- 201521123030 《Java程序设计》 第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123087《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 finally题目4-21.1 截图你的提交结果(出现学号)1.2 4-2中finally中捕获异常需要注意什么? 用异常改进Arr ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- CSS3滤镜(filter--CSS3技术
filter 属性定义了元素(通常是<img>)的可视效果,例如图片的模糊.饱和度.灰度等……个人感觉功能很强大 1.filter的语法 filter: none | blur() | b ...
- Hibernate第十一篇【配置C3P0数据库连接池、线程Session】
Hibernate连接池 Hibernate自带了连接池,但是呢,该连接池比较简单..而Hibernate又对C3P0这个连接池支持-因此我们来更换Hibernate连接池为C3P0 查看Hibern ...