24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2961  |  回复: 9

飞鸿印雪jay

银虫 (小有名气)

[求助] 关于非线性最小二乘拟合的问题已有3人参与

我在matlab中调用这个函数LSQNONLIN,这是非线性最小二乘法,其包含两个算法,trust region reflective and Levenberg-Marquardt,但是我找到的书上是把trust region reflective法归为无约束多维极值问题,百度上还说Levenberg-Marquardt是trust region reflective法的一种?究竟是怎么样的啊?
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

感谢参与,应助指数 +1
以我的了解,Levenberg-Marquardt和trust region reflective不是同一种算法。具体可参见清华大学出版社的《最优化理论与算法》。
纠结具体算法意义不大。
直接调用该函数,用默认的算法即可,如果出现算法设置不合理,MATLAB会提示你的,到时候你换另外一个就行了。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
2楼2014-08-25 21:15:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
2楼: Originally posted by 月只蓝 at 2014-08-25 21:15:24
以我的了解,Levenberg-Marquardt和trust region reflective不是同一种算法。具体可参见清华大学出版社的《最优化理论与算法》。
纠结具体算法意义不大。
直接调用该函数,用默认的算法即可,如果出现算法设置不合 ...

谢谢啊,我看下。主要在论文当中会写到用什么算法,所以才纠结的。
3楼2014-08-27 16:34:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

引用回帖:
3楼: Originally posted by 飞鸿印雪jay at 2014-08-27 16:34:40
谢谢啊,我看下。主要在论文当中会写到用什么算法,所以才纠结的。...

你用其中一种算法,看哪种能运行得通。然后说明用了该算法即可。我印象中对于参数有约束的问题,Levenberg-Marquardt不适用,trust region reflective算法适用,在MATLAB中help LSQNONLIN,即可找到相关文献,在论文中引用即可。比如trust region reflective算法的文献:
[1] Byrd, R.H., R.B. Schnabel, and G.A. Shultz, Approximate Solution of the Trust Region
Problem by Minimization  over Two-Dimensional Subspaces,  Mathematical Programming,
247-263, 1988。
[2]  Steihaug,  T ,  The  Conjugate  Gradient  Method  and  Trust  Regions  in  Large  Scale
Optimization, SIAM Journal on Numerical Analysis, 626-637, 1983。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
4楼2014-08-27 16:58:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
2楼: Originally posted by 月只蓝 at 2014-08-25 21:15:24
以我的了解,Levenberg-Marquardt和trust region reflective不是同一种算法。具体可参见清华大学出版社的《最优化理论与算法》。
纠结具体算法意义不大。
直接调用该函数,用默认的算法即可,如果出现算法设置不合 ...

还想请教一下,我在用Levenberg-Marquardt算法时,提示Warning: The Levenberg-Marquardt algorithm does not handle bound constraints; using the trust-region-reflective algorithm instead. 好像是说不能有上下界条件,那么我就不定义上下界条件,都改为[]。可以运行,但是拟合出的K值有负值,根据物理意义,不应该有负值。于是我定义下限为0,此时只能用trust region reflective算法,但是这样一来两种算法的结果就很大不同,我不懂哪个是对的?还有就是我如果上下限都为【】时,用Levenberg-Marquardt和trust-region-reflective计算的结果也不同,这是为什么啊?
5楼2014-08-27 17:09:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

月只蓝

主管区长 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★
飞鸿印雪jay: 金币+5, 有帮助 2014-08-30 15:59:26
引用回帖:
5楼: Originally posted by 飞鸿印雪jay at 2014-08-27 17:09:10
还想请教一下,我在用Levenberg-Marquardt算法时,提示Warning: The Levenberg-Marquardt algorithm does not handle bound constraints; using the trust-region-reflective algorithm instead. 好像是说不能有上 ...

最小二乘问题,本质上是最优化问题,算法不同,找到的解不一定相同,有的算法能找到全局最优解,有的只能找到局部最优解。找出的解的优越性,可通过相关系数、决定系数来判断。Levenberg-Marquardt和trust-region-reflective算法属于局部优化算法。这正是 LSQNONLIN函数的局限性,对于多初值问题,LSQNONLIN函数的求解能力相当有限。
MATLAB、MS小问题、普通问题请发帖求助!时间精力有限,恕不接受无偿私信求助。
6楼2014-08-27 20:01:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

戴钢盔的猪头

