首页 > 解决方案 > 如何在 Scala 中实现 Python 的 norm.expect

问题描述

我正在尝试在 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 来实现它,但是欢迎任何开源库推荐。

标签: pythonscalascipyscala-breeze

解决方案


我找到了一个更数学的答案。这

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-xz-exp-frac-x-mu-2-2- sigma-2-sqrt-2-pi-sigma-dx?过滤器& nsrc =2& snid3 =2409997057

所以在 Scala 中使用 Breeze 的解决方案是:

 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
}

推荐阅读