我需要计算函数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])
我得到了一个像这样的体面图:
可能很明显,这有几个问题:
MATLAB绘制的拟合与直方图不同,因为它也计算在函数[0.5 1]
范围之外的空白区域。这导致朝向边缘的失真配合。 (你没看到空位的原因是因为我在那里进入了xlim)
我不知道如何将Y轴上的每个值除以10 ^ 6,这将给出我的概率密度。
提前致谢。
答案 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。同时尝试不同的回归,看看你喜欢哪一个。
答案 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])
编辑:如果你不喜欢结局:
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])