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

标签 matlab model-fitting

我正在编写 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

最佳答案

简短回答:检查停止条件详细信息并相应地更改停止条件:

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

问题是什么?

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

如何解决?

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

Optimization completed: The final point is the initial point. The first-order optimality measure, 7.254593e-07, is less than 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);

enter image description here

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

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

enter image description here

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

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

enter image description here

关于matlab - 用 `lsqcurvefit` 拟合高斯时初始点的局部最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45924581/

相关文章:

c++ - 在 C++ 中创建带状矩阵

algorithm - 为什么我的逻辑回归迭代重新加权最小二乘算法的权重总是以 NaN 结尾?

python - Lasso 回归模型对数据的过度拟合

machine-learning - LogesticRegression fit() 函数抛出此错误

python - 如何用插值拟合 ODE 系统?

python - 当 scipy.optimize.minimize 可能用于相同的事情时,为什么 scipy.optimize.least_squares 存在?

matlab - 在 numpy 中实现与 matlab 相同的随机数

matlab - 单元格元素作为 varargin 函数的逗号分隔输入参数

matlab - 如何在 MATLAB 中动态访问结构体的一个字段?

algorithm - Mathematica 在 NonlinearModelFit[] 中使用什么拟合算法?