如何获取Python中scipy.stats.norm.cdf的精确积分形式?
你代码里用到的stats.norm.cdf(x)是正态分布的累积分布函数,它的精确积分形式可以从正态分布的概率密度函数(PDF)推导出来:
1. 正态分布PDF与CDF的关系
正态分布的概率密度函数为:
$$
f(t) = \frac{1}{\sqrt{2\pi}s} \exp\left( -\frac{(t - x_0)2}{2s2} \right)
$$
其中x0是分布均值(对应代码中的loc参数),s是标准差(对应代码中的scale参数)。
CDF就是PDF从负无穷到$x$的积分:
$$
\text{cdf}(x) = \int_{-\infty}^{x} f(t) dt
$$
2. 转换为标准正态分布形式
通过变量替换 $z = \frac{t - x_0}{s}$,可以将上述积分转换为标准正态分布(均值0,标准差1)的CDF形式$\Phi(z)$:
$$
\text{cdf}(x) = \Phi\left( \frac{x - x_0}{s} \right)
$$
而标准正态分布的CDF可以用误差函数(erf)表示:
$$
\Phi(z) = \frac{1}{2} \left[ 1 + \text{erf}\left( \frac{z}{\sqrt{2}} \right) \right]
$$
这正是Scipy内部计算norm.cdf的核心依据——它并没有直接计算原始积分,而是调用scipy.special.erf的高效数值实现来得到结果。
3. 完整模型的积分形式
如果需要对你的model(x)函数做积分,其精确形式为:
$$
\int \left( A \cdot \text{cdf}(x) + c \right) dx = A \cdot \left[ \frac{x - x_0}{s} \Phi\left( \frac{x - x_0}{s} \right) + \frac{1}{\sqrt{2\pi}} \exp\left( -\frac{(x - x_0)2}{2s2} \right) \right] + c \cdot x + C
$$
其中$C$是积分常数,这个结果是通过对$\Phi(z)$的积分($z = \frac{x - x_0}{s}$)推导而来的。
内容的提问来源于stack exchange,提问作者user23495528

