Hello!
Can you please tell me how to get the value of the Laplace function (standard normal distribution function) in python?
The laplace.pdf ()
function from scipy
gives the wrong value. The values do not match the tabular values of the Laplace integral function:
Answer 1, authority 100%
Found: the values of the mentioned table are given by the function scipy.stats.norm.cdf (x) - 0.5
. Only now, in my opinion, it has nothing to do with Laplace, because it is an integral of the usual Gaussian distribution.
Answer 2, authority 50%
Google suggests that math.erf (x)
Answer 3, authority 25%
scipy.stats.norm.cdf (x)
Gives the integral of the density distribution. In fact, it is the Laplace function. This is the integral from minus infinity to x. It’s called cdf.
The tables use the normalized Laplace function, which (as already noted) is equal to the usual function minus 0.5. It represents the integral from 0 to x.
Here is the conclusion from the book Written by D.T. Lecture notes on probability theory, mathematical statistics and stochastic processes:
This explains why you need to subtract 0.5. After all, the integral of the entire probability density is equal to one. And it is symmetrical. And the negative part is exactly 0.5.
You can also use erf. It is linked to cdf (see Wikipedia article ).
And this answer gave me the ability to speed up cdf even more than scipy.
In my project, I also hang up jit compilation. And it comes out twice as fast as cdf. (Normal (0,1), x)
on Julia. As a result, the speedup in comparison with scipy was 10 times.
My implementation is shown below. Unfortunately, it lacks input validation, so provide it yourself.
@ nb.njit (cache = True)
def cdf (x):
"" "
Calculation of the Laplace function.
Attention! Disabled border check
"" "
x = x / 1.414213562
a1 = 0.254829592
a2 = -0.284496736
a3 = 1.421413741
a4 = -1.453152027
a5 = 1.061405429
p = 0.3275911
s = np.sign (x)
t = 1 / (1 + s * p * x)
b = np.exp (-x * x)
y = (s * s + s) / 2 - \
s * (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * b / 2
return y