如何将均匀分布拟合到直方图?
How to fit an uniform distribution to a histogram?
我有一组从均匀分布生成的数据。现在我想将相应的直方图拟合成均匀分布,以便在该直方图上绘制一条 'ㄇ' 形状的线。我试图通过使用 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?
min(data)
和max(data)
给出了对均匀分布的两个参数的估计,假设data
是均匀分布的。
请注意,这是一个有偏差的估计量,请参阅 here 以进行修正以消除偏差(其中一个答案考虑了下限不为 0 的情况)。 [Link感谢@flawr。]
由于区域 [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
可能有更简单、更快捷的方法来做到这一点,但它确实有效。
作为@CrisLuengo 答案的替代方案,您可以使用Method of Moments 来估计均匀分布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');
我有一组从均匀分布生成的数据。现在我想将相应的直方图拟合成均匀分布,以便在该直方图上绘制一条 'ㄇ' 形状的线。我试图通过使用 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?
min(data)
和max(data)
给出了对均匀分布的两个参数的估计,假设data
是均匀分布的。
请注意,这是一个有偏差的估计量,请参阅 here 以进行修正以消除偏差(其中一个答案考虑了下限不为 0 的情况)。 [Link感谢@flawr。]
由于区域 [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
可能有更简单、更快捷的方法来做到这一点,但它确实有效。
作为@CrisLuengo 答案的替代方案,您可以使用Method of Moments 来估计均匀分布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');