我有100个采样数,我需要在matlab中绘制它们的正态分布曲线。
这些采样数据的平均值和标准差可以很容易地计算出来,但是有没有绘制正态分布的函数?
答案 0 :(得分:7)
如果您有权使用统计工具箱,则histfit
功能会执行我认为您需要的功能:
>> x = randn(10000,1);
>> histfit(x)
就像使用hist
命令一样,您也可以指定容器的数量,还可以指定使用的分布(默认情况下,它是正态分布)。
如果您没有统计工具箱,可以使用@Gunther和@learnvst的答案组合再现类似的效果。
答案 1 :(得分:5)
使用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)中。
答案 2 :(得分:5)
如果要为数据绘制高斯分布,可以使用以下代码,将平均值和标准差值替换为根据数据集计算的值。
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);