[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