我正在尝试计算高斯分布的积分。我有一些西格玛。
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
函数给出了错误。在这种情况下,如何获得集成数组?
答案 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]
答案 1 :(得分:0)
高斯pdf的积分给出了累积密度函数cdf。因此,您需要的是scipy.stats.norm.cdf
。而且该代码支持矢量化求值,因此无需在代码中进行for循环。
请注意,cdf从负无穷大开始积分。另外,sigma参数称为scale
。