MATLAB直方图问题

时间:2016-04-06 09:46:08

标签: matlab plot graph histogram

我需要计算函数1/2-x的概率密度,其中x是0到1之间随机生成的数字。

我的代码如下所示:

n=10^6;
b=10^2;

x=(1./(2-(rand(1,n))));

a=histfit(x,b,'kernel'); % Requires Statistics and Machine Learning Toolbox
xlim([0.5 1.0])

我得到了一个像这样的体面图:

enter image description here

可能很明显,这有几个问题:

  1. MATLAB绘制的拟合与直方图不同,因为它也计算在函数[0.5 1]范围之外的空白区域。这导致朝向边缘的失真配合。 (你没看到空位的原因是因为我在那里进入了xlim)

  2. 我不知道如何将Y轴上的每个值除以10 ^ 6,这将给出我的概率密度。

  3. 提前致谢。

2 个答案:

答案 0 :(得分:3)

要解决您的两个问题,我建议您使用hist(请注意,如果您的版本高于2010b,则应使用histogram而不是histfit)来首先获取值您的直方图然后进行回归并绘制它们:

n=10^6;
b=10^2;
x=(1./(2-(rand(1,n))));

[counts,centers]=hist(x,b);
density = counts./trapz(centers, counts);
%// Thanks to @Arpi for this correction 
polyFitting = polyfit(centers,density,3)
polyPlot = polyval(polyFitting,centers)
figure
bar(centers,density)
hold on
plot(centers,polyPlot,'r','LineWidth',3)

您也可以通过调整b来提高分辨率,b当前设置为100。同时尝试不同的回归,看看你喜欢哪一个。

result looks like

答案 1 :(得分:2)

1。使用ksdensity并指定分发支持,可以获得更好的结果。

2。通过使用hist,您可以访问计数和中心,因此获得密度的标准化非常简单。

展示建议的代码:

rng(125)
n=10^6;
b=10^2;

x=(1./(2-(rand(1,n))));

subplot(1,2,1)
a = histfit(x,b,'kernel');
title('Original')
xlim([0.5 1.0])

[f,c] = hist(x,b);
% normalization to get density
f = f/trapz(c,f);

% kernel density
pts = linspace(0.5, 1, 100);
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]);

subplot(1,2,2)
bar(c,f)
hold on
plot(xk,fk, 'red', 'LineWidth', 2)
title('Improved')
xlim([0.5 1.0])

比较结果: enter image description here

编辑:如果你不喜欢结局:

pts = linspace(0.5, 1, 500);
[fk,xk] = ksdensity(x, pts, 'Support', [0.5, 1]);
bar(c,f)
hold on
plot(xk(2:end-1),fk(2:end-1), 'red', 'LineWidth', 2)
title('Improved_2')
xlim([0.5 1.0])

enter image description here