1

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

我可以自己做,np.random.*但随后

  • 我想念scipy.integrate.quad. 或者也许所有这些优化都假设密度均匀?
  • 我需要自己进行误差估计,这不是微不足道的。或者也许是?也许误差只是 的方差sum(f(x))/n

有任何想法吗?

4

3 回答 3

0

正如 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

于 2012-09-03T14:10:15.113 回答
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
于 2012-09-04T17:06:47.187 回答
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 的倒数。]

于 2012-09-05T14:27:03.707 回答