目录
bayesopt函数
一、形式
results = bayesopt(fun,vars)
results = bayesopt(fun,vars,Name,Value)
results = bayesopt(fun,vars) 试图找到最小化fun(vars)的变量vars的值(变量)
results = bayesopt(fun,vars,Name,Value) 根据名称Name、值Value等参数修改优化过程.
二、输入变量
1.fun——目标函数
具有三种形式:
objective = fun(x)
[objective,constraints] = fun(x)
[objective,constraints,UserData] = fun(x)
objective:表示目标函数值fun (x)的实标量
constraints:表示是否违反耦合约束的真实向量,constraint(j) > 0意味着违反,constraint(j) < 0意味着不违反
UserData:任何类型的实体(如标量、矩阵、结构或对象)
2.vars——变量描述
optimizableVariable的向量定义要调整的超参数的变量对象
3.Name—Value 变量对
指定可选的以逗号分隔的名称、值参数对。名称是参数名称,值是对应的值。名称必须显示在引号内。您可以以任意顺序指定多个名称和值对参数,如Name1,Value1,...,NameN,ValueN。
下面为常用的参数表,其他更多到MATLAB帮助文档看:
AcquisitionFunctionName | 要选择下一个评估点的函数 | 'expected-improvement-per-second-plus' (default) | 'expected-improvement' | 'expected-improvement-plus' | 'expected-improvement-per-second' | 'lower-confidence-bound' | 'probability-of-improvement' |
| 指定确定性目标函数 | |
GPActiveSetSize | 拟合高斯过程模型到GPActiveSet大小或更少的点 | 数字 |
| 是否为并行计算 | false (default) | true |
| 并行工作目标函数值的计算方法 | |
MaxObjectiveEvaluations | 目标函数评价极限 | 数字 |
| 时间限制 | 数字 |
NumSeedPoints | 初始评估点数 | 数字 |
贝叶斯算法步骤(bayesopt)
一、构建变量
对于目标函数中的每个变量,使用optimizableVariable创建一个变量描述对象。每个变量都有一个唯一的名称和一个值的范围。变量创建的最小语法是:
variable = optimizableVariable(Name,Range)
函数创建了一个实变量,其范围从下界Range(1)到上界Range(2);
可以在 ‘ Type ’ 名称-值对中指定三种类型的变量:
- ‘real’——有限边界之间的连续实值。将Range作为双元素向量[lower upper],表示下界和上界。
- 'integer'——有限边界之间的整数值,类似于“实数”
-
‘categorical’——包含可能值的名称的单元格数组,例如您在“Range”参数中指定的{'red','green','blue'}
下面举一些例子:
从0到1的实数变量:
var1 = optimizableVariable('xvar',[0 1])
var1 =
optimizableVariable with properties:Name: 'xvar'
Range: [0 1]
Type: 'real'
Transform: 'none'
Optimize: 1
在对数尺度上,从1到1000的整数变量:
var2 = optimizableVariable('ivar',[1 1000],'Type','integer','Transform','log')
var2 =
optimizableVariable with properties:Name: 'ivar'
Range: [1 1000]
Type: 'integer'
Transform: 'log'
Optimize: 1
彩虹色的分类变量:
ar3 = optimizableVariable('rvar',{'r' 'o' 'y' 'g' 'b' 'i' 'v'},'Type','categorical')
var3 =
optimizableVariable with properties:Name: 'rvar'
Range: {'r' 'o' 'y' 'g' 'b' 'i' 'v'}
Type: 'categorical'
Transform: 'none'
Optimize: 1
二、创建目标函数
贝叶斯优化目标函数,需要创建约束条件,并要在目标函数中包含额外的参数
bayesopt尝试最小化一个目标函数。相反,如果需要最大化一个函数,则将目标函数设置为您要最大化的函数的负值。
bayesopt将一个变量表传递给目标函数。这些变量具有之前上一步所声明的名称和类型。
这里举一个MATLAB中的例子:目标函数返回一个具有参数框和sigma的SVM模型的交叉验证拟合中的损失。当支持向量的数量超过100(100是可行的,101不是)时,该目标还返回一个正的耦合约束函数(不可行)。
function [objective,constraint] = mysvmfun(x,cdata,grp)
SVMModel = fitcsvm(cdata,grp,'KernelFunction','rbf',...
'BoxConstraint',x.box,...
'KernelScale',x.sigma);
objective = kfoldLoss(crossval(SVMModel));
constraint = sum(SVMModel.SupportVectors) - 100.5;
三、定义优化选项
即bayseopt Name,Value值对。不需要将任何选项传递给bayesopt,但您通常会这样做,特别是在试图改进解决方案时。
四、调用bayseopt
五、检查解决方案
这里可以决定通过使用恢复来恢复优化,或者重新启动优化,这通常使用修改后的选项。
例子:使用bayesopt创建一个贝叶斯优化对象
本示例展示了如何通过使用bayesopt来创建一个贝叶斯优化对象来最小化交叉验证损失。
为电离层数据优化KNN分类器的超参数,即找到使交叉验证损失最小化的KNN超参数。让bayesopt最小化以下超参数:
- 最近的社区的大小从1到30
- 距离函数“切比切夫”、“欧几里得”和“闵可夫斯基”。
为了实现再现性,设置随机种子,设置分区,并将“AcquisitionFunctionName”选项设置为“expected-improvement-plus”。若要抑制迭代显示,请将“Verbose”设置为0。通过创建一个匿名函数来合并这些数据,将分区c和拟合数据X和Y传递给目标函数fun。
load ionosphere
rng default
num = optimizableVariable('n',[1,30],'Type','integer');
dst = optimizableVariable('dst',{'chebychev','euclidean','minkowski'},'Type','categorical');
c = cvpartition(351,'Kfold',5);
fun = @(x)kfoldLoss(fitcknn(X,Y,'CVPartition',c,'NumNeighbors',x.n,...
'Distance',char(x.dst),'NSMethod','exhaustive'));
results = bayesopt(fun,[num,dst],'Verbose',0,...
'AcquisitionFunctionName','expected-improvement-plus')
运行结果:
博主第一次写博客,有问题多多谅解 😊😊