WedX - журнал о программировании и компьютерных науках

Оптимизация Matlab: запись данных по итерациям

Возможно ли использование Matlab для оптимизации для записи данных от одной итерации к другой с помощью функционального m-файла, содержащего только Функция вывода?

Предоставленный пример показывает, что функция оптимизации должна быть вызвана изнутри функции "runOptimization", где также находится вложенная функция вывода.

function [history,searchdir] = runOptimization

% Set up shared variables with OUTFUN
history.x = [];
history.fval = [];
searchdir = [];

% call optimization
x0 = [-1 1];
options = optimoptions(@fmincon,'OutputFcn',@outfun,... 

% nested output function
function stop = outfun(x,optimValues,state)
    stop = false;
    switch state
    % ... store history and search directions over all iterations

Также этот сайт утверждает, что если вы хотите вашей функции вывода для записи данных от одной итерации к другой, вы должны написать один файл, который делает следующее:

  • Содержит функцию вывода как вложенную функцию.
  • Вызывает функцию оптимизации.

Однако мне было интересно, можно ли создать m-файл, содержащий только функцию вывода и использующий дополнительные параметры history и searchdir в качестве входных данных.

Я попробовал это со следующим подходом к анонимным функциям, где общие переменные history и searchdir объявлены «снаружи» в моем основном m-файле (не глобальном). А для целевой функции и выходной функции я использую отдельные m-файлы.

% main m-file
% Set up shared variables with OUTFUN
history.x = [];
history.fval = [];
searchdir = [];

outf = @(x,optimValues,state)outfun(x,optimValues,state,history,searchdir);

objective = @(x) objective_function(x,y,h);

x0 = [-1 1];
x = fmincon(objective,x0,[],[],[],[],[],[],[],options);

Однако каждый раз, когда выходная функция возвращается, общие переменные снова пусты. Есть ли другое решение вместо глобальных переменных, что-то вроде передачи по ссылке вместо копий в качестве аргументов.


Ответы:


1

Есть как минимум три решения, одно хуже другого:

<сильный>1. Использование классов дескрипторов.

Основной файл:

clear all
history= histclass;
outf= @(x,optimValues,state)outfun3(x,optimValues,state,history);
objective= @(x) x(1)^2+x(2)^4; % just for example
options = optimset('OutputFcn',outf);
x0 = [-1 1];
x = fmincon(objective,x0,[],[],[],[],[],[],[],options);
disp(history.x);
disp(history.fval);

histclass определение:

classdef histclass < handle
    properties 
        x= [];
        fval= [];
    end
    methods 
        function add(obj,newx,newfval)
            obj.x= [obj.x; newx];
            obj.fval= [obj.fval  newfval];
        end
    end
end

Выходная функция:

function stop = outfun3(x,optimValues,state,history)
    stop = false;
    history.add(x,optimValues.fval);
end

<сильный>2. Использование evalin.

Основной файл:

history= struct('x',[],'fval',[]); % create the structure with empty fields
history(1)= []; % create the empty structure array with the specified fields
add_history= @(x,fval,varname)evalin('base',...
    ['history(end+1)= struct(''x'',' mat2str(x) ',''fval'',' num2str(fval) ')']);
outf= @(x,optimValues,state)outfun(x,optimValues,state,add_history);
objective= @(x) x(1)^2+x(2)^4; % just for example
options = optimset('OutputFcn',outf);
x0 = [-1 1];
x = fmincon(objective,x0,[],[],[],[],[],[],[],options);
disp([history.x]);

Выходная функция:

function stop = outfun(x,optimValues,state,add_history)
    stop = false;
    add_history(x,optimValues.fval);
end

<сильный>3. Использование файлов

Основной файл:

clear all
history= struct('x',[],'fval',[]); % create the structure with empty fields
history(1)= []; % create the empty structure array with the specified fields
save('history.mat')
objective= @(x) x(1)^2+x(2)^4; % just for example
options = optimset('OutputFcn',@outfun2);
x0 = [-1 1];
x = fmincon(objective,x0,[],[],[],[],[],[],[],options);
load('history.mat')
disp([history.x]);

Выходная функция:

function stop = outfun2(x,optimValues,state)
    stop = false;
    load('history.mat','history')
    history(end+1)= struct('x',x,'fval',optimValues.fval);
    save('history.mat')
end
12.10.2016
  • Спасибо за Ваш ответ! Итак, вы предлагаете, что самым чистым подходом будет использование того, что предлагает Mathworks: вложенная функция, содержащая функцию вывода? 12.10.2016
  • Да. Использование классов дескрипторов кажется наименее уродливым решением, но оно слишком медленное. 12.10.2016
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]