0

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

4

3 回答 3

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 中数字的计数,而密度函数被归一化以积分为 1。如果您在一个 bin 中有数百个项目,则密度函数无法在比例上匹配它,因此您会遇到缩放或归一化问题。要么你必须标准化直方图,要么绘制一个缩放分布函数。我更喜欢缩放分布函数,以便在查看直方图时我的计数是有意义的:

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

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

于 2013-04-19T18:30:07.907 回答
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) 在该域上的积分将近似为一。但是我们知道,任何直方图下的面积都恰好等于样本总数乘以 bin-width。

因此,使 pdf 与直方图一致的一个非常简单的比例因子是 Ns*Wb,即样本点的总数乘以 bin 的宽度。

于 2013-04-19T19:11:45.163 回答
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'})

历史

于 2013-04-19T19:23:49.247 回答