我正在尝试使用 找到度数多项式的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 轴缩放?