【问题标题】:Draw Normal Distribution Graph of a Sample in Matlab在 Matlab 中绘制样本的正态分布图
【发布时间】:2012-08-06 15:52:09
【问题描述】:

我有100个采样数,我需要在matlab中画出它们的正态分布曲线。

这些采样数据的均值和标准差可以很容易地计算出来,但是有没有绘制正态分布的函数呢?

【问题讨论】:

    标签: matlab normal-distribution


    【解决方案1】:

    如果您可以访问 Statistics Toolbox,则函数 histfit 可以满足您的需要:

    >> x = randn(10000,1);
    >> histfit(x)
    

    就像hist命令一样,你也可以指定bin的数量,也可以指定使用哪种分布(默认是正态分布)。

    如果您没有 Statistics Toolbox,您可以结合使用 @Gunther 和 @learnvst 的答案来重现类似的效果。

    【讨论】:

    • 哇。我正是在寻找这个。谢谢:)
    【解决方案2】:

    使用hist:

    hist(data)
    

    它会为您的数据绘制直方图:

    您也可以指定要绘制的箱数,例如:

    hist(data,5)
    

    如果您只想绘制生成的pdf,请使用以下方法自行创建:

    mu=mean(data);
    sg=std(data);
    x=linspace(mu-4*sg,mu+4*sg,200);
    pdfx=1/sqrt(2*pi)/sg*exp(-(x-mu).^2/(2*sg^2));
    plot(x,pdfx);
    

    您可能可以将其覆盖在之前的 hist 图上(我认为您需要先进行缩放,pdf 在 0-1 范围内,直方图在范围内:每个 bin 的元素数) .

    【讨论】:

    • 注意:MATLAB 现在不鼓励使用hist,建议改用histogram
    【解决方案3】:

    如果您想为您的数据绘制高斯分布,您可以使用以下代码,将均值和标准差值替换为根据您的数据集计算得出的值。

    STD = 1;
    MEAN = 2;
    x = -4:0.1:4;
    f = (   1/(STD*sqrt(2*pi))   )  *  exp(-0.5*((x-MEAN)/STD).^2  );
    
    hold on; plot (x,f);
    

    本示例中的数组x 是您的分布的 x 轴,因此请将其更改为您拥有的任何范围和采样密度。

    如果您想在不借助信号处理工具箱的情况下对数据绘制高斯拟合,以下代码将以正确的比例绘制这样的图。只需将y 替换为您自己的数据即可。

    y = randn(1000,1) + 2;
    x = -4:0.1:6;
    
    n = hist(y,x);
    
    bar (x,n);
    
    MEAN = mean(y);
    STD = sqrt(mean((y - MEAN).^2));
    
    
    f = (   1/(STD*sqrt(2*pi))   )  *  exp(-0.5*((x-MEAN)/STD).^2  );
    f = f*sum(n)/sum(f);
    
    hold on; plot (x,f, 'r', 'LineWidth', 2);
    

    【讨论】: