【问题标题】:Fit polynomial to the maximums of a function将多项式拟合到函数的最大值
【发布时间】:2016-04-18 10:27:14
【问题描述】:

我想将多项式拟合到噪声数据,以便近似多项式始终 >= 原始数据。例如:

x = linspace (-2, 6);
y = (x-2).^2 + 1 + 2 * randn (size (x));

function ret = delta (P, x, y)
  yP = polyval (P, x);
  d = yP - y;
  d (d < 0) *= 1000;
  ret = sumsq (d);
endfunction

P0 = polyfit (x, y, 2);
f = @(P) delta (P, x, y);
[P, FVAL] = sqp (P0, f)

xi = linspace (min(x), max(x), 100);
yi = polyval (P, xi);

plot(x, y, xi, yi);
grid on

有没有更好的方法/方法也适用于高阶多项式?

最简单的方法是只使用 polyfit 然后计算 max(y-yi) 并将其添加为偏移量,但这不是最佳选择...

编辑:我想使用 GNU OCtave,但添加了“matlab”作为标签,因为语言和功能相似。

编辑:基于 tvo 的回答和真实数据:

x = [10 20 30 40 50 60 80 100];
y = [0.2372, 0.1312, 0.0936, 0.0805, 0.0614, 0.0512, 0.0554, 0.1407];

function ret = delta (P, x, y)
  ret = sumsq (polyval (P, x) - y);
endfunction

f = @(P) delta (P, x, y);
h = @(P) polyval(P, x) - y;

P0 = polyfit (x, y, 3);
[P] = sqp (P0, f, [], h)

xi  = linspace (min(x), max(x));
yi  = polyval (P0, xi);
yio = polyval (P, xi);

plot(x, y, xi, yi, ";initial guess;", xi, yio, ";optimized;");
grid on

但如您所见,优化和评估的多边形的点

【问题讨论】:

  • 您是否尝试过用所有数据点拟合直线,然后寻找误差最高的那些?
  • 我猜您正在寻找的是 fmincon:使用(线性)约束将范数(例如 2 范数)最小化为 FUN(公式化为矩阵 A,其大小为欲望多项式 * 数字点数)和您的观察值作为 B 从 matlab 帮助中:X = fmincon(FUN,X0,A,B) 从 X0 开始并找到函数 FUN 的最小 X,受线性不等式 A*X
  • @AlexanderKemp:看起来很有希望,但我想使用 GNU Octave,而且 fmincon 显然还没有实现。

标签: matlab octave


【解决方案1】:

你的方法看起来不错,我看不出它实际上不能用于高阶多项式。如果您认为无法使用,请说明原因。

您正在使用 Octave 的“sqp”求解器。文档在这里:http://www.gnu.org/software/octave/doc/v4.0.1/Nonlinear-Programming.html

当误差为负数时,您可能希望避免将误差乘以任意数字(在您的示例中为 1000)。对于不同的数据集,这可能会失败,特别是如果它们更大,即更多的数据点。

您可以尝试使用 Octave 的“sqp”提供的非线性不等式约束选项,即 h(x)>=0(参见文档)。

作为目标函数 phi,您可以使用平方范数误差,就像在您的示例中一样,并为每个数据点添加 h(x)>=0 形式的约束。请注意,“x”是您要拟合的多项式系数,而 h(x) 是在特定数据点评估的多项式。

例如:

phi = @(P) delta_mod (P, x, y); % mod: Don't increase the importance of negative residuals!!
h = @(P) polyval(P, x1) - y1;

Psol = sqp(P0, phi, [], h);

请注意,约束函数“h”确保多项式位于 (x1,y1) 之上,并且目标函数“phi”将尝试使其尽可能接近。您可以扩展 'h' 以包含集合中每个数据点的一个约束(请参阅 doc)。

【讨论】:

  • 我已经更新了我的答案并添加了您建议的更改的结果,但结果多项式的点
  • 嗨安迪,蓝线包含原始数据,对吗?也许将它们绘制为单独的标记(点或十字)以避免数据和拟合之间的混淆。关于这个问题,我认为设置是正确的。现在,最初的猜测P0 也位于一些数据点的下方。最终的结果实际上做得更好,但还不够好。我假设该算法声明过早收敛。查看sqp 的文档(我的答案中的链接)并使用maxitertol,看看是否有效果。查看输出中的info,了解sqp 结束的原因。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2016-10-11
  • 2014-10-05
  • 2020-01-24
  • 1970-01-01
  • 2016-06-21
  • 2018-03-16
  • 2018-08-18
相关资源
最近更新 更多