Matlab优化:什么类型的目标函数是';允许';与fminsearch.m和公司合作。?
使用诸如fmincon.m和fminsearchbnd.m之类的函数进行优化的示例通常会最小化相对简单的目标函数。对于simple,我的意思是目标函数只包含一些代数表达式,例如Rosenbrock公式 另一方面,在我的问题中,目标函数由几个步骤组成,包括Matlab优化:什么类型的目标函数是';允许';与fminsearch.m和公司合作。?,matlab,optimization,Matlab,Optimization,使用诸如fmincon.m和fminsearchbnd.m之类的函数进行优化的示例通常会最小化相对简单的目标函数。对于simple,我的意思是目标函数只包含一些代数表达式,例如Rosenbrock公式 另一方面,在我的问题中,目标函数由几个步骤组成,包括 计算一个观测数据点和一组n个训练数据点(n~5e4)之间的L2范数失配 从训练数据集中选择产生最小失配的数据点 然后使用这个选定子集的行索引来计算我想要最小化的最终距离 i、 e.我执行的运算不能用单一数学表达式表示。我可以将这样的目标函数
- 计算一个观测数据点和一组n个训练数据点(n~5e4)之间的L2范数失配
- 从训练数据集中选择产生最小失配的数据点
- 然后使用这个选定子集的行索引来计算我想要最小化的最终距离
x
。让我们为i=1..n
调用训练数据点y\u i
。
L2规范是:| x-y|i |
argmin(超过i)| x-y|u i |
。如果你有多个,你可以贪婪地取k个最近的点有一个简单而明显的解决办法。您可以使用fminsearch()为一些自定义函数查找最小值。在我的例子中,它是拟合多项式,这当然很容易,但关键是,这可以是任何东西。如果将目标函数设置为嵌套函数,则可以访问数据,以便它们共享相同的变量范围。 你可以从下面的代码开始,一部分一部分地填写你想做的每件事,如果有后续的问题,你可能会问
function main
verbose = 1; % some output
% optimize something, maybe a distorted polynomial
x = sort(rand(20,1));
p_original = [1.5, 3, 2, 1];
y = polyval(p_original,x) + 0.5*(rand(size(x))-0.5);
% optimize polynomial of order order. This is an example of how to pass
% a parameter to the fit function.
order = 3;
% obvious solution is this, but we want to do something else
p_polyfit = polyfit(x,y,order)
% we want to do it a bit more complex
pfit = optimize_something(x, y, order, verbose)
% what is happening?
figure
plot(x,polyval(p_original,x),'k-')
hold on
plot(x,y,'ko')
plot(x,polyval(p_polyfit,x),'rs-')
plot(x,fit_function(x,pfit),'gx-')
legend('original','noisy','polyfit','optimization')
end
function pfit = optimize_something(x,y, order, verbose)
% for polynomial of order order we need order+1 coefficients
p0 = ones(1,order+1); % initial guess: all coefficients are 1
if verbose
fprintf('optimize_something calling fminsearch(@objFun)\n');
end
% hand over only p0 to our objective function
pfit = fminsearch(@objFun, p0);
% ------------------------- NESTED objFUN --------------------------------%
function e = objFun(p)
% This function accepts only p as parameter and returns a value e, which
% will be minimized by some metric (maybe least squares).
% Since this function is nested, it can use also the predefined variables x, y (and also p0 and verbose).
% The magic is, we calculate a value yfitted out of x and p by a
% fit_function. This function can really be anything!
yfitted = fit_function(x, p);
e = sum((yfitted-y).^2);
% e = sum(abs(yfitted-y)); % another possibility
end
% ------------------------- NESTED objFUN --------------------------------%
if verbose
disp('pfit found')
end
end
function yfitted = fit_function(x, p)
% In our example we want to fit a polynomial, so we do so. We evaluate the
% polynomial p at x.
yfitted = polyval(p,x);
% But it could be anything, really.. each value in p could be something
% else, maybe the sum of an exponential function and a straight line
% yfitted = p(1)*exp(p(2)*x) + p(3)*x + p(4);
end
fminsearch
最小化任何(标量)函数,它不在乎函数有多复杂。你需要的是有这样一个功能。无论你在做什么,把它放在一个文件中,把function value=myobjfunc(arg1,arg2,…)
添加到顶部,然后把这个函数传递给fminsearch
asminval=fminseach(@myobjfunc)
。显示你尝试的东西没有达到预期效果。好的,谢谢大家,我觉得我不够具体,我道歉。我已经编写了一个(嵌套的)函数来最小化目标函数,并且在技术上是可行的,即没有报告错误。我的问题是,是否有关于目标函数可以由什么组成的规则。从你的回答来看,我认为情况并非如此。只要它返回一个标量值就可以了。这就是我所需要知道的,谢谢你的帮助,也为误会感到抱歉