直方图中的Matlab图

时间:2013-04-19 17:39:18

标签: matlab statistics

假设y是在分布f(x)=sqrt(4-x^2)/(2*pi)之后具有随机数的向量。目前我使用命令hist(y,30)。如何将分布函数f(x)=sqrt(4-x^2)/(2*pi)绘制到相同的直方图中?

3 个答案:

答案 0 :(得分:1)

让我们举一个另一个分布函数的例子,标准法线。要做到你想要的,你这样做:

nRand = 10000;
y = randn(1,nRand);
[myHist, bins] = hist(y,30);
pdf = normpdf(bins);
figure, bar(bins, myHist,1); hold on; plot(bins,pdf,'rx-'); hold off;

这可能不是你真正想要的。为什么?您会注意到您的密度函数在直方图的底部看起来像一条细线。这是因为直方图是区间中的数字计数,而密度函数被归一化以整合为一个。如果bin中有数百个项目,则密度函数无法与比例函数匹配,因此存在缩放或规范化问题。您必须标准化直方图,或绘制缩放分布函数。我更喜欢缩放分布函数,以便在查看直方图时我的计数很明显:

normalizedpdf = pdf/sum(pdf)*sum(myHist);
figure, bar(bins, myHist,1); hold on; plot(bins,normalizedpdf,'rx-'); hold off;

你的情况是一样的,除了你将使用你指定的函数f(x)而不是normpdf命令。

答案 1 :(得分:1)

除了在数字上进行标准化之外,您还可以通过查找理论比例因子来实现,如下所示。

nbins = 30;
nsamples = max(size(y));
binsize = (max(y)-min(y)) / nsamples
hist(y,nbins)
hold on
x1=linspace(min(y),max(y),100);
scalefactor = nsamples * binsize 
y1=scalefactor * sqrt(4-x^2)/(2*pi)
plot(x1,y1)

更新:工作原理。

对于任何足够大的数据集来给出pdf的良好近似值(称之为f(x)),f(x)在该域上的积分将近似为1。但是我们知道任何直方图下的区域恰好等于样本总数乘以bin宽度。

因此,将pdf与直方图对齐的非常简单的比例因子是Ns * Wb,即采样点的总数乘以箱的宽度。

答案 2 :(得分:1)

让我再添加一个例子:

%# some normally distributed random data
data = randn(1e3,1);

%# histogram
numbins = 30;
hist(data, numbins);
h(1) = get(gca,'Children');
set(h(1), 'FaceColor',[.8 .8 1])

%# figure out how to scale the pdf (with area = 1), to the area of the histogram
[bincounts,binpos] = hist(data, numbins);
binwidth = binpos(2) - binpos(1);
histarea = binwidth*sum(bincounts);

%# fit a gaussian
[muhat,sigmahat] = normfit(data);
x = linspace(binpos(1),binpos(end),100);
y = normpdf(x, muhat, sigmahat);
h(2) = line(x, y*histarea, 'Color','b', 'LineWidth',2);

%# kernel estimator
[f,x,u] = ksdensity( data );
h(3) = line(x, f*histarea, 'Color','r', 'LineWidth',2);

legend(h, {'freq hist','fitted Gaussian','kernel estimator'})

hist