分布拟合和直方图叠加(缩放问题)- MATLAB
Distribution fitting and histogram overlay (scaling matter) - MATLAB
在尝试在直方图上叠加 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')
谢谢
在绘制直方图时,y 轴表示特定时间间隔内的计数。如果您有更长或更短的输入向量,直方图的值将非常不同。直方图可用作概率密度 (PDF) 的近似值,但为此您需要正确缩放它。 PDF 从 -infinity 到 +infinity 的积分必须为 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
乘以直方图的平均间隔宽度来计算计数的积分,因为并非所有间隔都完全相同。这是积分的近似值,但应该足够精确了。
在尝试在直方图上叠加 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')
谢谢
在绘制直方图时,y 轴表示特定时间间隔内的计数。如果您有更长或更短的输入向量,直方图的值将非常不同。直方图可用作概率密度 (PDF) 的近似值,但为此您需要正确缩放它。 PDF 从 -infinity 到 +infinity 的积分必须为 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
乘以直方图的平均间隔宽度来计算计数的积分,因为并非所有间隔都完全相同。这是积分的近似值,但应该足够精确了。