Почему fminsearch не оценивает параметры?
Я пытаюсь оценить параметры следующей функции:
u = log (x) - ω - φ * (log (h)) - δ1 * z - δ2 * (z ^ 2-1)
Я использую функцию fminsearch в Matlab со следующими кодами:
data = xlsread('return_oc_out.xlsx');
a = data(:,25);
kernel = xlsread('RK_out.xlsx');
rkAA= kernel(:,25);
startingVals = [0.1 0.05 0.9 0.3];
T = size(a,1);
options = optimset('fminsearch');
options.Display = 'iter';
estimates = fminsearch(@residuiRK, startingVals, options, rkAA, h, a);
[ll, lls, u]=residuiRK(estimates, rkAA, h, a);
функция Остаток RK имеет следующий код:
function [ll, lls, u] = residuiRK(parameters, x_rk, h, data)
omega = parameters(1);
phi = parameters(2);
delta1 = parameters(3);
delta2 = parameters(4);
mu = mean(data);
T = size(data,1);
eps = data-mu;
z= eps./sqrt(exp(h));
lxRK=log(x_rk);
u = zeros(T,1);
for t = 1:T
u(t) = lxRK(t) - omega - phi*h(t) - delta1*z(t) - delta2*(z(t).^2-1);
end
lls = 0.5*(log(2*pi) + log(exp(h))+eps.^2./exp(h));
ll = sum(lls);
Проблема в том, что fminsearch возвращает оценочные параметры, равные начальным значениям, которые я вставляю. Почему существует эта проблема? Буду очень признателен, если кто-нибудь сможет это объяснить. Спасибо
1 ответ
Вы должны назвать свою функцию как
[estimates, ~, exitflag, output] = fminsearch(...)
диагностировать вашу функцию вызова. exitflag
должно быть равно 1, если допуск был достигнут, иначе что-то случилось не так. output
это структура, к которой вы можете обратиться, чтобы увидеть итоги своего fminsearch()
вызов.
Кроме того, ваш вызов функции кажется странным. Вы хотите оптимизировать по parameters
аргумент residuiRK
функция, верно? Тогда почему бы не передать остальные аргументы вашему fminsearch
свернутая функция? Как это:
estimates = fminsearch(@(x) residuiRK(x,rkAA,h,a), startingVals, options);
Позже редактировать
Итак, исходя из новой информации, по-видимому, exitflag
из fminsearch()
Вызов равен 1. Это означает, что максимальная разность координат между текущей наилучшей точкой и другими точками в симплексе меньше или равна options.TolX
и соответствующая разница в значениях функции меньше или равна options.TolFun
,
Ваша функция может меняться слишком медленно startingVal
, Вы можете попытаться увеличить / уменьшить ваши допуски. Это можно сделать, изменив options
структура:
options = optimset('fminsearch');
options.Display = 'iter';
options.TolX = <some number> % the default value is 0.0001
options.TolFun = <some number> % the default value is 0.0001
Попробуйте разные значения и посмотрите, что происходит с вашими значениями. Если ничего не происходит, то, видимо, вы догадались с минимальной позиции с самого начала.:-)