在 Matlab 中,我知道如何编写多维优化程序。但我想动态选择要优化的变量子集。
假设我有一个三维变量向量,但我希望 Matlab 只优化第一个和第二个变量。如何做到这一点?
x1 = 0:5; p_true = [1 2 3]; % True parameters
y1 = polyval(p_true, x1); % True data
yn = y1 + sin(x1); % Noisy data
optimizationOptions = optimset('Display', 'final', 'TolFun', 1e-7, 'MaxFunEvals', 1e5,...
'MaxIter', 1e4);
p0 = [0.5 0.75 1]; % Initial guess
[p1, ~, ~, optOut] = fminsearch(@(parameters) objFunB(parameters, x1, yn), p0,...
optimizationOptions);
plot(x1, yn, 'rx');
hold on
plot(x1, polyval([p1(1:2) 3], x1), 'b');
function rmse = objFunB(parameters, x1, yn)
% Manipulate third component to be fixed; still, fminsearch tries adjusting it
parameters(3) = 3;
rmse = sum((yn - polyval(parameters, x1)).^2);
end
这种笨拙的解决方案fminsearch
将第三个变量视为不敏感的,因为它在目标函数内部被覆盖,因此不会影响输出值。
将第三个值定义为单独的变量(即 outside parameters
)不是一种选择,因为每次我选择要优化的不同变量时都需要进行大量的重新编码。
必须有更好的解决方案。有任何想法吗?