如何在scala中实现Python的norm.expect

时间:2018-05-02 18:04:37

标签: python scala scipy scala-breeze

我正在尝试在scala中实现这个python函数。有人可以帮忙吗?

Python代码是:

from scipy.stats import norm
import numpy as np
def expected_spend(mu,sigma,cl):
    return norm.expect(lambda x: np.minimum(x,cl),lb=0,ub=np.inf,loc=mu,scale=sigma)

我无法访问scala中的许多外部库,我正在尝试使用Breeze实现它,但欢迎任何开源库建议。

1 个答案:

答案 0 :(得分:2)

我找到了更多的数学答案。

from scipy.stats import norm
import numpy as np
def expected_spend(mu,sigma,cl):
    return norm.expect(lambda x: 
    np.minimum(x,cl),lb=0,ub=np.inf,loc=mu,scale=sigma)

可以重写为正态分布的两个积分。积分的解决方案发布在这里:https://www.quora.com/How-do-I-evaluate-int_0-infty-frac-min-x-z-exp-frac-x-mu-2-2-sigma-2-sqrt-2-pi-sigma-dx?filter&nsrc=2&snid3=2409997057

因此使用Breeze的scala解决方案是:

 import breeze.math._
 import breeze.numerics._
 import breeze.numerics.constants.Pi
 val min_a_b_gaussian = (mu: Float, sigma: Float, CL: Float) => {
   val CL2 = CL / ( sqrt(2) * sigma )
   val mu2 = mu / ( sqrt(2) * sigma )
   val result = (sigma / sqrt(2) )*((1/sqrt(Pi)) * ( exp(-1*mu2*mu2) - exp(-1*(CL2 - mu2)*(CL2 - mu2)) ) - (CL2 - mu2)*erf(CL2 - mu2) + CL2 + mu2*erf(mu2) )
   result
}