首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用“l平方曲线”拟合高斯时初始点的局部最小值

用“l平方曲线”拟合高斯时初始点的局部最小值
EN

Stack Overflow用户
提问于 2017-08-28 17:39:19
回答 1查看 2.2K关注 0票数 3

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

有人能不能给我一些建议,说明这里可能出了什么问题?我知道,如果猜测远离‘真’值,那么这是可能的,但我期望MATLAB返回一个更接近真值的答案。改进对[29,0]的初始猜测(这比实际值更接近)将产生相同的输出:初始值是一个局部最小值。

代码语言:javascript
复制
%%%%%%%%%%

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')

输出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-28 19:38:01

简短回答:检查停止标准的详细信息,并相应地更改停止标准:

代码语言:javascript
复制
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. 优化度量选项相对一阶最优性= 7.25e-07 OptimalityTolerance = 1e-06 (默认)

所以,你应该降低OptimalityTolerance (f.e。(致1e-16):

代码语言:javascript
复制
options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16);
xfit = lsqcurvefit(@testfunction,[19,-4],xdata, ydata, [], [], options);

上面的图像显示了新的结果,这比以前的效果要好,但还不是很好。通过再次检查停止条件,您将看到还需要更改FunctionTolerance

代码语言:javascript
复制
options = optimoptions('lsqcurvefit','OptimalityTolerance', 1e-16, 'FunctionTolerance', 1e-16);

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

注意,您需要调整停止条件,因为您的函数返回相对较小的值。在没有任何选项规范的情况下,将z乘以1000因子也会得到一个很好的匹配:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45924581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档