如何在 MATLAB 中生成半正态变量?

计算科学 matlab 可能性
2021-12-21 18:00:13

我可以找到

random('normal', 0, 1, 10000,1)

MATLAB 中的命令,但它会生成半正态变量。我想生成随机的半正态变量。半正态分布定义为

f|Z|(x)=22πex22.

我可以从随机正态变量生成随机半正态变量吗?

2个回答

正如维基百科所说,您可以计算一个均值为 0 的正态分布随机变量并取其绝对值。半正态概率分布函数与正态 PDF 相同μ=0为了X>0,除了标准化的两倍。

如果XNormal(μ,σ),那么YHalf-Normal可以通过几种方法获得。

  1. 绝对值: Y=|X|(正如@DavidZ 所指出的那样。)
  2. 截断: Y=X(0,)MATLAB 很好地做到了这一点truncate()
  3. 调节(逻辑索引): Y=(X|X>0)

下面带有代码的图形示例。 截断

% MATLAB R2018b
mu = 0; sigma = 1;
pdN = makedist('Normal',mu,sigma);
pdHN = truncate(pdN,0,inf);

X = (-4:.01:4)';
Xt = X(X>0);

figure, hold on, box on
p(1) = plot(X,pdf(pdN,X),'k-','DisplayName','Normal')
p(2) = plot(Xt,pdf(pdHN,Xt),'b-','DisplayName','HalfNormal')
YAxis = get(gca,'YTick');
plot([0;0],[0,YAxis(end)],'b--','HandleVisibility','off')
legend('show')
set(p,'LineWidth',1.8)
ylabel('Probability Density Function (PDF)')

逻辑索引

Y = random(pdN,50000,1);
Yt = Y(Y>0);

figure, hold on, box on
histogram(Y,'Normalization','pdf','FaceColor','k','DisplayName','Normal')
histogram(Yt,'Normalization','pdf','FaceColor','b','DisplayName','HalfNormal')
legend('show')