我的问题是关于估计从数据中提取的间隔内一行点的正态分布,只知道最大值(xmax = 200
)和最小值(xmin = 100
),通过我们将估计的平均值和相关标准差随机分布它们。
Matlab 中或文献中是否有一种方法可以做到这一点,使得绘制相关定律时,我们不能超出和xmin
值xmax
?
我使用了这个技巧:
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 ) = [];