如何将高斯分布与方差数组相结合

how to integrate gaussian distribution with an array of variance

我正在尝试计算高斯分布的积分。我有一个 sigma 数组。

sigma = np.array([0.2549833 , 0., 0.42156247, 0. , 0.,  0., 0.79124217, 0.54235005, 0.79124217, 0.        ,     0.        , 0.32532629, 0.46753655, 0.60605513, 0.55420338,      0.        , 0.38053264, 0.42690288, 0.        , 0.63526099])

以及高斯分布的公式:

def gaussian(x, mu, sig):
if sig != 0:
    return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))

对该高斯分布求积分:

I = np.zeros(len(sigma), dtype=float)
for i in range(0, len(sigma)):
    I[i] = quad(gaussian(x, mu = 0, sig = sigma[i]), 0, 105)

但它不起作用,因为 quad 函数出错。在这种情况下,如何获得集成数组?

问题出在您对 quad 的使用上。这是正确的版本。需要注意的几点:

  • 您正在创建 I 的长度等于 sigma 值的数量,但是当 sigma 为 0 时您什么也没做。所以现在,我重新创建 sigma 只有非零值。这样我删除了条件 if sig != 0:

  • 根据 docs 的正确用法是首先传递函数定义,然后是限制,然后是使用关键字 args 的函数参数。

  • quad将return一个包含积分和绝对误差的元组。因此,您应该使用 [0] 索引来获取存储在 I 中的整数值。如果需要,您可以将绝对误差存储在不同的列表中。

为了方便起见,我添加了积分图与 sigma 值的关系图。

修改了部分代码

sigma = sigma[sigma !=0]

def gaussian(x, mu, sig):
        return np.exp(-(x - mu)**2/ (2 * sig**2))

I = np.zeros(len(sigma), dtype=float)

for i in range(0, len(sigma)):
    I[i]  = quad(gaussian, 0, 105,  args=(0, sigma[i]))[0]

高斯 pdf 的积分给出了累积密度函数 cdf。所以,你需要的是scipy.stats.norm.cdf。而且它支持矢量化评估,因此您的代码中不需要 for 循环。

注意 cdf 从负无穷大开始积分。此外,sigma 参数称为 scale.