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

时间:2018-10-10 17:14:21

标签: python arrays scipy normal-distribution variance

我正在尝试计算高斯分布的积分。我有一些西格玛。

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函数给出了错误。在这种情况下,如何获得集成数组?

2 个答案:

答案 0 :(得分:1)

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

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

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

  • quad将返回一个包含整数和绝对误差的元组。因此,您应该使用[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]

enter image description here

答案 1 :(得分:0)

高斯pdf的积分给出了累积密度函数cdf。因此,您需要的是scipy.stats.norm.cdf。而且该代码支持矢量化求值,因此无需在代码中进行for循环。

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