python - 如何正确采样密度?

标签 python random

我不明白为什么以下代码适用于正常功能而不适用于其他自定义功能:

这是我尝试对正态分布进行采样的示例:

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))

它有效,我得到了:

gaussian

现在,如果我改变了密度,我就不会正确地对其进行采样。我检查了密度是否正常,确实如此。所以我不明白我哪里错了

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)

sin

最佳答案

你正在做 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/

相关文章:

python - keras 后端 Proba 到分类

python - 手动更新 conda 中的 channel 优先级

python - Python 中的最大似然函数

c++ - std::piecewise_linear_distribution 在 VS2012 下不工作?

python - 检查猴子补丁方法的身份

javascript - 如何在随机有序列表中随机化多个无序列表?

java - 如何从Java中的两个选择中生成一个随机字符?

c - 确保船只不重叠

java - 尝试在 Android 中使用 AESCounterRNG

Python heapq 没有按正确的顺序推送?