我正在尝试在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实现它,但欢迎任何开源库建议。
答案 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
}