在尝试在直方图上叠加pdf(概率密度函数)值时,我遇到了明显的缩放问题,因为直方图在我的图表上几乎看不到。这可能是由于下面代码中使用的缩放因子,否则密度曲线会很小。我处于困境,因此想知道是否有一种更好的方式来实现这项任务而不诉诸 adhoc 比例因子?
bmin=min(b);
bmx=max(b);
nrow=length(b);
nbin=sqrt(nrow);
pd = fitdist(b,'Normal');
p = stblfit(b,'ecf');
x_pdf=[bmin:0.0025:bmax];
y=pdf(pd,x_pdf);
hist(b,nrow);
h = findobj(gca, 'Type','patch');
h.FaceColor=[0 0 0];
hold on;
scale = 0.156*max(y);
plot(x_pdf,y.*scale,'or');
hold on;
scale2 = 0.24*max(y);
plot(x_pdf,stblpdf(x_pdf,p(1),p(2),p(3),p(4)).*scale2,'k-');
legend('P&L distribution','Normal fit', 'ecf fit')
由于
答案 0 :(得分:1)
在绘制直方图时,y轴表示特定间隔的计数数。如果您有更长或更短的输入向量,直方图的值将非常不同。直方图可以用作概率密度(PDF)的近似值,但为此您需要正确地缩放它。从-infinity到+ infinity的PDF积分必须为1,因此我们需要相应地缩放直方图。
您仍然可以使用hist
命令,但不是使用它来生成直方图,而是从中获取计数值。然后,通过简单地计算积分并将矢量除以该矢量,可以将该矢量缩放为具有1的积分。
% Generate some arbitrary gaussian distribution
b = randi(10) + randi(10) .* randn(10000,1);
bmin = min(b);
bmax = max(b);
% Calculate histogram
[counts,bins] = hist(b,100);
% Scale histogram to get the pdf
est_pdf = counts / sum(counts * mean(diff(bins)));
% Estimate pdf using fitdist
pd = fitdist(b,'Normal');
x_pdf = linspace(bmin,bmax,1000);
y_pdf = pdf(pd,x_pdf);
% Plot everything
figure;
hold on;
bar(bins,est_pdf);
plot(x_pdf, y_pdf, '-r');
hold off;
注意:我通过将counts
乘以直方图的平均间隔宽度来计算计数的积分,因为并非所有的间隔都完全相等。这是积分的近似值,但它应该足够精确。