0

我有 5 个非参数模型,都有 5 到 8 个参数。该模型用于拟合纵向数据 y(t),其中 t 为时间。每个数据文件都适合所有 5 个模型进行比较。模型本身不能更改。

使用初始值进行拟合,并使用 levenberg-marquardt 算法将这些值拟合到 lsqcurvefit 模型中。所以我为几个模型和一个曲线拟合函数编写了一个脚本

如果我执行曲线拟合,很多起始值都会漂移到极值。这是我要避免的事情,因为这些参数应该保持在其起始值附近,并且应该只在明确定义的范围之间变化,或者只包括标准偏差内的曲线拟合。这里要注意的重要一点是这个限制应该在曲线拟合期间(迭代计算技术)而不是之后施加。

我为使模型适应高度而编写的函数:

% Fit a specific model for all valid persons
    try
        opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt'); 
        [personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
    catch
        x=1;
    end

我为我的一个模型编写的函数

   elseif strcmpi(model,'jpss')
    % y = h_1(1-(1/(1+((t+0.75)^c_1/d_1)+((t+0.75)^c_2/d_2)+((t+0.75)^c_3/d_3)))
%     heightModel = @(params,ages) params(1).*(1-1./(1+((ages+0.75).^params(2))./params(3) + ((ages+0.75).^params(4))./params(5) + ((ages+0.75).^params(6))./params(7)));
    heightModel = @(params,ages) params(1).*(1-1./(1+(((ages+0.75)./params(3)).^params(2)) + (((ages+0.75)./params(5)).^params(4)) + ((ages+0.75)./params(7)).^params(6))); % Adapted 25/07
    modelStrings = {'h1','c1','d1','c2','d2','c3','d3'};

    % Define initial values
if strcmpi('male',gender)
    initialValues = [174.8 0.6109 2.9743 3.614 9.88 22.393 13.59];
else
    initialValues = [162.7 0.6546 2.43 4.011 8.579 18.394 11.846];
end    

我想做的事:

是否可以对每个起始值 @initial 值进行限制?我认为对 lsqcurvefit 施加限制不是一个好主意,因为不同的模型具有不同的起始值和不同的允许范围。

我脑子里有两件事:1. 使用范围并将其放在初始值之间 initialValues = [162.7 0.6546 2.43 4.011 8.579 18.394 11.846]` if range a1=[150,180]; 范围 a2=[0.3,0.8] 等等

  1. 如果 Heightmodel='name model' 初始值* 1.2 和 lb = 初始值* 0.8,则在 lsqcurvefit 之间的所有初始值上分别放置 lb 和 ub 限制

有人可以给我一些提示或指示,因为我无法使其工作。

提前致谢

露西

有人可以帮我吗

4

1 回答 1

0

您声明:有不同的模型具有不同的起始值和 允许的不同范围。这是您可以使用ub和的地方lb。文档中概述了如何执行此操作lsqcurvefit

X=LSQCURVEFIT(FUN,X0,XDATA,YDATA,LB,UB) defines a set of lower and
upper bounds on the design variables, X, so that the solution is in the
range LB <= X <= UB. Use empty matrices for LB and UB if no bounds
exist. Set LB(i) = -Inf if X(i) is unbounded below; set UB(i) = Inf if
X(i) is unbounded above.

例如,在以下示例中,参数在拟合期间被限制在限制范围内。下限 ( lb) 和上限 ( ub) 分别设置为低于和高于起始值的 20%。

heightModel = @(params,ages) abs(params(1).*(1-1./(1+(params(2).* (ages+params(8) )).^params(5) +(params(3).* (ages+params(8) )).^params(6) +(params(4) .*(ages+params(8) )).^params(7) )));
initialValues = [161.92 0.4173 0.1354 0.090 0.540 2.87 14.281 0.3701];
lb = 0.8*initialValues; % <-- lower bound is 20% smaller than initial par values
ub = 1.2*initialValues;
[parsout,resnorm,residual] = lsqcurvefit(heightModel,initialValues,t,ht,lb,ub);
于 2013-08-19T13:30:08.457 回答