木虫 (知名作家)

【答案】应助回帖

感谢参与,应助指数 +1
如果自己设计程序,添加惩罚函数,Levenberg-Marquardt算法也是可以实现边界不等式约束的,我就经常这么搞。另外,信赖域和LM本质上确实是非常相似的,可参考Powell, Nocedal以及Yuan等人的文献与著作。

[ 发自手机版 http://muchong.com/3g ]
7楼2014-08-28 08:22:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
6楼: Originally posted by 月只蓝 at 2014-08-27 20:01:09
最小二乘问题,本质上是最优化问题,算法不同,找到的解不一定相同,有的算法能找到全局最优解,有的只能找到局部最优解。找出的解的优越性,可通过相关系数、决定系数来判断。Levenberg-Marquardt和trust-region- ...

function six
format long
clear all
clc
tspan = [0        5        10        15        20        25        30        35        40        45        50        60        70        80        90        100        110 120];
x0 = [0.625342136        0.4277651        0.105943812        0.025723604        0.068458848        0.024280873];
k0 = [0  0  0  0  0  0  0  0   0  0  0  0  0  0  0];   %初值影响结果和拟合曲线
lb = [0  0  0  0  0  0  0   0   0   0   0  0  0  0  0];
ub = [];
options=optimset ('MaxFunEvals',900,'MaxIter', 900,'TolFun',1e-6 ,'TolX',1e-6);% 'Algorithm','levenberg-marquardt'
data=[

0.426497671        0.497339486        0.142025477        0.035090359        0.092890445        0.029854978
0.364294441        0.531501605        0.168117836        0.043136361        0.12057094        0.04928427
0.282498683        0.547077762        0.189668188        0.048822175        0.131956864        0.046858784
0.212605727        0.514167749        0.197954862        0.052949232        0.152963586        0.087585303
0.164747872        0.505213939        0.2149634        0.059265477        0.171651807        0.069189738
0.121489746        0.498609347        0.241653892        0.068929957        0.20397071        0.083896341
0.097513728        0.477379331        0.249727987        0.07289705        0.218884281        0.092080203
0.067200762        0.446186417        0.266194438        0.080524446        0.248121593        0.116558008
0.054994421        0.439029489        0.285465434        0.089772626        0.284305489        0.129282266
0.037566506        0.379466296        0.269368897        0.086289166        0.279633537        0.133442735
0.023114503        0.339137907        0.280855057        0.094689189        0.31863228        0.160250254
0.014416665        0.298370384        0.283002041        0.099613179        0.346807226        0.190914639
0.008962296        0.252702001        0.270900503        0.099468657        0.362646478        0.211507797
0.004440918        0.205484131        0.258866251        0.100635933        0.384374958        0.233976586
0.003384414        0.17228843        0.245343436        0.100783129        0.408520669        0.270125675
0.001097832        0.126954121        0.21601133        0.094095289        0.405977951        0.287462314
0.000364687        0.104930458        0.197777161        0.090126427        0.404440384        0.275667765
];
yexp = data(:,1:6);

[k,resnorm,residual,exitflag,output,lambda,jacobian] =...
lsqnonlin(@ObjFunc,k0,lb,ub,options,tspan,x0,yexp);              %非线性最小二乘   
ci = nlparci(k,residual,jacobian);                           %参数的置信区间,置信区间越窄越好
fprintf('\n\n使用函数lsqnonlin()估计得到的参数值为:\n')
fprintf('\tk(1) = %.9f ± %.9f\n',k(1),ci(1,2)-k(1))
fprintf('\tk(2) = %.9f ± %.9f\n',k(2),ci(2,2)-k(2))
fprintf('\tk(3) = %.9f ± %.9f\n',k(3),ci(3,2)-k(3))
fprintf('\tk(4) = %.9f ± %.9f\n',k(4),ci(4,2)-k(4))
fprintf('\tk(5) = %.9f ± %.9f\n',k(5),ci(5,2)-k(5))
fprintf('\tk(6) = %.9f ± %.9f\n',k(6),ci(6,2)-k(6))
fprintf('\tk(7) = %.9f ± %.9f\n',k(7),ci(7,2)-k(7))
fprintf('\tk(8) = %.9f ± %.9f\n',k(8),ci(8,2)-k(8))
fprintf('\tk(9) = %.9f ± %.9f\n',k(9),ci(9,2)-k(9))
fprintf('\tk(10) = %.9f ± %.9f\n',k(10),ci(10,2)-k(10))
fprintf('\tk(11) = %.9f ± %.9f\n',k(11),ci(11,2)-k(11))
fprintf('\tk(12) = %.9f ± %.9f\n',k(12),ci(12,2)-k(12))
fprintf('\tk(13) = %.9f ± %.9f\n',k(13),ci(13,2)-k(13))
fprintf('\tk(14) = %.9f ± %.9f\n',k(14),ci(14,2)-k(14))
fprintf('\tk(15) = %.9f ± %.9f\n',k(15),ci(15,2)-k(15))
fprintf('The sum of the squares is: %.9e\n\n',resnorm)
fprintf('The value of the exitflag is: %.9e\n\n',exitflag)
output

function f = ObjFunc(k,tspan,x0,yexp)                            % 目标函数
[t, Xsim] = ode45(@KineticsEqs,tspan,x0,[],k); %四阶,五级Runge-Kutta单步算法
Xsim1=Xsim(:,1);
Xsim2=Xsim(:,2);
Xsim3=Xsim(:,3);
Xsim4=Xsim(:,4);
Xsim5=Xsim(:,5);
Xsim6=Xsim(:,6);

ysim(:,1) = Xsim1(2:end);
ysim(:,2) = Xsim2(2:end);
ysim(:,3) = Xsim3(2:end);
ysim(:,4) = Xsim4(2:end);
ysim(:,5) = Xsim5(2:end);
ysim(:,6) = Xsim6(2:end);

size(ysim(:,1));
size(ysim(:,2));
size(ysim(:,3));
size(ysim(:,4));
size(ysim(:,5));
size(ysim(:,6));

size(yexp(:,1));
size(yexp(:,2));
size(yexp(:,3));
size(yexp(:,4));
size(yexp(:,5));
size(yexp(:,6));

R2=1-sum((ysim-yexp).^2)./sum((mean(ysim)-yexp).^2);
fprintf('\n\t决定系数R-Square = %.6f',R2);

f = [(ysim(:,1)-yexp(:,1)) (ysim(:,2)-yexp(:,2)) (ysim(:,3)-yexp(:,3)) (ysim(:,4)-yexp(:,4)) (ysim(:,5)-yexp(:,5)) (ysim(:,6)-yexp(:,6))];%
%拟合结果标绘
plot(tspan(2:end),yexp(:,1),'bx',t,Xsim(:,1),'b-',tspan(2:end),yexp(:,2),'bx',t,Xsim(:,2),'b-',tspan(2:end),yexp(:,3),'bx',t,Xsim(:,3),'b-',tspan(2:end),yexp(:,4),'bx',t,Xsim(:,4),'b-',tspan(2:end),yexp(:,5),'bx',t,Xsim(:,5),'b-',tspan(2:end),yexp(:,6),'bx',t,Xsim(:,6),'b-')
xlabel('time(min)')
ylabel('concentration(mg/mL)')
legend('cAexp','cAcal','cBexp','cBcal') %,'cDexp','cDcal','cEexp','cEcal','cFexp','cFcal'

function dCdt = KineticsEqs(t,C,k)                                  % ODE模型方程
dCAdt =-(k(1)+k(2)+k(3)+k(4)+k(5))*C(1);                            %注意负号不能少!!!
dCBdt =k(1)*C(1)-(k(6)+k(7)+k(8)+k(9))*C(2);
dCCdt =k(2)*C(1)+k(6)*C(2)-(k(10)+k(11)+k(12))*C(3);
dCDdt =k(3)*C(1)+k(7)*C(2)+k(10)*C(3)-(k(13)+k(14))*C(4);
dCEdt =k(4)*C(1)+k(8)*C(2)+k(11)*C(3)+k(13)*C(4)-k(15)*C(5);
dCFdt = k(5)*C(1)+k(9)*C(2)+k(12)*C(3)+k(14)*C(4)+k(15)*C(5);
dCdt = [dCAdt; dCBdt;dCCdt;dCDdt;dCEdt;dCFdt]; %



我想将R2算出来,但是计算时提示维数不对,改了半天,但是还是改不出来,麻烦大神给看下。还有对我的这个程序,大神能不能帮忙看下有什么地方还能修改的?希望能提出宝贵意见。由于参数多于方程,我一直担心拟合的多值问题。不知道拟合到什么程度算是达到标准了?我试过将算出的k值带入,返算各个C的值,任有部分c值的平均误差大于10%,这是我返算后得到的相对误差。(-12.39%         -4.19%        -4.26%        -11.89%        -3.83%        -6.72%)不知道还能怎么改进了。
还有k的初值,是不是用1stop跑下才能定比较好呢?谢谢大神!!!
8楼2014-08-29 18:24:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingd

铁杆木虫 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★
飞鸿印雪jay: 金币+5, ★★★很有帮助 2014-08-30 15:59:09
你的tspan数据是18项,data数据里只有17项,是否是维数不对的原因?

1stOpt求解:
CODE:
Parameter k(15);
Variable t, C(6);
ParameterDomain = [0,];
ODEFunction
C1' =-(k1+k2+k3+k4+k5)*C1;
C2' =k1*C1-(k6+k7+k8+k9)*C2;
C3' =k2*C1+k6*C2-(k10+k11+k12)*C3;
C4' =k3*C1+k7*C2+k10*C3-(k13+k14)*C4;
C5' =k4*C1+k8*C2+k11*C3+k13*C4-k15*C5;
C6' = k5*C1+k9*C2+k12*C3+k14*C4+k15*C5;
Data;
0        0.426497671        0.497339486        0.142025477        0.035090359        0.092890445        0.029854978
5        0.364294441        0.531501605        0.168117836        0.043136361        0.12057094        0.04928427
10        0.282498683        0.547077762        0.189668188        0.048822175        0.131956864        0.046858784
15        0.212605727        0.514167749        0.197954862        0.052949232        0.152963586        0.087585303
20        0.164747872        0.505213939        0.2149634        0.059265477        0.171651807        0.069189738
25        0.121489746        0.498609347        0.241653892        0.068929957        0.20397071        0.083896341
30        0.097513728        0.477379331        0.249727987        0.07289705        0.218884281        0.092080203
35        0.067200762        0.446186417        0.266194438        0.080524446        0.248121593        0.116558008
40        0.054994421        0.439029489        0.285465434        0.089772626        0.284305489        0.129282266
45        0.037566506        0.379466296        0.269368897        0.086289166        0.279633537        0.133442735
50        0.023114503        0.339137907        0.280855057        0.094689189        0.31863228        0.160250254
60        0.014416665        0.298370384        0.283002041        0.099613179        0.346807226        0.190914639
70        0.008962296        0.252702001        0.270900503        0.099468657        0.362646478        0.211507797
80        0.004440918        0.205484131        0.258866251        0.100635933        0.384374958        0.233976586
90        0.003384414        0.17228843        0.245343436        0.100783129        0.408520669        0.270125675
100        0.001097832        0.126954121        0.21601133        0.094095289        0.405977951        0.287462314
110        0.000364687        0.104930458        0.197777161        0.090126427        0.404440384        0.275667765

均方差(RMSE):0.0117362257945764
残差平方和(SSE):0.0132229436065228
相关系数(R): 0.975470953559367
相关系数之平方(R^2): 0.951543581238022
确定系数(DC): 0.931561811072389
F统计(F-Statistic): 6.71001796921087

参数                  最佳估算
--------------------        -------------
k1        0.0418596441571267
k2        2.79667520548361E-15
k3        0.00417748060126059
k4        9.1607798493403E-17
k5        0.002587391875802
k6        0.0129169740911302
k7        6.28738094929527E-27
k8        0.00711557400407817
k9        4.45038192613903E-19
k10        0.00176044626727443
k11        0.00588665699827607
k12        0.00711101883579135
k13        3.65140745025477E-18
k14        5.96964429169975E-15
k15        0.00230341081562437
9楼2014-08-29 22:53:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

飞鸿印雪jay

银虫 (小有名气)

引用回帖:
9楼: Originally posted by dingd at 2014-08-29 22:53:02
你的tspan数据是18项,data数据里只有17项,是否是维数不对的原因?

1stOpt求解:

Parameter k(15);
Variable t, C(6);
ParameterDomain = ;
ODEFunction
C1' =-(k1+k2+k3+k4+k5)*C1;
C2' =k1*C1-(k6+k7 ...

好像不是这个原因吧,下面取值是从5min时候开始取的
10楼2014-08-30 15:58:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 飞鸿印雪jay 的主题更新
信息提示
请填处理意见