从截断正态分布中生成伪随机数

3

Matlab有randn函数可以从正态分布中抽取数据,例如:

x = 0.5 + 0.1*randn() 

从均值为0.5,标准差为0.1的正态分布中生成一个伪随机数。

根据此,以下Matlab代码是否等同于从截断在0到1之间的正态分布中进行抽样?


```matlab truncnormrnd = min(max(normrnd(0.5,0.1),0),1); ```
    while x <=0 || x > 1

    x = 0.5 + 0.1*randn();

    end

你的变量(cr,c和crmean)是如何声明和计算的? - marsei
cr是一个值数组。cr(c)表示第c个元素。crMean是一个常数,例如0.5。c是一个循环迭代器。 - craigB
3
如果你有统计工具箱,请点击此处查看。但是,根据这篇论文,你的方法是合理的。 - DrunkenDuck
3个回答

3
使用MATLAB的概率分布对象使得从截断分布中进行抽样变得非常容易。
您可以使用makedist()truncate()函数定义对象,然后修改(将其截断)以准备好random()函数生成来自该对象的随机变量。
% MATLAB R2017a
pd = makedist('Normal',0.5,0.1)     % Normal(mu,sigma)
pdt = truncate(pd,0,1)              % truncated to interval (0,1)
sample = random(pdt,numRows,numCols)  % Sample from distribution `pdt`

一旦对象被创建(这里是 pdt,它是 pd 的截断版本),您可以在各种函数调用中使用它。

生成样本random(pdt,m,n) 会产生一个大小为 m x n 的数组,其中包含来自 pdt 的样本。


此外,如果您想避免使用工具箱,则来自@Luis Mendo的答案是正确的(下面有证明)。

Comparison of @Luis Mendo code results with theoretical results

figure, hold on
h = histogram(cr,'Normalization','pdf','DisplayName','@Luis Mendo samples');
X = 0:.01:1;
p = plot(X,pdf(pdt,X),'b-','DisplayName','Theoretical (w/ truncation)');

1
为什么不进行向量化?这可能会更快:
N = 1e5; % desired number of samples
m = .5; % desired mean of underlying Gaussian
s = .1; % desired std of underlying Gaussian
lower = 0; % lower value for truncation
upper = 1; % upper value for truncation

remaining = 1:N;
while remaining
    result(remaining) = m + s*randn(1,numel(remaining)); % (pre)allocates the first time
    remaining = find(result<=lower | result>upper);
end

1
您需要以下步骤: 1. 从均匀分布中随机绘制一个值u。 2. 假设正态分布在a和b处被截断。获取
u_bar = F(a)*u +F(b) *(1-u)

3. 使用 F 的反函数

epsilon= F^{-1}(u_bar)

epsilon是截断正态分布的随机值。


这个公式是从哪里来的?请帮忙提供参考资料! - user7283235

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接