对两个正态分布"in the same way"进行采样



假设我想对正态分布进行采样。这通过rng = numpy.random.default_rng()rng.normal(mean, std, size)是直接的。如果我想更改标准偏差,比如rng.normal(mean, std*2, size),这也很容易。

然而,执行这两个命令;不同的";后果据我所知,采样的可能方式之一是通过逆变换:所以这就像我从均匀分布中选择一个随机值r,并用它来索引正态分布的累积分布的倒数,比如F_X^(-1)(r)。现在,我认为如果我使用rng.normal(mean, std, size)rng.normal(mean, std*2, size),它们中的每一个都将产生size = (a,b,c) -> a+b+c样本,这些样本将不对应于均匀分布中的同一样本(即,它们将使用不同的r值(这不是它在numpy中的实现方式,但我认为我将获得的实际样本在这个意义上会有所不同(根据这里的实际实现,这就像我使用了一个不同的状态,但我不确定(。

换句话说,我正在搜索一种方法,该方法将为我提供来自rng.normal(mean, std, size)的样本和以相同方式但使用rng.normal(mean, 2*std, size)获得的样本,因此标准偏差不同。

我考虑过如何操作rng.normal(mean, std, size)产生的样品,以获得所需的结果:

def alter_value(value, new_std, prev_mean=0, prev_std=1):
# use the PDF expression to obtain p(x)
gaussian_value = 1/(np.sqrt(2)*prev_std) * np.exp(-(value-prev_mean)**2/2/prev_std**2)
# fixed p(x), obtain the new x
new_x = prev_mean - np.log(np.sqrt(2)*new_std*gaussian_val)*2*new_std**2
return new_x

不过,我不知道这样做是否正确。

获得可重复或非常相似的随机样本的最简单方法是设置;种子";或";状态";直接使用随机数生成器的。结果不能保证遵守alter_value()函数,但只要在调用函数之前始终将状态设置为相同的值,并且只要不更改函数本身,RNG的输出就保证是相同的。(另请参阅@slothrop和@warren-weckesser对您的问题的评论。(

这种可能是有效的,因为在引擎盖下,numpy可能只是绘制随机数,并根据标准差缩放它们;意思是——就像你的alter_value()一样。numpy可以做一些更复杂的事情,但没有理由这么做

A";RNG";只是一个固定的";"伪随机";数字序列,所以只要该序列以相同的方式被消耗,从相同的位置开始每次都会产生相同的序列。

当然,如果你绝对需要alter_value()的行为,只需使用该函数。。。但如果你只是想在高水平上重现行为,设置种子就可以了。

相关内容

最新更新