簡體   English   中英

如何使正態分布的累積分布函數適合數據點?

[英]How do I fit cumulative distribution function of normal distribution to data points?

我有需要擬合公式的數據

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

我需要在哪里找到a,m和s

我已經使用Mathematica測試了擬合度,它發現擬合度相當快,並且很好地擬合了數據。

但是,我需要實現的是c#。

目前,我已經實現了一種通過沿坡度下降來估算參數的方法,但是我的實現速度非常慢(每次估算約為0.5s)

最好的方法是什么?

約翰·庫克(John Cook)有一個實現: 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM