我想在 python 中集成一个函数并提供用于采样值的概率密度(度量)。如果不明显,集成f(x)dx
隐[a,b]
式使用 上的均匀概率密度[a,b]
,我想使用我自己的概率密度(例如指数)。
我可以自己做,np.random.*
但随后
- 我想念
scipy.integrate.quad
. 或者也许所有这些优化都假设密度均匀? - 我需要自己进行误差估计,这不是微不足道的。或者也许是?也许误差只是 的方差
sum(f(x))/n
?
有任何想法吗?
我想在 python 中集成一个函数并提供用于采样值的概率密度(度量)。如果不明显,集成f(x)dx
隐[a,b]
式使用 上的均匀概率密度[a,b]
,我想使用我自己的概率密度(例如指数)。
我可以自己做,np.random.*
但随后
scipy.integrate.quad
. 或者也许所有这些优化都假设密度均匀?sum(f(x))/n
?有任何想法吗?
正如 unutbu 所说,如果你有密度函数,你可以使用scipy.integrate.quad
.
对于 中可用的分布scipy.stats
,我们也可以只使用 expect 函数。
例如
>>> from scipy import stats
>>> f = lambda x: x**2
>>> stats.norm.expect(f, loc=0, scale=1)
1.0000000000000011
>>> stats.norm.expect(f, loc=0, scale=np.sqrt(2))
1.9999999999999996
scipy.integrate.quad
也有一些预定义的权重函数,尽管它们没有被归一化为概率密度函数。
近似误差取决于调用的设置integrate.quad
。
为简洁起见,提出了 3 种方法来计算概率 p(x) 下的 f(x) 的期望值:
scipy.integrate.quad
用于评估f(x)p(x)
x=P(N)
,然后评估期望值np.mean(f(X))
和误差np.std(f(X))/np.sqrt(N)
stats.norm
,使用stats.norm.expect(f)
CDF(x)
分布而不是p(x)
,计算H=Inverse[CDF]
然后f(H(x))
使用积分scipy.integrate.quad
另一种可能性是对 x -> f( H(x)) 进行积分,其中 H 是概率分布的累积分布的倒数。
[这是因为变量的变化:替换 y=CDF(x) 并注意到 p(x)=CDF'(x) 产生变化 dy=p(x)dx 并因此产生 int{f(x)p(x )dx}==int{f(x)dy}==int{f(H(y))dy 其中 H 是 CDF 的倒数。]