我正在尝试估算以下函数的参数:
u = log(x) - ω - φ*(log(h)) - δ1* z - δ2*(z ^ 2-1)
我在matlab中使用函数fminsearch,代码如下:
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);
函数residuiRK具有以下代码:
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返回的估计参数等于我插入的起始值。为什么会出现这个问题? 如果有人能够解释,我将非常感激。谢谢
答案 0 :(得分:0)
您应该将您的功能称为
[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
尝试不同的值,看看您的值会发生什么。如果没有任何反应,那么显然你从一开始就猜到了最小的位置。 : - )