贝叶斯优化图函数
内置绘图功能
有两组内置的绘图函数。
模型图-适用于D≤2 | 描述 |
---|---|
@plotAcquisitionFunction |
绘制采集函数曲面。 |
@plotConstraintModels |
绘制每个约束模型曲面。负值表示可行点。 也画一个P(可行的)表面。 如果存在误差模型,也要绘制误差模型,其范围为 绘制误差= 2*概率(误差)- 1。 |
@plotObjectiveEvaluationTimeModel |
绘制目标函数评价时间模型曲面。 |
@plotObjectiveModel |
画出 |
轨迹图-适用于所有D | 描述 |
---|---|
@plotObjective |
绘制每个观察到的函数值与函数计算的数量。 |
@plotObjectiveEvaluationTime |
绘制每个观察到的函数求值运行时间与函数求值次数的关系。 |
@plotMinObjective |
绘制最小观测值和估计函数值与函数评估数量的关系。 |
@plotElapsedTime |
绘制三条曲线:优化的总运行时间,总函数评估时间,总建模和点选择时间,所有这些都与函数评估的数量相关。 |
请注意
当存在耦合约束时,迭代显示和绘图函数可能会给出反直觉的结果,例如:
一个最低目标情节可以增加。
优化可以宣布一个问题不可行,即使它显示了一个早期的可行点。
出现这种行为的原因是,关于一个点是否可行的决策可以随着优化的进行而改变。bayesopt
确定其约束模型的可行性,该模型随bayesopt
评估点。因此,当最小点后来被认为不可行时,“最小目标”图可以增加,迭代显示可以显示一个后来被认为不可行的可行点。
自定义Plot函数语法
自定义绘图函数与自定义输出函数具有相同的语法(请参阅贝叶斯优化输出函数):
Stop = plotfun(结果,状态)
bayesopt
通过了结果
而且状态
函数的变量。函数返回停止
,设置为真正的
停止迭代,或停止假
继续迭代。
结果
是类的对象吗BayesianOptimization
它包含了计算的可用信息。
状态
具有以下可能的值:
“初始”
- - - - - -bayesopt
就要开始迭代了。使用此状态设置绘图或执行其他初始化。“迭代”
- - - - - -bayesopt
刚刚完成一次迭代。通常,在这种状态下执行大部分绘图或其他计算。“完成”
- - - - - -bayesopt
刚刚完成最后的迭代。清理图或以其他方式为图功能关闭做准备。
创建一个自定义绘图函数
此示例显示如何为。创建自定义绘图函数bayesopt
.中如何使用信息用户数据
的属性BayesianOptimization
对象。
问题陈述
问题是寻找支持向量机(SVM)分类的参数,使交叉验证损失最小化。万博1manbetx具体型号同使用bayesopt优化交叉验证分类器.因此,目标函数本质上是相同的,只是它也计算用户数据
,在这种情况下,支持向量机模型中拟合当前参数的支持向量的数万博1manbetx量。
创建一个自定义绘图函数,在优化过程中绘制SVM模型中支持向量的数量。万博1manbetx为了让绘图函数获得支持向量的数量,创建第三个输出,万博1manbetx用户数据
,返回支持向量的个数。万博1manbetx
目标函数
创建一个目标函数,用于计算固定交叉验证分区的交叉验证损失,并返回结果模型中支持向量的数量。万博1manbetx
函数[f,viol,nsupp] = mysvmminfn(x,cdata,grp,c) SVMModel = fitcsvm(cdata,grp, c)“KernelFunction”,“rbf”,...“KernelScale”x.sigma,“BoxConstraint”, x.box);f = kfoldLoss(crossval(svm模型,“CVPartition”, c));Viol = [];nsupp = sum(svm . issup万博1manbetxportvector);结束
自定义绘图函数
中计算的信息创建自定义绘图函数用户数据
.有目前约束的数量和约束的数量的函数图与找到的最佳目标函数的模型。
函数停止= svmsuppvec(结果,状态)持续的h nbest bestist nsupptrace stop = false;开关状态情况下“初始”Hs =数字;bestist = [];Nbest = 0;Nsupptrace = [];情况下“迭代”figure(hs) nsupp = results.UserDataTrace{end};从UserDataTrace属性获取nsupp。Nsupptrace (end+1) = nsupp;%在vector中累积nsupp值。如果(results.ObjectiveTrace(end) == min(results.ObjectiveTrace)) || (length(results.ObjectiveTrace) == 1)%电流为最佳Nbest = nsupp;结束best = [best,nbest];阴谋(1:长度(nsupptrace) nsupptrace,“b”1:长度(besthist)、besthist“r——”)包含的迭代次数ylabel支持向量的数量万博1manbetx标题每次迭代的支持向量数万博1manbetx传奇(当前迭代的,“最好的目标”,“位置”,“最佳”) drawnow结束
建立模型
为每个类生成10个基本点。
rng默认的Grnpop = mvnrnd([1,0],eye(2),10);Redpop = mvnrnd([0,1],eye(2),10);
生成每个类100个数据点。
Redpts = 0 (100,2);为i = 1:10 0 grnpts(我:)= mvnrnd (grnpop(兰迪(10):)、眼睛(2)* 0.02);redpts(我)= mvnrnd (redpop(兰迪(10):)、眼睛(2)* 0.02);结束
把数据放到一个矩阵中,然后做一个向量grp
标记每个点的类。
Cdata = [grnpts;redpts];GRP = ones(200,1);%绿色标签1,红色标签-1Grp (101:200) = -1;
使用默认的SVM参数检查所有数据的基本分类。
SVMModel = fitcsvm(cdata,grp,“KernelFunction”,“rbf”,“类名”[1]);
设置一个分区来修复交叉验证。如果没有这一步,交叉验证是随机的,因此目标函数是不确定的。
C = cvpartition(200,“KFold”10);
检查原拟合模型的交叉验证精度。
损失= kfoldLoss(fitcsvm(cdata,grp,“CVPartition”c...“KernelFunction”,“rbf”,“BoxConstraint”SVMModel.BoxConstraints (1)...“KernelScale”, SVMModel.KernelParameters.Scale))
损失= 0.1350
为优化准备变量
目标函数有一个输入Z = [rbf_sigma,boxconstraint]
的交叉验证损失值z
.取z
作为正的,之间的对数变换变量1 e-5
而且1 e5
.选择一个较大的范围,因为您不知道哪些值可能是好的。
sigma = optimizableVariable(“σ”(1 e-5, 1 e5),“转换”,“日志”);box = optimizableVariable(“盒子”(1 e-5, 1 e5),“转换”,“日志”);
设置Plot函数并调用优化器
寻找最佳参数(σ,盒子)
使用bayesopt
.为了重现性,选择“expected-improvement-plus”
采集功能。默认的采集函数取决于运行时,因此它可以给出不同的结果。
将支持向量的数量作为迭代数的函数绘制出万博1manbetx来,并为找到的最佳参数绘制支持向量的数量。
Obj = @(x)mysvmminfn(x,cdata,grp,c);结果= bayesopt(obj,[sigma,box],...“IsObjectiveDeterministic”,真的,“详细”0,...“AcquisitionFunctionName”,“expected-improvement-plus”,...“PlotFcn”, {@svmsuppvec、@plotObjectiveModel @plotMinObjective})
results = BayesianOptimization with properties: ObjectiveFcn: @(x)mysvmminfn(x,cdata,grp,c) variabledescription: [1x2 optimizableVariable] Options: [1x1 struct] MinObjective: 0.0750 XAtMinObjective: [1x2 table] minestimatedobjobjective: 0.0750 xatminestimatedobjobjective: [1x2 table] numobjectiveevaluation: 30 TotalElapsedTime: 34.5160 NextPoint: [1x2 table] XTrace: [30x2 table] ObjectiveTrace: [30x1 double] ConstraintsTrace: [] UserDataTrace: {30x1 cell} ObjectiveEvaluationTimeTrace:[30x1 double] IterationTimeTrace: [30x1 double] ErrorTrace: [30x1 double]可行性trace: [30x1 logical]可行性probabilitytrace: [30x1 double] IndexOfMinimumTrace: [30x1 double] objectivminimumtrace: [30x1 double] estimatedobjectivminimumtrace: [30x1 double]