Matlab优化:什么类型的目标函数是';允许';与fminsearch.m和公司合作。?

Matlab优化:什么类型的目标函数是';允许';与fminsearch.m和公司合作。?,matlab,optimization,Matlab,Optimization,使用诸如fmincon.m和fminsearchbnd.m之类的函数进行优化的示例通常会最小化相对简单的目标函数。对于simple,我的意思是目标函数只包含一些代数表达式,例如Rosenbrock公式 另一方面,在我的问题中,目标函数由几个步骤组成,包括 计算一个观测数据点和一组n个训练数据点(n~5e4)之间的L2范数失配 从训练数据集中选择产生最小失配的数据点 然后使用这个选定子集的行索引来计算我想要最小化的最终距离 i、 e.我执行的运算不能用单一数学表达式表示。我可以将这样的目标函数

使用诸如fmincon.m和fminsearchbnd.m之类的函数进行优化的示例通常会最小化相对简单的目标函数。对于simple,我的意思是目标函数只包含一些代数表达式,例如Rosenbrock公式

另一方面,在我的问题中,目标函数由几个步骤组成,包括

  • 计算一个观测数据点和一组n个训练数据点(n~5e4)之间的L2范数失配
  • 从训练数据集中选择产生最小失配的数据点
  • 然后使用这个选定子集的行索引来计算我想要最小化的最终距离
i、 e.我执行的运算不能用单一数学表达式表示。我可以将这样的目标函数与诸如fminsearchbnd.m或fmincon.m之类的工具一起使用吗?到目前为止,我的结果不是很有希望…

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

或者,写下你的目标函数,包括任何约束条件。你的描述我不清楚,如果你能把它写在实际的公式里,也会对你有所帮助

我将您的步骤解读为:

  • “计算一个观测数据点和一组n个训练数据点之间的L2范数。”似乎总共有一(1)个观测数据点。让我们调用观测点
    x
    。让我们为
    i=1..n
    调用训练数据点
    y\u i
    。 L2规范是:
    | x-y|i |

  • “选择不匹配度最低的数据点[多个?]。您还没有说明需要多少数据点,以及如何组合多个点以获得单个L2范数。假设您只需要一个这样的点(最接近观测数据点x)。因此,您得到:
    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
    as
    minval=fminseach(@myobjfunc)
    。显示你尝试的东西没有达到预期效果。好的,谢谢大家,我觉得我不够具体,我道歉。我已经编写了一个(嵌套的)函数来最小化目标函数,并且在技术上是可行的,即没有报告错误。我的问题是,是否有关于目标函数可以由什么组成的规则。从你的回答来看,我认为情况并非如此。只要它返回一个标量值就可以了。这就是我所需要知道的,谢谢你的帮助,也为误会感到抱歉