我们测量了数据,我们设法确定它遵循的分布类型(Gamma)及其参数(A,B)
我们使用for循环从具有相同参数和相同范围(介于18.5和59之间)的相同分布生成n个样本(10000)
for i=1:1:10000
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W(i,:) =random(tot,1,1);
end
然后我们尝试使用以下方法拟合生成的数据:
h1=histfit(W);
在此之后我们尝试绘制Gamma曲线以比较同一图中的两条曲线:
hold on
h2=histfit(W,[],'Gamma');
h2(1).Visible='off';
问题是两条曲线的移动如下图所示“图1是前面代码生成的数据,图2没有截断生成的数据”
任何人都知道为什么??
提前致谢
答案 0 :(得分:0)
默认情况下,histfit
符合直方图上的正常概率密度函数(PDF)。我不确定你到底想要做什么,但你做的是:
% fit a normal PDF
h1=histfit(W); % this is equal to h1 = histfit(W,[],'normal');
% fit a gamma PDF
h2=histfit(W,[],'Gamma');
显然,这将导致不同的拟合,因为正常的PDF!=伽玛PDF。您唯一看到的是,对于gamma,PDF更适合曲线,因为您从该分布中采样数据。
如果您想检查数据是否遵循特定分布,您还可以使用KS-test。在你的情况下
% check if the data follows the distribution speccified in tot
[h p] = kstest(W,'CDF',tot)
如果数据遵循gamma dist。那么h = 0并且p> 0.05,否则h = 1且p <0.05。 0.05。
现在对您的代码进行一些一般性评论: 请查看preallocation of memory,它会大大加快循环速度。 E.g。
W = zeros(10000,1);
for i=1:1:10000
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W(i,:) =random(tot,1,1);
end
此外,
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
不依赖于循环索引,因此可以在循环前移动以进一步加快速度。 avoid using i as loop variable.
也是一种好习惯但实际上你可以跳过整个循环,因为random()
允许一次返回多个样本:
tot=makedist('Gamma','A',11.8919,'B',2.9927);
tot= truncate(tot,18.5,59);
W =random(tot,10000,1);