3

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

x = 0.5 + 0.1*randn() 

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

鉴于此,以下 Matlab 代码是否等效于从 0 处截断为 1 的正态分布中采样?

    while x <=0 || x > 1

    x = 0.5 + 0.1*randn();

    end
4

3 回答 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 的这个答案是正确的(证明如下)。

@Luis Mendo 代码结果与理论结果的比较

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)');
于 2018-12-20T22:21:59.623 回答
1

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

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

3. 使用 F 的倒数

epsilon= F^{-1}(u_bar)

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

于 2014-05-26T13:39:55.517 回答
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
于 2013-08-07T10:08:42.567 回答