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
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
使用 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 的这个答案是正确的(证明如下)。
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. 从均匀分布中抽取一个随机值 u。2. 假设正态分布在 a 和 b 处被截断。得到
u_bar = F(a)*u +F(b) *(1-u)
3. 使用 F 的倒数
epsilon= F^{-1}(u_bar)
epsilon 是截断正态分布的随机值。
为什么不矢量化?它可能会更快:
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