Matlab 优化:fminsearch.m and Co. 'allowed'哪些类型的目标函数?



使用fmincon等函数进行优化的示例。我和我的朋友在一起。M通常最小化相对简单的目标函数。简单是指目标函数只由一些代数表达式组成,例如Rosenbrock公式。

另一方面,在我的问题中,目标函数由几个步骤组成,包括
  • 计算观测数据点与n组训练数据点(n~5e4)之间的l2范数失拟
  • 从训练数据集中选择那些误差最小的数据点
  • ,然后使用这个选定子集的行索引来计算我想要最小化的最终距离。

。我执行的操作不能用单一的数学表达式来表示。我可以使用这样的目标函数与工具,如fminsearchnd。M或fmincon。真的吗?

有一个简单而明显的解决方案。使用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

您可以尝试使用CVX。它是Matlab的一个插件,可以让你用正常的Matlab代码描述你的优化问题。

或者,写下你的目标函数,包括任何约束。你的描述对我来说不是很清楚,如果你能把它写成实际的公式,对你也会有帮助。

我读你的步骤如下:

  1. "计算一个观测数据点和一组n个训练数据点之间的l2范数。"似乎总共有一(1)个观测数据点。我们称观察到的点为x。我们称i=1..n的训练数据点为y_i。L2-Norm为:|x-y_i|

  2. "选择这些数据点[多个?给予最低限度的不适应"。你没有说你需要多少数据点,以及你如何组合多个点来得到一个l2 -范数。让我们假设你只想要一个这样的点(最接近观察到的数据点x),因此你得到:argmin (over i) |x-y_i|。如果你有多个,你可以贪婪地取最近的k个点

  3. "然后使用这个选定子集的行索引来计算我想要最小化的最终距离。"你想要最小化的最后距离是多少?

最新更新