我正在尝试使用Matlab的nlinfit函数来估计x,y配对数据的最佳拟合高斯。在这种情况下,x是2D方向的范围,y是“是”响应的概率。
我从相关帖子中复制了@norm_funct,我想返回一个平滑的,正态分布,最接近y中观察到的数据,并返回最佳拟合pdf的幅度,平均值和SD。目前,拟合函数似乎缩放不正确且不够平滑 - 任何帮助都非常赞赏!
x = -30:5:30;
y = [0,0.20,0.05,0.15,0.65,0.85,0.88,0.80,0.55,0.20,0.05,0,0;];
% plot raw data
figure(1)
plot(x, y, ':rs');
axis([-35 35 0 1]);
% initial paramter guesses (based on plot)
initGuess(1) = max(y); % amplitude
initGuess(2) = 0; % mean centred on 0 degrees
initGuess(3) = 10; % SD in degrees
% equation for Gaussian distribution
norm_func = @(p,x) p(1) .* exp(-((x - p(2))/p(3)).^2);
% use nlinfit to fit Gaussian using Least Squares
[bestfit,resid]=nlinfit(y, x, norm_func, initGuess);
% plot function
xFine = linspace(-30,30,100);
figure(2)
plot(x, y, 'ro', x, norm_func(xFine, y), '-b');
非常感谢
答案 0 :(得分:1)
如果您的数据实际上表示您期望来自正态分布数据的概率估计值,则拟合曲线不是估计该正态分布参数的正确方法。有不同的复杂方法;其中最简单的是method of moments,这意味着您可以选择参数,使理论分布的时刻与样本的时刻相匹配。在正态分布的情况下,这些时刻只是均值和方差(或标准差)。这是代码:
% normalize y to be a probability (sum = 1)
p = y / sum(y);
% compute weighted mean and standard deviation
m = sum(x .* p);
s = sqrt(sum((x - m) .^ 2 .* p));
% compute theoretical probabilities
xs = -30:0.5:30;
pth = normpdf(xs, m, s);
% plot data and theoretical distribution
plot(x, p, 'o', xs, pth * 5)
结果表明合适:
你会注意到最后一行的因子5。这是因为您没有对整个值范围进行概率(密度)估计,而是从距离为5的点进行估计。在我的处理中,我假设它们对应于概率密度上的积分,例如在[x - 2.5,x + 2.5]的区间内,可以通过将中间的密度乘以区间的宽度来粗略近似。我不知道这种解释对您的数据是否正确。
您的数据遵循高斯曲线,并将其描述为概率。这些数字(y
)是您的原始数据 - 或者您是否从例如更大数据集上的直方图?如果是后者,则可以通过使用原始完整数据来改进分布参数的估计。