从截断的正态分布中绘制伪随机数

时间:2013-08-07 09:08:31

标签: matlab normal-distribution truncated

Matlab具有从正态分布中绘制的函数randn,例如

x = 0.5 + 0.1*randn() 

从平均值0.5和标准差0.1的正态分布中绘制伪随机数。

鉴于此,下面的Matlab代码是否相当于从0处截断的正态分布中采样?

    while x <=0 || x > 1

    x = 0.5 + 0.1*randn();

    end

3 个答案:

答案 0 :(得分:2)

使用MATLAB的Probability Distribution Objects使得从截断分布中采样非常容易。

您可以使用makedisttruncate函数来定义对象,然后进行修改(截断)以准备用于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)pdt生成样本的 m x n 个数组。


此外,如果要避免使用工具箱,则this answer from @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 :(得分:0)

你为什么不进行矢量化?它可能会更快:

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

答案 2 :(得分:0)

您需要执行以下步骤 1.从均匀分布中抽取随机值,u。 2.假设在a和b处截断正态分布。获得

u_bar = F(a)*u +F(b) *(1-u)

3。使用F

的倒数
epsilon= F^{-1}(u_bar)

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