Matlab 中给定数字范围的正态分布

Matlab 中给定数字范围的正态分布

我的问题是关于估计从数据中提取的间隔内一行点的正态分布,只知道最大值(xmax = 200)和最小值(xmin = 100),通过我们将估计的平均值和相关标准差随机分布它们。

Matlab 中或文献中是否有一种方法可以做到这一点,使得绘制相关定律时,我们不能超出和xminxmax

我使用了这个技巧:

x = xmin + rand (1, n) * (xmax-xmin);

但我不知道如何提取正态分布的参数(平均值,标准差)。

答案1

如果您想要生成数据:

pd = makedist('Normal','mu',0.7777777,'sigma',0.3333333);
t = truncate(pd,0,1);

r = random(t,100000,1);
histogram(r,100)

基于以下示例代码MATLABtruncate文档

如果您想要将模型拟合到某些数据以提取参数估计值(使用上述数据作为示例):

x_min = 0;
x_max = 1;

heaviside_l = @(x) 1.0*(x>=0); %define double Heaviside function, because in Matlab 2017 Heaviside returns sym instead of double
heaviside_r = @(x) 1.0*(x<=0); %Heaviside function, which equals zero on the right

normcdf_lr = @(mu, sigma) (normcdf(x_max, mu, sigma) - normcdf(x_min, mu, sigma));
norm_trunc = @(x, mu, sigma) normpdf(x , mu, sigma)./normcdf_lr(mu, sigma) .* heaviside_l(x - x_min) .* heaviside_r(x - x_max);

[phat, phat_ci]  = mle(r , 'pdf', norm_trunc,'start', [mean(r), std(r)])

使用来自的代码拟合截断正态(高斯)分布

答案2

首先,您需要使用randn正态分布 -rand从均匀分布中抽取。

呼叫randn(1,n)将返回n标准分布的正态分布样本,其均值为零,方差(标准差平方)为 。要将此分布的均值更改为任意值x并将标准差更改为y,只需执行x + y*randn(1,n)

如果您期望平均值为 150,标准差为 25,则可以按如下方式实现:

>> stddev = 25;
>> xmin = 100;
>> xmax = 200;
>> xmean = 150;
>> n = 10000;
>> out = xmin + ( (xmean-xmin) + stddev * randn(1,n) );

您可以验证mean(out)std(out)分别约为 150 和 25。然而- 对于大型n并且足够大stddev,你几乎肯定会得到一些小于xmin和大于的样本xmax。你可以用几行代码将它们重新设置为你的限制:

>> out( out<xmin ) = xmin;
>> out( out>xmax ) = xmax;

或者直接删除这些条目(这样 的长度out就会小于n):

>> out( out<xmin | out>xmax ) = [];

相关内容