2017-04-27 10 views
0

私は式正規分布の累積分布関数をデータポイントに適合させるにはどうすればよいですか?

私はMathematicaを使ったフィット感をテストしている、そしてそれはフィット感はかなり速い見つけ、MとS

を見つける必要があり

y = a*CDF[NormalDistribution[m, s], x] 

に装着する必要があるデータとを持っていますそれはデータにうまく収まる。

しかし、これはC#を実装する必要があります。

現在、私は、勾配の丘を下って行くことでのparamsを推定する方法を実装しましたが、私の実装は非常に遅い(推定あたり.5s周り)

それについて移動する最良の方法は何ですか?ジョン・クックによって実装があり

答えて

1

https://www.johndcook.com/blog/csharp_phi/

、私は以下のそれを複製します:

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); 
} 
関連する問題