algorithm - 实现密度函数

标签 algorithm function distribution montecarlo

我正在看我的书,它说“为这个密度函数写一个采样算法”

y=x^2+(2/3)*x+1/3; 0 < 𝑥 < 1

或者我可以使用蒙特卡洛? 任何帮助将不胜感激!

最佳答案

我假设您的意思是要生成随机 x 值,这些值具有由密度 y(x) 指定的分布。

通常需要通过对密度进行积分来导出累积分布函数,并使用 inverse transform sampling生成 x 值。在您的情况下,CDF 是三阶多项式,它不会产生简单的立方根解,因此您必须使用数值求解器来求逆。是时候考虑替代方案了。

另一种选择是使用 acceptance/rejection method .检查导数后,很明显你的密度是凸的,所以通过从 f(0) 画一条直线到f(1)。这会产生 b(x) = 1/3 + 5x/3。此边界函数的面积为 7/6,而您的 f(x) 的面积为 1,因为它是有效密度。因此,在 b(x) 下统一生成的点中有 6/7 也将落在 f(x) 下,并且 7 次尝试中只有 1 次会在拒绝方案中失败.这是 f(x)b(x) 的图:

Plot of f(x) and b(x) showing relatively tight bounding

由于 b(x) 是线性的,因此很容易生成 x 值,在缩放 6/7 后将其用作分布,使其成为有效的分布函数.以伪代码表示的算法变为:

function generate():
  while TRUE:
    x <- (sqrt(1 + 35 * U(0,1)) - 1) / 5     # inverse CDF transform of b(x)
    if U(0, b(x)) <= f(x):
      return x
  end while
end function

其中U(a,b)表示生成一个在ab之间均匀分布的值,f(x) 是你的密度,b(x) 是上面描述的边界函数。

我实现了上述算法以生成 100,000 个候选值,其中 14,199(~1/7)个被拒绝,正如预期的那样。最终结果显示在以下直方图中,您可以将其与上图中的 f(x) 进行比较。

Histogram of generated data having density f(x)

关于algorithm - 实现密度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876737/

相关文章:

algorithm - search.twitter.com 的 "trending topics"算法是什么?

c++ - 在不先构建数组的情况下将数字列表传递给 C++ 中的函数?

javascript - 当 Controller 中的 $scope 值更改时,$scope 值不会在 View 中更新

python - 如何更有效地触发类内部函数?

python - 如何在 Python 中识别给定数据的分布?

algorithm - Rust - 如何搜索 vec 的子集 - 并找到 subvec 的起始索引?

algorithm - 用图论找到套利

java - 你如何找出七次搜索的大 O 和大 Omega?

ios - Apple Production iOS 推送服务证书不适用于应用程序分发

java - 如何在不安装 JMF 的情况下使用 JMF 捕获视频