如何将正态分布的累积分布函数拟合到数据点?
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.5 秒)
最好的方法是什么?
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);
}
我有数据需要拟合到公式中
y = a*CDF[NormalDistribution[m, s], x]
我需要在哪里找到 a、m 和 s
我已经用 Mathematica 测试了拟合,它发现拟合相当快,并且很好地拟合了数据。
不过,我需要用c#来实现。
目前我已经实现了一种通过沿着梯度山下降来估计参数的方法,但是我的实现非常慢(每次估计大约 0.5 秒)
最好的方法是什么?
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);
}