1

我正在尝试使用 找到度数多项式的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脚本。

到目前为止一切都很好,这适用于次数高达 2 的多项式(即length(pars) <= 3)。有了上面的测试数据,它甚至polyfit在准确率上都超过了。但是,一旦我尝试拟合度数高于 2 的多项式,就会fminunc在初始迭代后立即停止说

优化停止,因为目标函数不能在当前搜索方向上减小。要么是目标函数的预测变化,要么是线搜索间隔小于 eps。

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

我的感觉是一些数字问题阻止fminunc了它的工作。也许梯度太高了,我也需要一些 y 轴缩放?

4

1 回答 1

0

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

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 值和高精度要求的应用,“手动”最小二乘最小化可能更可取。

于 2018-01-18T13:43:41.413 回答