用`lsqcurvefit`拟合高斯时初始点的局部最小值

Posted

技术标签:

【中文标题】用`lsqcurvefit`拟合高斯时初始点的局部最小值【英文标题】:Local minimum at initial point when fitting gaussian with `lsqcurvefit` 【发布时间】:2018-02-06 01:16:11 【问题描述】:

我正在编写 MATLAB 代码,目的是进行一些拟合。我使用二阶高斯(参见下面的代码)模拟了一个绘图,并尝试使用 lsqcurvefit 函数进行拟合。不幸的是,MATLAB 返回与“优化”参数相同的猜测值,并且显然陷入了局部最小值。

有人可以就这里可能出现的问题提供一些建议吗?我知道如果猜测远离“真实”值,那么这可能会发生,但我希望 MATLAB 返回一个更接近真实值的答案。将初始猜测改进为[29,0](更接近实际值)会得到相同的输出:初始值是局部最小值。

%%%%%%%%%%

function z= testfunction(x, xdata);

sigma=x(1)/(2*sqrt(2*log(2)));

z=((xdata.^2-2*x(2)*xdata-sigma.^2+x(2)^2)./(sigma^5*sqrt(2*pi))).*exp(-(xdata-x(2)).^2/(2.*sigma.^2));

end
%%%%%%%%


% Simulate Data

xdata= -50:1:50;

ydata = testfunction([30,0],xdata);

% Fit Data 

xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata );

xfit(1)
xfit(2)

yfit=testfunction([xfit(1),xfit(2)],xdata);

% Plot Data;
plot(xdata,yfit);
hold on;
plot(xdata,ydata,'o')

输出:

Initial point is a local minimum.

Optimization completed because the size of the gradient at the initial point 
is less than the default value of the optimality tolerance.

<stopping criteria details>


ans =

    19


ans =

    -4

【问题讨论】:

您可以访问曲线拟合工具箱吗? fit function with 'gauss2' option 可能更容易使用。 感谢您的回答。是的,我确实有它,但我希望以这种方式进行拟合,以使其成为未来使用的通用代码。目前,我有兴趣了解问题可能是什么。这是否与求解器有关,或者 lsqcurvefit 函数在这种情况下不是最好的? 【参考方案1】:

简答:检查停止条件详情并相应更改停止条件:

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

有什么问题?

lsqcurvefit 是一个数值求解器,因此使用停止标准来确定是否充分达到了局部最小值。通常,您永远无法找到确切的解决方案。因此,您的问题的解决方案是更改停止条件以请求更准确的解决方案。

如何解决?

通过点击停止条件详细信息,您会收到以下说明:

优化完成:终点为起点。这 一阶最优性度量,7.254593e-07,小于 options.OptimalityTolerance = 1.000000e-06.

Optimization Metric                                       Options 
relative first-order optimality =   7.25e-07  OptimalityTolerance =   1e-06 (default)

所以,你应该减少OptimalityTolerance(例如到1e-16):

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

上图可视化了新的结果,比上一张要好,但还不是很好。通过再次检查停止条件,您会发现您还需要更改FunctionTolerance

options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);

为什么默认选项那么糟糕?

请注意,您需要调整停止条件,因为您的函数返回的值相对较小。将z1000 相乘,没有任何选项说明也会得到很好的拟合:

【讨论】:

非常感谢。我不知道可以轻松更改优化设置。我现在很清楚,如果我被这种合适的例行程序卡住了,将来要寻找什么。再次感谢!

以上是关于用`lsqcurvefit`拟合高斯时初始点的局部最小值的主要内容,如果未能解决你的问题,请参考以下文章

matlab拟合曲线的方法有几种

MATLAB 非线性最小二乘拟合 lsqnonline 和 lsqcurvefit

matlab 二维数据点 光滑曲线

用python拟合直方图

高斯拟合代码

这是拟合从python中的高斯分布生成的数据的正确方法吗?