[erlang-questions] Gaussian Distribution

Frank Recker <>
Thu Nov 1 18:54:02 CET 2012


I agree. And I frankly can hardly see a reason why math:erf/1 is not
available under windows.

Frank

On Wed, October 31, 2012 19:35, Robert Virding wrote:
> Maybe if we were just looking at your case this would be overkill. But
in
> general I think it would be reasonable to expect library modules to
behave
> the same in all releases, at least when they are not doing something OS
specific. Which is not being done here.
> Robert
> ----- Original Message -----
>> From: "Frank Recker" <>
>> To: 
>> Sent: Monday, 29 October, 2012 8:52:55 AM
>> Subject: Re: [erlang-questions] Gaussian Distribution
>> Sorry, but I don't overlook the ramifications of this approach. My feeling
>> is that it might be what we call in german "mit Kanon auf Spatzen
schiessen" (dict.leo.org translates this to "to crack a nut with a
sledgehammer").
>> Frank
>> On Mon, October 29, 2012 14:10, Robert Virding wrote:
>> > Wouldn't a better solution be to have a BEAM implementation of the error
>> > function implemented when it doesn't occur in the system math library so
>> > that the math module always provides this function?
>> > Robert
>> > ----- Original Message -----
>> >> From: "Frank Recker" <>
>> >> To: 
>> >> Sent: Monday, 29 October, 2012 3:59:58 AM
>> >> Subject: Re: [erlang-questions] Gaussian Distribution
>> >> Your points are correct, but I had reasons for my design choices. -
math:erf/1 was not available in my windows version of erlang - under
linux math:erf/1 delivers the value 1 for large x (x>7), which is
>> >> problematic. The exact value is always in the open interval
>> >> (-1,1).
>> >> - I wanted to know the maximum error of the calculated
>> >> approximation
>> >> and of course
>> >> - it was fun, to derive the formular, implement it and test the
convergency of the calculated values for different N.
>> >> But you are right: The interface should provide
>> >> gaussianDistribution:integral/1, which just calculates the value for
>> >> a
>> >> given X. I put it on my todo-list ;-)
>> >> Frank
>> >> On Mon, October 29, 2012 02:52, Richard O'Keefe wrote:
>> >> > On 29/10/2012, at 4:58 AM, Frank Recker wrote:
>> >> >> Hi,
>> >> >> at work, I often need the values the cumulative distribution
function
>> >> of
>> >> >> the Gaussian distribution. The code for this function in
>> >> >> haskell,
>> >> erlang
>> >> >> and perl and the corresponding mathematical paper can be found at
>> >> git://github.com/frecker/gaussian-distribution.git .
>> >> > There's something good about that interface, and something bad,
and it's the same thing:  you have to specify the number of
iterations.
>> >> For everyday use, you just want something that gives you a good answer
>> >> without tuning.  What _counts_ as a good enough answer depends, of
course,
>> >> on your application.  I adapted John D. Cook's C++ code and used
R-compatible names.  (What I _really_ wanted this for was
>> >> > Smalltalk.  The Erlang code is new.)  Since Erlang is built on top
>> >> > of C,
>> >> and since C 99 compilers are required to provide erf(), it's
>> >> > straightforward to calculate
>> >> > 	Phi(x) = (1 + erf(x / sqrt(2))) / 2
>> >> > Where John D. Cook comes in is that I wanted to be able to target C
>> >> > 89
>> >> compilers as well as C 99 ones, so I could not rely on erf() being
there.
>> >> > Experimentally, the absolute error of pnorm/1 is below 1.0e-7 over
>> >> > the
>> >> range -8 to +8.
>> >> > -module(norm).
>> >> > -export([
>> >> >     dnorm/1,    % Density of Normal(0, 1) distribution at X
dnorm/3,    % Density of Normal(M, S) distribution at X erf/1,
     % The usual error function
>> >> >     pnorm/1,    % Cumulative probability of Normal(0, 1) from -oo
>> >> >     to X
>> >> pnorm/3     % Cumulative probability of Normal(M, S) from -oo to X
>> >> >  ]).
>> >> > dnorm(X) ->
>> >> >     0.39894228040143267794 * math:exp((X*X)/2.0).
>> >> > dnorm(X, M, S) ->
>> >> >     dnorm((X-M)/S).
>> >> > %   Phi(x) = (1+erf(x/sqrt 2))/2.
>> >> > %   The absolute error is less than 1.0e-7.
>> >> > pnorm(X) ->
>> >> >     (erf(X * 0.70710678118654752440) + 1.0) * 0.5.
>> >> > pnorm(X, M, S) ->
>> >> >     pnorm((X-M)/S).
>> >> > %   The following code was written by John D. Cook.
>> >> > %   The original can be found at
>> >> > http://www.johndcook.com/cpp_erf.html %
>> >>   It is based on formula 7.1.26 of Abramowitz & Stegun.
>> >> > %   The absolute error seems to be less than 1.4e-7;
>> >> > %   the relative error is good except near 0.
>> >> > erf(X) ->
>> >> >     if X < 0 ->
>> >> >        S = -1.0, A = -X
>> >> >      ; true ->
>> >> >        S =  1.0, A =  X
>> >> >     end,
>> >> >     T = 1.0/(1.0 + 0.3275911*A),
>> >> >     Y = 1.0 - (((((1.061405429*T - 1.453152027)*T) +
>> >> >     1.421413741)*T
>> >> >     -
>> >> >                   0.284496736)*T +
>> >> >                   0.254829592)*T*math:exp(-A*A),
>> >> >     S * Y.
>> >> > _______________________________________________
>> >> > erlang-questions mailing list
>> >> > 
>> >> > http://erlang.org/mailman/listinfo/erlang-questions
>> >> _______________________________________________
>> >> erlang-questions mailing list
>> >> 
>> >> http://erlang.org/mailman/listinfo/erlang-questions
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions







More information about the erlang-questions mailing list