我想在python中集成一个函数,并提供用于采样值的概率密度(度量)。如果不明显,在f(x)dx
中集成[a,b]
隐式使用统一概率密度超过[a,b]
,我想使用自己的概率密度(例如指数)。
我可以自己使用np.random.*
,然后
scipy.integrate.quad
中可用的优化。或者也许所有这些优化都假设均匀密度?sum(f(x))/n
的差异?有什么想法吗?
答案 0 :(得分:0)
正如unutbu所说,如果你有密度函数,你可以使用scipy.integrate.quad
将函数的乘积与pdf集成。
对于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
的调用设置。
答案 1 :(得分:0)
为了简洁起见,建议使用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
答案 2 :(得分:0)
另一种可能性是整合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的倒数。]