如何将高斯分布与方差数组相结合
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
.
我正在尝试计算高斯分布的积分。我有一个 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
.