如何正确地采样密度?

时间:2017-02-08 17:28:34

标签: 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

2 个答案:

答案 0 :(得分:2)

你正在做rejection sampling

在第一种情况下,pdf的最大值是< 1,您正在从$ awk 'NR==FNR {a[$1]; next} {printf "%s\t%s\n", $0, $2 in a ? "match" : "no match"}' file2 file1 B.1 Av1 match Q7 G3 match Q9 S4 no match 绘制rnd,因此所有值都低于最大值。您丢弃的值多于所需值,因为最大值严格小于1.在第二种情况下,pdf的最大值为 2 ,但您仍然从{{[0,1]绘制rnd行中的1}}

[0,1]

您应该更改该行,以便从rnd = np.random.rand(n) 统一采样。请注意,直方图的略微平顶对应于[0,2]的部分,其中pdf为> 1.您的代码无法以不同于其他值的方式处理其中一些值。

答案 1 :(得分:2)

你在第一个例子中拒绝太多,而在第二个例子中则不够。

从0到PDF max 采样Y时的最佳情况。

在第一种情况下,您应致电

rnd = np.random.rand(n) / np.sqrt(2.0 * np.pi)

在第二种情况下

rnd = 2.0 * np.random.rand(n)