Product FAQ

MATLAB优化算法中,目标函数不是一个具体的表达式应该怎么添加呢?

被优化的程序是一个计算复杂的结果,并没有具体的表达式,而现有的优化算法的目标函数都是一个具体的表达式,应该怎么做呢?

试一试遗传算法,不需要具体表达式,只需要一个输入变量便能输出答案的程序。

目标函数表达形式不重要,重要的是对于任意的备选解都可以计算出一个评价指标。当然,在有具体目标函数形式的情况下,上述计算更加简单;不存在具体形式的复杂评价过程,需要一个复杂的计算过程。

对于群智能优化算法(如遗传算法、粒子群算法等等)来说,优化问题(目标函数)可以是显式的,也可以是非显式的(没有具体的表达式);可以是凸的,也可以是非凸的。显式优化问题的相关资料已经很多了,下面侧重介绍非显式目标函数的优化问题,以MATLAB自带的粒子群算法(Particle Swarm Optimization,PSO)为例。具体可以可以参考我这篇文章:

iqiukp:【LIBSVM】基于群智能优化算法的支持向量机 (SVM) 参数优化
  • particleswarm
x = particleswarm(fun,nvars)
x = particleswarm(fun,nvars,lb,ub)
x = particleswarm(fun,nvars,lb,ub,options)
x = particleswarm(problem)
[x,fval,exitflag,output] = particleswarm(___)

目标函数是关键的一步,函数的输入是需要优化的参数,函数的输出值是目标函数值,对于分类任务来说一般是分类的准确率(最大化问题),回归任务是均方根误差(最小化问题)。假设情景为优化支持向量机的两个参数,那么目标函数为:

% 目标函数 
function objValue = getObjValue(parameter)

    % 需要优化的参数
    c = parameter(1);
    g = parameter(2);

    % 准确率(非显式过程,需要调用子函数)
    acc = svm(c, g);

    % 目标函数值
    % 若为最大化问题
    objValue = acc;
    % 若为最小化问题
    objValue = 1-acc;
end

整个核心值得注意的是:

  • parameter是一个参数向量,向量的个数为需要优化的参数的个数
  • svm(c,g)是一个假设的模型,一个非显式过程

实际上,在计算目标函数的过程中,如果是非显式的,一般还有读取其他数据,比如一些常数,一些训练数据等等,此时不能在目标函数的传参里面添加,只能在函数内部添加。

% 目标函数 
function objValue = getObjValue(parameter)

    % 需要优化的参数
    c = parameter(1);
    g = parameter(2);
    
    % 读取训练数据
    load trainData

    % 准确率(非显式过程,需要调用子函数)
    acc = svm(trainData, c, g);

    % 目标函数值
    % 若为最大化问题
    objValue = acc;
    % 若为最小化问题
    objValue = 1-acc;
end

综上所述,目标函数的设置,仅接受优化参数的传参,目的在优化参数的设定下获取目标函数值。

**(简化版,暂不考虑调节PSO算法的自身参数,可以通过键值对options来设置,具体看MATLAB的官方文档)

  1. 利用函数句柄形式,作为particleswarm的输入,即fun=@getObjValue.
  2. 定义优化参数的个数,在该场景中,优化参数的个数nvars为2 。
  3. 定义优化参数的上下限,如c的范围是[0.01, 1], g的范围是[2^-5, 2^5],那么参数的下限lb=[0.01, 2^-5];参数的上限lb=[1, 2^5]。
  4. 优化:bestx=particleswarm(fun, nvars, lb, ub);
  5. 直到达到迭代停止条件,退出优化,获取最优的参数值。

以上就是非显式目标函数优化问题的MATLAB实现过程。

如果这个回答对您有所帮助,欢迎点赞支持关注。

平台注册入口