2015-06-02 4 views
0

Я в настоящее время практикует простую оптимизацию функции в Matlab и надеюсь, что вы могли бы обеспечить небольшой помощи/разъяснение по следующей ошибки:MatLab @fminunc задача оптимизации функции

%quadramin.m 
function z=quadramin(param,data); 
z=data.*(param(1).^2 - param(2).^3)+3; 

%quadramin_lik.m 
function quadlik = quadramin_lik(param,data); 
%pseudo/ad-hoc log-likelihood function 
quadlik = quadramin(param,data)- 10; 

%script.m 
data=trnd(5,6,1); 
param0=[2,3]; 
[param_eq,exitflag,output,grad,hessian] = ... 
fminunc(@(param) quadramin_lik(param,data),param0) 

выход после выполнения% script.m: Ошибка при использовании fminunc (строка 333) Пользовательская целевая функция должна возвращать скалярное значение.

ps: Это парадоксально, поскольку пользовательские функции quadramin & & quadramin_lik do возвращают значения.

Благодаря

+2

Обе ваши функции возвращают вектор значений, тогда как 'fminunc' требует, чтобы функция возвращала значение ** скалярное/одиночное **. Ошибка довольно ясна. Функция 'fminunc' пытается найти лучшее решение, которое минимизирует функцию затрат, поэтому то, что вам нужно, является функцией стоимости. Поэтому, возможно, попробуйте суммировать результаты в каждой функции, прежде чем возвращать их .... но это не гарантирует глобального минимума, потому что 'fminunc' предполагает, что ваша функция стоимости выпукла. – rayryeng

+0

, выполняющий функцию псевдо-логарифмического подобия, чтобы вернуть скалярное/одиночное значение. Спасибо за комментарии. Наконец, если я хотел бы использовать @fmincon, я бы правильно установил 'lb = [0,2], ub = [0, + inf]', если '0 <= x (1) <= 2' и' x (2) 'принадлежит R +? в паразите 'param_eq = fmincon (@ (param) quadramin_lik (param, data), param0, [], [], [], [], [0,2], [0, inf])'? Cheers – owner

+0

Я понятия не имею, как настроена ваша линейная программа, поэтому я не могу прокомментировать то, что вы правильно закодировали. – rayryeng

ответ

2

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

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

Смежные вопросы