bayesopt
требует конечных границ для всех переменных. (categorical
переменные по своей природе ограничены возможными значениями.) Передайте нижнюю и верхнюю границы для вещественных и целочисленных переменных в optimizableVariable
.
bayesopt
использует эти ограничения для точек выборки, либо равномерно, либо логарифмически. Вы устанавливаете масштабирование для дискретизации в optimizableVariable
.
Например, чтобы ограничить переменную X1
к значениям между 1e-6
и 1e3
, масштабированный логарифмически,
xvar = optimizableVariable('X1',[1e-6,1e3],'Transform','log')
bayesopt
включает конечные точки в свою область значений. Поэтому вы не можете использовать 0 как нижнюю границу для переменной, преобразованной в журнал.
Совет
Чтобы использовать нулевую нижнюю границу в переменной с логарифмическим преобразованием, установите нижнюю границу равной 1
, затем внутри целевой функции используйте x-1
.
XConstraintFcn
Иногда ваша задача действительна или четко определена только для точек в определенной области, называемой feasible region. Детерминированное ограничение является детерминированной функцией, которая возвращает true
когда точка допустима, и false
когда точка недопустима. Поэтому детерминированные ограничения не являются стохастическими, и они являются функциями не группы точек, а отдельных точек.
Совет
Эффективнее использовать optimizableVariable
ограничения, вместо детерминированных ограничений, чтобы ограничить оптимизацию прямоугольной областью.
Напишите детерминированную функцию ограничения с помощью сигнатуры
tf = xconstraint(X)
X
- таблица ширины D произвольной высоты.
tf
является логическим вектором-столбцом, где tf(i) = true
именно тогда, когда X(i,:)
является допустимым.
Передайте детерминированную функцию ограничения в bayesopt
XConstraintFcn
Пара "имя-значение". Для примера,
results = bayesopt(fun,vars,'XConstraintFcn',@xconstraint)
bayesopt
вычисляет детерминированные ограничения для тысяч точек и поэтому запускается быстрее, когда ваша функция ограничения векторизирована. См. Векторизация.
Например, предположим, что переменные с именем 'x1'
и 'x2'
допустимы, когда норма вектора [x1 x2]
меньше 6
, и когда x1 <= x2
. Следующая функция ограничения оценивает эти ограничения.
function tf = xconstraint(X)
tf1 = sqrt(X.x1.^2 + X.x2.^2) < 6;
tf2 = X.x1 <= X.x2;
tf = tf1 & tf2;
ConditionalVariableFcn
Условными ограничениями являются функции, которые обеспечивают одно из следующих двух условий:
Когда некоторые переменные имеют определенные значения, другие переменные устанавливаются в заданные значения.
Когда некоторые переменные имеют определенные значения, другие переменные имеют NaN
или, для категориальных переменных, <undefined>
значения.
Задайте условное ограничение путем установки bayesopt
ConditionalVariableFcn
Паре "имя-значение" к указателю на функцию, скажем @condvariablefcn
. The @condvariablefcn
функция должна иметь подпись
Xnew = condvariablefcn(X)
X
является видо- D
таблица произвольной высоты.
Xnew
- таблица того же типа и размера, что и X
.
condvariablefcn
устанавливает Xnew
быть равным X
, за исключением того, что он также устанавливает соответствующие переменные в каждую строку Xnew
к правильным значениям для ограничения.
Примечание
Если у вас есть как условные ограничения, так и детерминированные ограничения, bayesopt
Сначала применяет условные ограничения. Поэтому, если ваша условная функция ограничения может задать переменные NaN
или <undefined>
, убедитесь, что ваша детерминированная функция ограничения может правильно обработать эти значения.
Условные ограничения гарантируют, что значения переменных являются разумными. Поэтому, bayesopt
применяет условные ограничения сначала, чтобы все переданные значения были разумными.
Предположим, что вы оптимизируете классификацию, используя fitcdiscr
и вы оптимизируете над обеими 'DiscrimType'
и 'Gamma'
Аргументы пары "имя-значение". Когда 'DiscrimType'
является одним из квадратичных типов, 'Gamma'
должен быть 0
или ошибки решателя. В этом случае используйте эту условную функцию ограничения:
function XTable = fitcdiscrCVF(XTable) % Gamma must be 0 if discrim type is a quadratic XTable.Gamma(ismember(XTable.DiscrimType, {'quadratic',... 'diagQuadratic','pseudoQuadratic'})) = 0; end
NaN
Предположим, что вы оптимизируете классификацию, используя fitcsvm
и вы оптимизируете над обеими 'KernelFunction'
и 'PolynomialOrder'
Аргументы пары "имя-значение". Когда 'KernelFunction'
не 'polynomial'
, а 'PolynomialOrder'
установка не применяется. Следующая функция применяет это условное ограничение.
function Xnew = condvariablefcn(X) Xnew = X; Xnew.PolynomialOrder(Xnew.KernelFunction ~= 'polynomial') = NaN;
Вы можете сохранить строку кода следующим образом:
function X = condvariablefcn(X) X.PolynomialOrder(Xnew.KernelFunction ~= 'polynomial') = NaN;
В сложение задайте целевую функцию, которая не проходит 'PolynomialOrder'
аргумент пары "имя-значение" fitcsvm
когда значение 'PolynomialOrder'
является NaN
.
fun = @(X)mysvmfun(X,predictors,responce,c) function objective = mysvmfun(X,predictors,response,c) args = {predictors,response, ... 'CVPartition',c, ... 'KernelFunction',X.KernelFunction}; if ~isnan(X.PolynomialOrder) args = [args,{'PolynomialOrder',X.PolynomialOrder}]; end objective = kfoldLoss(fitcsvm(args{:})); end
Coupled constraints ограничения, которые можно вычислить только путем вызова целевой функции. Эти ограничения могут быть стохастическими или детерминированными. Верните эти значения ограничений из целевой функции во втором аргументе. См. «Байесовские целевые функции оптимизации».
Целевая функция возвращает числовой вектор для связанных ограничений, по одной записи для каждого связанного ограничения. Для каждой записи отрицательное значение указывает, что ограничение выполнено (также называемое допустимым). Положительное значение указывает, что ограничение не выполнено (недопустимо).
bayesopt
автоматически создает связанное ограничение, называемое ограничением ошибка, для каждого запуска. Это ограничение включает bayesopt
моделировать точки, которые вызывают ошибки в объективных вычислениях функции. Для получения дополнительной информации смотрите Ошибки целевой функции и predictError
.
Если у вас есть связанные ограничения в дополнение к ограничению ошибка:
Включите NumCoupledConstraints
пара "имя-значение" bayesopt
вызов (обязательно). Не включать ограничение ошибка в этот номер.
Если какие-либо из ваших связанных ограничений являются стохастическими, включите AreCoupledConstraintsDeterministic
Паре "имя-значение" и передайте false
для любого стохастического ограничения.
Наблюдайте связанные значения ограничений в каждой итерации, установив bayesopt
Verbose
Пара "имя-значение" с 1
или 2
.
Примечание
Когда существуют связанные ограничения, итеративное отображение и функции построения графика могут дать контринтуитивные результаты, такие как:
Минимальный целевой график может увеличиться.
Оптимизация может объявить задачу недопустимой, даже когда она показала более раннюю допустимую точку.
Причиной такого поведения является то, что решение о том, является ли точка допустимой, может измениться по мере прогрессирования оптимизации. bayesopt
определяет выполнимость относительно своей ограничительной модели, и эта модель изменяется как bayesopt
вычисляет точки. Таким образом, график «минимальной цели» может увеличиться, когда минимальная точка позже считается недопустимой, и итерационное отображение может показать допустимую точку, которая позже считается недопустимой.
Для получения примера см. «Байесовская оптимизация со связанными ограничениями».
Связанное ограничение является ограничением, которое может быть оценено только путем оценки целевой функции. В этом случае целевой функцией является перекрестная потеря модели SVM. Связанное ограничение состоит в том, что количество векторов поддержки не более 100. Детали модели находятся в Оптимизации классификатора SVM с перекрестной проверкой с использованием bayesopt.
Создайте данные для классификации.
rng default grnpop = mvnrnd([1,0],eye(2),10); redpop = mvnrnd([0,1],eye(2),10); redpts = zeros(100,2); grnpts = redpts; for i = 1:100 grnpts(i,:) = mvnrnd(grnpop(randi(10),:),eye(2)*0.02); redpts(i,:) = mvnrnd(redpop(randi(10),:),eye(2)*0.02); end cdata = [grnpts;redpts]; grp = ones(200,1); grp(101:200) = -1; c = cvpartition(200,'KFold',10); sigma = optimizableVariable('sigma',[1e-5,1e5],'Transform','log'); box = optimizableVariable('box',[1e-5,1e5],'Transform','log');
Целевой функцией является потеря перекрестной валидации модели SVM для раздела c
. Связанное ограничение является количеством поддержки векторов минус 100,5. Это гарантирует, что 100 поддерживающих векторов дают отрицательное значение ограничения, но 101 поддерживающих вектора дают положительное значение. Модель имеет 200 точек данных, поэтому связанные значения ограничений варьируются от -99,5 (всегда существует по крайней мере один вектор поддержки) до 99,5. Положительные значения означают, что ограничение не удовлетворено.
function [objective,constraint] = mysvmfun(x,cdata,grp,c) SVMModel = fitcsvm(cdata,grp,'KernelFunction','rbf',... 'BoxConstraint',x.box,... 'KernelScale',x.sigma); cvModel = crossval(SVMModel,'CVPartition',c); objective = kfoldLoss(cvModel); constraint = sum(SVMModel.IsSupportVector)-100.5;
Передайте разделы c
и подбор данных cdata
и grp
к целевой функции fun
путем создания fun
как анонимная функция, которая включает в себя эти данные. См. Параметризация функций.
fun = @(x)mysvmfun(x,cdata,grp,c);
Установите NumCoupledConstraints
на 1
поэтому оптимизатор знает, что существует связанное ограничение. Установите опции, чтобы построить график модели ограничений.
results = bayesopt(fun,[sigma,box],'IsObjectiveDeterministic',true,... 'NumCoupledConstraints',1,'PlotFcn',... {@plotMinObjective,@plotConstraintModels},... 'AcquisitionFunctionName','expected-improvement-plus','Verbose',0);
Большинство точек приводит к недопустимому числу поддержки векторов.
bayesopt
| optimizableVariable