我正在看我的书,它说“为这个密度函数写一个采样算法”
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)
的图:
由于 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)
表示生成一个在a
和b
之间均匀分布的值,f(x)
是你的密度,b(x)
是上面描述的边界函数。
我实现了上述算法以生成 100,000 个候选值,其中 14,199(~1/7)个被拒绝,正如预期的那样。最终结果显示在以下直方图中,您可以将其与上图中的 f(x)
进行比较。
关于algorithm - 实现密度函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876737/