[英]Matlab function in fmincon with fixed value
我有一個簡單的 model ,我想最小化我的因變量 y 和我的 model 值之間的 RMSE。 model 是: y = alpha + beta'*x
。
為了最小化,我正在使用 Matlab 的fmincon
function 並且正在努力將我的參數 p(2) 乘以 x。
MWE:
% data
y = [5.072, 7.1588, 7.263, 4.255, 6.282, 6.9118, 4.044, 7.2595, 6.898, 4.8744, 6.5179, 7.3434, 5.4316, 3.38, 5.464, 5.90, 6.80, 6.193, 6.070, 5.737]
x = [18.3447, 79.86538, 85.09788, 10.5211, 44.4556, 69.567, 8.960, 86.197, 66.857, 16.875, 52.2697, 93.971, 24.35, 5.118, 25.126, 34.037, 61.4445, 42.704, 39.531, 29.988]
% initial values
p_initial = [0, 0];
% function: SEE BELOW
objective = @(p) sqrt(mean((y - y_mod(p)).^2));
% optimization
[param_opt, fval] = fmincon(objective, p_initial)
如果我按如下方式指定我的 function ,那么它可以工作。
y_mod = @(p) p(1) + p(2).*x
但是,如果我使用以下代碼,它就不起作用。 如何將 p(2) 與 x 相乘? 其中 x 未優化,因為已給出值。
function f = y_mod(p)
f = p(1) + p(2).*x
end
這是來自具有 function 聲明的腳本的 output:
>> modelFitExample2a
RMS Error=0.374, intercept=4.208, slope=0.0388
這是上面的代碼。 它有許多注釋行,因為它包括適合數據的替代方法: y_mod() 的內聯聲明,或y_mod()
y_mod()
多行聲明,或者根本沒有y_mod()
。 此版本使用y_mod()
的多行聲明。
%modelFitExample2a.m WCR 2021-01-19
%Reply to stack exchange question on parameter fitting
clear;
global x %need this if define y_mod() separately, and in that case y_mod() must declare x global
% data
y = [5.0720, 7.1588, 7.2630, 4.2550, 6.2820, 6.9118, 4.0440, 7.2595, 6.8980, 4.8744...
6.5179, 7.3434, 5.4316, 3.3800, 5.4640, 5.9000, 6.8000, 6.1930, 6.0700, 5.7370];
x = [18.3447,79.8654,85.0979,10.5211,44.4556,69.5670, 8.9600,86.1970,66.8570,16.8750,...
52.2697,93.9710,24.3500, 5.1180,25.1260,34.0370,61.4445,42.7040,39.5310,29.9880];
% initial values
p_initial = [0, 0];
%predictive model with parameter p
%y_mod = @(p) p(1) + p(2)*x;
% objective function
%If you use y_mod(), then you must define it somewhere
objective = @(p) sqrt(mean((y - y_mod(p)).^2));
%objective = @(p) sqrt(mean((y-p(1)-p(2)*x).^2));
% optimization
options = optimset('Display','Notify');
[param_opt, fval] = fmincon(objective,p_initial,[],[],[],[],[],[],[],options);
% display results
fprintf('RMS Error=%.3f, intercept=%.3f, slope=%.4f\n',...
fval,param_opt(1),param_opt(2));
%function declaration: predictive model
%This is an alternative to the inline definition of y_mod() above.
function f = y_mod(p)
global x
f = p(1) + p(2)*x;
end
carl,第二種方法,其中顯式聲明y_mod()
(在腳本末尾或在單獨的文件 y_mod.m 中)不起作用,因為y_mod()
不知道x
是什么。 通過在頂部的主程序中聲明x
全局來修復它,並在y_mod()
中聲明x
全局。
%function declaration
function f = y_mod(p)
global x
f = p(1) + p(2)*x;
end
當然,您根本不需要y_mod()
。 如果您使用以下代碼,該代碼也可以工作,在這種情況下,不需要global x
:
% objective function
objective = @(p) sqrt(mean((y-p(1)-p(2)*x).^2));
順便說一句,您不需要在 y_mod 中與.*
相乘。 您可以使用*
,因為您將標量乘以向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.