как реализовать Python norm.expect в Scala - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь реализовать эту функцию Python в Scala. Может кто-нибудь помочь?

Код 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 голосов
/ 03 мая 2018

Я нашел более математический ответ.

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

Итак, решение в 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
}
...