在Matlab中基于正态分布生成随机数

5
我正在尝试基于正态分布的特征(均值和标准差)生成随机数。我没有统计学和机器学习工具箱。
我知道一种方法是从0到1随机生成一个随机数r,并找到给定该随机数概率的值。我可以通过输入标准正态函数来实现这一点。
f= @(y) (1/(1*2.50663))*exp(-((y).^2)/(2*1^2))

并解决

r=integral(f,-Inf,z)

然后根据该z值推导出最终答案X的方程为

z=(X-mew)/sigma

据我所知,Matlab没有命令可以解决当 x 是积分的极限时求解 x 的问题。是否有其他方法来生成这个数字或更好的随机生成方法呢?

2个回答

5
你可以使用内置的 randn 函数,该函数提供从标准正态分布中随机抽取的数字,其均值为零,标准偏差为 1。要更改此分布,您可以将 randn 的输出乘以所需的标准偏差,然后加上所需的平均值。
% Define the distribution that you'd like to get
mu = 2.5;
sigma = 2.0;

% You can any size matrix of values
sz = [10000 1];

value = (randn(sz) * sigma) + mu;

%   mean(value)
%       2.4696
%
%   std(value)
%       1.9939

如果你只需要从分布中获取一个数字,你可以使用没有输入参数的randn版本来产生一个标量值。

value = (randn * sigma) + mu;

哇,太完美了。谢谢! - curt

4

仅仅为了好玩,您可以使用均匀分布随机生成器来生成高斯分布随机变量:

  • 在(0,1)上的均匀分布随机变量的对数具有指数分布
  • 其平方根具有瑞利分布
  • 将其乘以在(0,2*pi)上的均匀分布随机变量的余弦(或正弦)并将结果归一化,即得到高斯分布随机变量。您需要乘以sqrt(2)进行标准化。

所得到的高斯变量已经标准化(零均值,单位标准差)。如果您需要特定的均值和标准差,则可以先乘以标准差,然后再加上均值。

示例(标准化高斯分布):

m = 1; n = 1e5; % desired output size
x = sqrt(-2*log(rand(m,n))).*cos(2*pi*rand(m,n));

检查:

>> mean(x)
ans =
  -0.001194631660594
>> std(x)
ans =
   0.999770464360453
>> histogram(x,41)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接