在 Matlab 中使用 fminsearch 时如何解决局部最小值问题?
How to solve local minimum issue when using fminsearch in Matlab?
我在Matlab中使用'fminsearch'解决价值函数迭代问题。
parfor i_a = 1:Na %Loop over state variable a
for i_d = 1:Nd %Loop over state variable d
for i_y = 1:Ny %Loop over state variable y
for i_t = 1:Nt %Loop over state variable y
[adj_sol, adjval] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
这里,[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)]
是fminsearch的起点。
但是,结果似乎不正确,因为它给了我局部最小值。
所以我给出了四个不同的起点,并从三个中选择最小值,结果似乎是合理的。
[adj_sol1, adjval1] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol2, adjval2] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs1(i_a,i_d,i_y,i_t); xs2(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol3, adjval3] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs3(i_a,i_d,i_y,i_t); xs4(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol4, adjval4] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs5(i_a,i_d,i_y,i_t); xs6(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
adjval = min([adjval1, adjval2, adjval3, adjval4]);
if adjval == adjval1
adj_sol = adj_sol1;
elseif adjval == adjval2
adj_sol = adj_sol2;
elseif adjval == adjval3
adj_sol = adj_sol3;
elseif adjval == adjval4
adj_sol = adj_sol4;
end
但是,使用四个不同的起点非常耗时,所以我想知道是否有另一种方法可以处理这个局部最小值问题并且比仅使用多个起点更有效(在速度方面)。
提前致谢。
多个起点是局部优化算法的众所周知的做法。也许你可以尝试不同的算法,比如模拟退火。
如果您不知道函数的梯度,另一种方法是使用全局优化算法,如 DIRECT(分割矩形)或贝叶斯优化
我在Matlab中使用'fminsearch'解决价值函数迭代问题。
parfor i_a = 1:Na %Loop over state variable a
for i_d = 1:Nd %Loop over state variable d
for i_y = 1:Ny %Loop over state variable y
for i_t = 1:Nt %Loop over state variable y
[adj_sol, adjval] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
这里,[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)]
是fminsearch的起点。
但是,结果似乎不正确,因为它给了我局部最小值。
所以我给出了四个不同的起点,并从三个中选择最小值,结果似乎是合理的。
[adj_sol1, adjval1] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[x0(i_a,i_d,i_y,i_t); x1(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol2, adjval2] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs1(i_a,i_d,i_y,i_t); xs2(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol3, adjval3] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs3(i_a,i_d,i_y,i_t); xs4(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
[adj_sol4, adjval4] = fminsearchbnd(@(x) ...
-adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd), ...
[xs5(i_a,i_d,i_y,i_t); xs6(i_a,i_d,i_y,i_t)],...
[A(1); D(1)],[A(end); D(end)],options);
adjval = min([adjval1, adjval2, adjval3, adjval4]);
if adjval == adjval1
adj_sol = adj_sol1;
elseif adjval == adjval2
adj_sol = adj_sol2;
elseif adjval == adjval3
adj_sol = adj_sol3;
elseif adjval == adjval4
adj_sol = adj_sol4;
end
但是,使用四个不同的起点非常耗时,所以我想知道是否有另一种方法可以处理这个局部最小值问题并且比仅使用多个起点更有效(在速度方面)。
提前致谢。
多个起点是局部优化算法的众所周知的做法。也许你可以尝试不同的算法,比如模拟退火。
如果您不知道函数的梯度,另一种方法是使用全局优化算法,如 DIRECT(分割矩形)或贝叶斯优化