Python 从N个元素的拒绝采样中输出N个元素

Python 从N个元素的拒绝采样中输出N个元素,python,numpy,Python,Numpy,我对给定概率密度函数的N个元素应用拒绝抽样pdf。当对N个元素应用此方法时,很可能返回的值数组的元素数比正在计算的N个元素数少,这是由于应用拒绝方法而不循环条件的值为False 为了协调这一点,我可以尝试循环不满足条件的值,直到它们为真。但是,我不确定如何循环条件,直到数组中的元素数与给定我定义的函数的值N数具有相同的长度 import numpy N = 1000 # number of elements x = np.linspace(0, 200, N) pdf = pdf(x) #

我对给定概率密度函数的N个元素应用拒绝抽样
pdf
。当对N个元素应用此方法时,很可能返回的值数组的元素数比正在计算的N个元素数少,这是由于应用拒绝方法而不循环
条件
的值为
False

为了协调这一点,我可以尝试循环不满足
条件的值
,直到它们为
。但是,我不确定如何循环条件,直到数组中的元素数与给定我定义的函数的值N数具有相同的长度

import numpy

N = 1000 # number of elements
x = np.linspace(0, 200, N) 
pdf = pdf(x) # some pdf


# Rejection Method #1
# -------------------
fx = np.random.random_sample(size=N) * x.max() # uniform random samples scaled out
u = np.random.random_sample(size=N) # uniform random sample
condition = np.where(u <= pdf/pdf.max())[0] # Run first rejection criterion that returns bool values
x_arr = fx[condition] 

# Here, len(x_arr) < N, so I want to fix it until len(x_arr) == N
while len(x_arr) < N:
    ...
    if len(x_arr) == N:
        break
导入numpy
N=1000#元件数量
x=np.linspace(0,200,N)
pdf=pdf(x)#一些pdf
#拒绝方法#1
# -------------------
fx=np.random.random_样本(大小=N)*x.max()#按比例缩小的均匀随机样本
u=np.随机.随机样本(大小=N)#均匀随机样本

condition=np。其中(u这里是使用布尔和高级索引的一种方法。它保留一个索引列表,其中值被拒绝,并重新绘制这些值,直到列表为空

采样和接受/拒绝功能示例:

def sample(N):
    return np.random.uniform(-3, 3, (N,))

def accept(v):
    return np.random.rand(v.size) < stats.norm().pdf(v)
健全性检查:

>>> counts, bins = np.histogram(draw(100000, sample, accept))
>>> counts / stats.norm().pdf((bins[:-1] + bins[1:]) / 2)
array([65075.50020815, 65317.17811578, 60973.84255365, 59440.53739031,
       58969.62310004, 59267.33983256, 60565.1928325 , 61108.60840388,
       64303.2863583 , 68293.86441234])

看起来大致平淡,所以还行。

Hmm,不太确定你在问什么,但你总是可以附加一个无关紧要的(也许?)在while循环中填充x_arr以增加长度。我编辑了我的帖子。你几乎说了我想尝试和做的事情。但是,我在执行
条件==False
的迭代过程时遇到了问题。我基于长度参数
while len(x_arr)
,然后循环所有内容,直到实际
len(x_arr)==N
>>> counts, bins = np.histogram(draw(100000, sample, accept))
>>> counts / stats.norm().pdf((bins[:-1] + bins[1:]) / 2)
array([65075.50020815, 65317.17811578, 60973.84255365, 59440.53739031,
       58969.62310004, 59267.33983256, 60565.1928325 , 61108.60840388,
       64303.2863583 , 68293.86441234])