如何将均匀分布拟合到直方图



我有一组数据是从均匀分布生成的。现在我想将相应的直方图拟合为均匀分布,这样就有一个'ㄇ'直方图上绘制的线的形状。我试图通过使用MATLAB内置函数histfit来拟合它,但对于histfit,没有这样的均匀分布选项。我该怎么做?

data = unifrnd(-100,100,1000,1);
%% MATLAB built-in function: 'histfit'
figure(1);
hh = histfit(data); % No options for 'histfit' to fit data to an uniform distribution
%% Manually fitting a histogram to an uniform distribution
figure(2);
numBars = length(hh(1).XData);
histogram(data, numBars);
% TODO: How to do next to plot a line that fits the data to an uniform distribution?

由于区域[a,b(的均匀分布仅为1/(b-a(,因此可以定义一个计算的函数

x = -200:200;
y = unifdist(x, -100, 100);
figure;
plot(x, y)
function ret = unifdist(x, a, b)
ret = ones(length(x), 1)/(b-a);
ret(x < a | x >= b) = 0;
end

也许有一种更简单、更快的方法可以做到这一点,但它确实有效。

min(data)max(data)给出了均匀分布的两个参数的估计,假设data是均匀分布的。

请注意,这是一个有偏差的估计器,请参阅此处以获得消除偏差的校正(其中一个答案考虑下限不为0的情况(。[链接感谢@flawr.]

作为@CrisLuengo答案的替代方案,您可以使用矩量法来估计均匀分布U[a,b]的参数a,b。以下方程足以求解这些参数。MoM只是告诉我们将(样本(均值和方差等同于分布均值和方差:

mean(samples) = (a+b)/2,    variance(samples) = (b-a)^2/12

这导致a, b = mean(samples) +- sqrt(3 * variance(samples))。在MATLAB中,您可以计算如下:

m = mean(data);
v = var(data);
a = m - sqrt(3*v);
b = m + sqrt(3*v);

要绘制此图,您可以定义矢量

x = linspace(-lower_limit, upper_limit, number_of_points);
y = (a < x) .* (x < b) ./ (b - a);
plot(x, y, '-r');

最新更新