正态分布函数
正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。
若随机变量X服从一个数学期望为μ、标准方差为σ2的高斯分布,记为:
X∼N(N(μ,σ2),σ2)
X
∼
N
(
N
(
μ
,
σ
2
)
,
σ
2
)
则其概率密度函数为
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/90bb39d451188123ea5a5a7f1984811c.png)
N(0,1)=f(x−μσ)
N
(
0
,
1
)
=
f
(
x
−
μ
σ
)
正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。因其曲线呈钟形,因此人们又经常称之为钟形曲线。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/990d6d2cd5235c4cd47bbded0ba6e080.jpeg)
累积分布函数
累积分布函数是指随机变量X小于或等于x的概率,用密度函数表示为:
为了计算累计分布函数,我们可以用查表法或者微分法。但对于编程来说,处于精确度和计算速度的考虑,二者都不能作为首选。这里给出一个快速计算的方案:https://www.johndcook.com/blog/cpp_phi/
#include <cmath>
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 = fabs(x)/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*exp(-x*x);
return 0.5*(1.0 + sign*y);
}
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
};
int numTests = sizeof(x)/sizeof(double);
double maxError = 0.0;
for (int i = 0; i < numTests; ++i)
{
double error = fabs(y[i] - phi(x[i]));
if (error > maxError)
maxError = error;
}
std::cout << "Maximum error: " << maxError << "\n";
}