bayesopt
требует конечных границ на всех переменных. категориальный
переменные, по своей природе, ограничены в их возможных значениях.) Передают нижние и верхние границы для действительных и переменных с целочисленным знаком в 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
таблица width-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
. @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'
isnan
.
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