将生成的数据与测量数据进

时间:2017-07-15 15:47:20

标签: matlab statistics distribution

我们测量了数据,我们设法确定它遵循的分布类型(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没有截断生成的数据”

enter image description here

任何人都知道为什么??

提前致谢

1 个答案:

答案 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);