使用非统一度量集成函数(python / scipy)

时间:2012-09-03 10:14:46

标签: python numpy scipy probability numerical-methods

我想在python中集成一个函数,并提供用于采样值的概率密度(度量)。如果不明显,在f(x)dx中集成[a,b]隐式使用统一概率密度超过[a,b],我想使用自己的概率密度(例如指数)。

我可以自己使用np.random.*,然后

  • 我想念scipy.integrate.quad中可用的优化。或者也许所有这些优化都假设均匀密度?
  • 我需要自己做错误估算,这不是一件容易的事。或许它是?也许错误只是sum(f(x))/n的差异?

有什么想法吗?

3 个答案:

答案 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)的期望值:

  • 假设p以封闭形式提供,请使用scipy.integrate.quad来评估f(x)p(x)
  • 假设p可以从样本N值x=P(N)中采样,然后按np.mean(f(X))评估预期值,按np.std(f(X))/np.sqrt(N)评估错误
  • 假设p在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的倒数。]