我不明白为什么以下代码适用于正常功能而不适用于其他自定义功能:
这是我尝试对正态分布进行采样的示例:
n = 100000
xx = np.random.uniform(-5, 5, n)
rho = mpl.pylab.normpdf(xx, 0, 1)
rnd = np.random.rand(n)
ix = np.where(rho > rnd)
xx = xx[ix]
h = plt.hist(xx, bins=20, normed=True)
# plot density
x = np.linspace(-5, 5, 100)
plt.plot(x, mpl.pylab.normpdf(x, 0, 1))
它有效,我得到了:
现在,如果我改变了密度,我就不会正确地对其进行采样。我检查了密度是否正常,确实如此。所以我不明白我哪里错了
n = 100000
xx = np.random.uniform(0, 1, n)
rho = 2 * np.sin(2 * xx * np.pi)**2
rnd = np.random.rand(n)
ix = np.where(rho > rnd)
xx = xx[ix]
h = plt.hist(xx, bins=20, normed=True)
# plot density
x = np.linspace(0, 1, 100)
print(np.trapz(2 * np.sin(2 * x * np.pi)**2, x))
plt.plot(x, 2 * np.sin(2 * x * np.pi)**2)
最佳答案
你正在做 rejection sampling
在第一种情况下,pdf 的最大值为 < 1,并且您正在从 [0,1]
绘制 rnd
,因此所有值都低于最大限度。你丢弃的值比需要的多,因为最大值严格小于 1。在第二种情况下,pdf 的最大值是 2 但你仍在绘制 rnd
来自 [0,1]
行
rnd = np.random.rand(n)
您应该更改该行,使其从 [0,2]
统一采样。请注意,您的直方图的顶部有点平坦对应于 [0,1]
的部分,其中 pdf > 1。您的代码无法以不同于其他值的方式处理其中一些值。
关于python - 如何正确采样密度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42119801/