使用fminunc拟合度数> 2的多项式

时间:2018-01-17 17:03:38

标签: matlab least-squares polynomial-approximations

我试图使用n找到度fminunc的多项式的系数。我知道polyfit但我必须使用fminunc(或lsqnonlin),因为我需要在稍后扩展我的模型。无论如何,我的目标函数只是非线性最小二乘问题,我应用了polyfit使用的相同的居中和缩放方法:

tmpx = (xdat-mean(xdat))./std(xdat) % centering/scaling
x0 = zeros(degree+1, 1); % initial point
objfctn = @(pars) mdl(pars, tmpx, ydat)

function [ sse, grad ] = mdl( pars, xdat, ydat )
    est = polyval(pars, xdat)-ydat;
    sse = sum(est.^2);

    degree = length(pars)-1;

    grad = [];
    for d = 0:degree
        grad = [sum(2*est.*(xdat.^d)); grad]; %#ok<AGROW>
    end
end

然后,我根据从目标测量数据集中得到的一些启发式算法生成了一些测试数据:

degree = 2;
tpars = [ ... % true parameters
    randraw('uniform', [-5e-20, 5e-20], 1), ...
    randraw('uniform', [-10e-20, 10e-20], 1), ...
    randraw('uniform', [-20e-9, 20e-9], 1), ...
    randraw('uniform', [-50e-6, 50e-6], 1), ...
    randraw('uniform', [0, 89e9], 1)];
tpars = tpars(end-degree:end);
xdat = sort(randi(1800e9, 100e3, 1));
yreal = polyval(tpars, xdat);
ydat = yreal + randraw('norm', [0, 100], length(xdat));

使用着名的randraw脚本here

到目前为止,这很适用于程度高达2的多项式(即length(pars) <= 3)。使用上述测试数据,它甚至可以准确地超过polyfit。但是,只要我尝试拟合度数大于2的多项式,fminunc就会在初始迭代后立即停止

  

优化已停止,因为目标函数无法在当前搜索方向上降低。目标函数的预测变化或行搜索间隔小于eps。

然而,polyfit仍然能够拟合多项式,尽管误差越来越大。任何人都知道如何使用fminunc拟合更高次多项式?

我的感觉是,一些数字问题阻止fminunc完成其工作。也许渐变太高了,我也需要一些y轴缩放?

1 个答案:

答案 0 :(得分:0)

似乎我对y轴缩放的猜测是正确的,如果SSE很高,fminunc似乎有一些数值问题。我通过简单地对y轴应用与x轴相同的缩放来解决问题:

scaling_factor = std(ydat);
ydat_scaled = ydat / scaling_factor;
% fit the polynomial to ydat_scaled using fminunc or lsqnonlin
result = result * scaling_factor;

我用最多4度的多项式测试了这种方法,它就像一个魅力。根据所得多项式与原始多项式的均方根偏差,fminunc比polyfit表现更好。具体来说,我为0-4每个学位进行了100次运行,每次运行都有一组新的测试数据(参见上面的问题)。 100次运行的平均RMSE为:

  • 度= 0:avgrmse_fminunc = 0.2608avgrmse_polyfit=0.2608
  • 度= 1:avgrmse_fminunc = 0.3810avgrmse_polyfit=0.3809
  • 度= 2:avgrmse_fminunc = 2.5897avgrmse_polyfit=53.3994
  • 度= 3:avgrmse_fminunc = 34.0733avgrmse_polyfit=340.6380
  • 度= 4:avgrmse_fminunc = 5.2805e+13avgrmse_polyfit=2.9255e+14

这些结果表明,对于具有高SSE值和高精度要求的应用,可以使用&#34;手册&#34;最小二乘最小化可能更可取。