如何跳出局部最小值
1. 调整初始猜测值 (P0
)
由于初始猜测值会影响优化过程,尝试多次运行代码,每次使用不同的随机初始化来生成初始参数。例如,使用多组随机的初始值,以增大找到全局最优解的可能性。
Matlab
% 使用多个初始值进行多次优化,取最优解
num_trials = 10; % 尝试10次不同的初始值
best_sol = [];
best_Bspec = inf; % 初始化为一个较大的值
for trial = 1:num_trials
P0 = rand(length(P0), 1) .* (UB - LB)' + LB'; % 每次随机生成初始值
sol = lsqcurvefit(modelFun, P0, wl, rmes, LB, UB, options);
% 比较当前解的Bspec值
if sol(8) < best_Bspec
best_Bspec = sol(8);
best_sol = sol;
end
end
% 将最终的最优解保存到Bspec_values
Bspec_values(i) = best_sol(8);
2. 使用全局优化算法
lsqcurvefit
是局部优化算法,容易陷入局部最小值。你可以尝试 MATLAB 中的全局优化工具,如 遗传算法 (Genetic Algorithm) 或 粒子群优化 (Particle Swarm Optimization) 来代替或结合局部优化。
2.1 遗传算法(GA) 可以通过探索更广的解空间来避免局部最优。
Matlab
options = optimoptions('ga', 'MaxGenerations', 100, 'PopulationSize', 50);
sol = ga(@(P) norm(procosine(P, wl, Thetas, dataSpec_filtered)' - rmes), length(P0), [], [], [], [], LB, UB, [], options);
2.2 粒子群优化(PSO) 也可以用于全局搜索。
Matlab
options = optimoptions('particleswarm', 'SwarmSize', 100, 'MaxIterations', 200);
sol = particleswarm(@(P) norm(procosine(P, wl, Thetas, dataSpec_filtered)' - rmes), length(P0), LB, UB, options);
3. 多次运行优化并随机重新启动
你可以进行多次 **lsqcurvefit
**的随机重启优化(类似于方案1),以提高找到全局最优解的机会。通过不同的随机初始值反复运行优化,找到不同的局部解,并保留最优解。
4. 使用 MultiStart
或 GlobalSearch
MATLAB 提供了 MultiStart
和 GlobalSearch
工具,它们可以在多组不同的初始值上执行局部优化,并结合多个初始点来尝试全局最优解。
Matlab
problem = createOptimProblem('lsqcurvefit', 'x0', P0, 'objective', modelFun, 'lb', LB, 'ub', UB, 'xdata', wl, 'ydata', rmes, 'options', options);
ms = MultiStart('UseParallel', true);
[sol, fval] = run(ms, problem, 50); % 尝试50个不同的初始点
5. 调节优化选项
- 降低容差:你可以进一步减小
FunctionTolerance
、OptimalityTolerance
等容差参数,让优化算法更深入地搜索。 - 增加迭代次数:你可以提高
MaxIterations
和MaxFunctionEvaluations
的值,让优化算法进行更多的搜索和评估。
6. 尝试不同的优化算法
在 lsqcurvefit
中尝试不同的算法选项,比如 'levenberg-marquardt'
,它可能在某些情况下提供更好的收敛结果。
7. 平滑目标函数
如果你的目标函数有很多局部最小值,可以尝试对数据进行平滑处理,或者在优化过程中引入一些正则化项来减小不必要的波动。
这些方法应该可以帮助你避免局部最小值,提高找到全局最优解的机会。
全局优化算法
在 MATLAB 的全局优化算法中,ga
(遗传算法)和 particleswarm
(粒子群算法)是两种常用的全局搜索算法。每个优化算法都有许多可选参数来控制其行为。
遗传算法 (ga
) 参数解释:
Matlab
options = optimoptions('ga', 'MaxGenerations', 100, 'PopulationSize', 50);
-
MaxGenerations
:这个参数表示算法允许的 最大代数。每一代中,遗传算法会对种群进行选择、交叉、变异等操作,以产生新一代的候选解。
- 在这个例子中,
MaxGenerations = 100
表示算法最多进行 100 代进化。
- 在这个例子中,
-
PopulationSize
:表示每一代的 种群大小,即每一代中包含的候选解的数量。较大的种群会增加多样性,可能导致更好的解,但计算量也会增加。
- 在这里,
PopulationSize = 50
表示每一代有 50 个候选解。
- 在这里,
粒子群优化 (particleswarm
) 参数解释:
Matlab
options = optimoptions('particleswarm', 'SwarmSize', 100, 'MaxIterations', 200);
-
SwarmSize
:这个参数控制 粒子群的大小,即算法中同时优化的解的数量。粒子群中的每个粒子代表一个候选解。
- 在这里,
SwarmSize = 100
表示粒子群中有 100 个粒子。
- 在这里,
-
MaxIterations
:表示算法允许的 最大迭代次数,即在没有找到满意解之前,算法可以运行的最大迭代次数。每次迭代,粒子群都会更新粒子的速度和位置。
- 在这里,
MaxIterations = 200
表示算法最多进行 200 次迭代。
- 在这里,
常见的其他参数(适用于 ga
和 particleswarm
等优化算法):
1. FunctionTolerance
:
控制优化终止条件之一。当目标函数的变化小于这个容差时,优化算法会终止。较小的值意味着算法会更加精确地收敛到局部最优解。
2. MaxFunctionEvaluations
:
表示最大目标函数评估次数。每次评估都是计算一个候选解的目标函数值。当达到此限制时,算法会停止。
3. Display
:
决定如何显示算法的运行过程。可选择 'off'
、'iter'
、'final'
等,'iter'
表示每次迭代都显示信息,'off'
则表示不显示。
4. UseParallel
:
是否开启并行计算。设置为 true
表示在支持的环境下启用并行处理,加速计算。
5. HybridFcn
:
可以在找到局部解之后,使用其他算法进一步优化。例如,你可以在 ga
后使用 fmincon
进一步微调解的精确度。
6. InitialPopulationMatrix
:
为遗传算法提供初始种群。如果你已经有一些可能的解,可以将它们作为种群的初始值传入。
7. CrossoverFraction
(ga
专有参数):
该参数控制每一代中有多少比例的个体会进行交叉操作(遗传组合)。默认值通常为 0.8,表示 80% 的个体会交叉产生后代。
8. MutationFcn
(ga
专有参数):
定义变异操作的函数,决定变异是如何进行的。变异可以增加种群的多样性,帮助跳出局部最小值。
9. InertiaWeight
(particleswarm
专有参数):
控制粒子群算法中的惯性权重,决定粒子在搜索空间中的运动速度。较大的惯性权重会使粒子更多地探索新区域,而较小的惯性权重则会促使粒子收敛到局部解。
10. SocialAdjustmentWeight
和 CognitiveAdjustmentWeight
(particleswarm
专有参数):
分别控制粒子在移动过程中对群体最优解和个体历史最优解的依赖程度。
查看可用的所有参数:
要查看某个优化算法的所有可用参数,你可以在 MATLAB 中使用 optimoptions
和 gaoptimset
进行查询。
Matlab
optimoptions('ga') % 查看遗传算法的所有可选项
optimoptions('particleswarm') % 查看粒子群算法的所有可选项