Ограничения в байесовой оптимизации

Границы

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);

Большинство точек приводит к неосуществимому количеству векторов поддержки.

Смотрите также

|

Похожие темы