2017-04-27 1 views
0

Ich habe Daten, dieWie passe ich die kumulative Verteilungsfunktion der Normalverteilung an Datenpunkte an?

der Formel eingebaut werden muss
y = a*CDF[NormalDistribution[m, s], x] 

Wo ich die fit ziemlich schnell ein, m und s

ich den Sitz mit Mathematica getestet haben, und es findet finden müssen und es passt gut zu den Daten.

Allerdings muss ich dies implementieren ist C#.

Zur Zeit habe ich eine Art und Weise umgesetzt params abzuschätzen, indem die Steigung bergab, aber meine Implementierung ist sehr langsam (etwa .5s pro Schätzung)

Was ist der beste Weg, um darüber zu gehen?

Antwort

1

Es ist eine Implementierung von John Cook: https://www.johndcook.com/blog/csharp_phi/

und ich werde es unten replizieren:

static double Phi(double x) 
{ 
    // constants 
    double a1 = 0.254829592; 
    double a2 = -0.284496736; 
    double a3 = 1.421413741; 
    double a4 = -1.453152027; 
    double a5 = 1.061405429; 
    double p = 0.3275911; 

    // Save the sign of x 
    int sign = 1; 
    if (x < 0) 
     sign = -1; 
    x = Math.Abs(x)/Math.Sqrt(2.0); 

    // A&S formula 7.1.26 
    double t = 1.0/(1.0 + p*x); 
    double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t * Math.Exp(-x*x); 

    return 0.5 * (1.0 + sign*y); 
} 

static void TestPhi() 
{ 
    // Select a few input values 
    double[] x = 
    { 
     -3, 
     -1, 
     0.0, 
     0.5, 
     2.1 
    }; 

    // Output computed by Mathematica 
    // y = Phi[x] 
    double[] y = 
    { 
     0.00134989803163, 
     0.158655253931, 
     0.5, 
     0.691462461274, 
     0.982135579437 
    }; 

    double maxError = 0.0; 
    for (int i = 0; i < x.Length; ++i) 
    { 
     double error = Math.Abs(y[i] - Phi(x[i])); 
     if (error > maxError) 
      maxError = error; 
    } 

     Console.WriteLine("Maximum error: {0}", maxError); 
} 
Verwandte Themen