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
答案 0 :(得分:2)
使用MATLAB的Probability Distribution Objects使得从截断分布中采样非常容易。
您可以使用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)
从pdt
生成样本的 m x n 个数组。
此外,如果要避免使用工具箱,则this answer from @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 :(得分: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是截断正态分布的随机值。