function A=obj(b,Y, YL, tempcyc, cyc, Yzero, age, agesq, educ, ageav, agesqav, educav, qv, year1, year2, year3, year4, year5, year6, year7, workregion1, workregion2, workregion3, workregion4, workregion5, workregion6, workregion7, workregion8, workregion9, workregion10, workregion11, workregion12, workregion13, workregion14, workregion15, workregion16, qw)
A=0;
for i=1:715
S=0;
for m=1:12
P=1;
for t=1:8
P=P*(normcdf((2*Y(i,t)-1)*(b(1)*YL(i,t)+b(2)*tempcyc(i,t)+b(3)*cyc(i,t)+b(4)*Yzero(i,t)+b(5)*age(i,t)+b(6)*agesq(i,t)+b(7)*educ(i,t)+b(8)*ageav(i,t)+b(9)*agesqav(i,t)+b(10)*educav(i,t)+b(11)*1+b(12)*sqrt(2)*qv(m,1)+b(13)*year1(i,t)+b(14)*year2(i,t)+b(15)*year3(i,t)+b(16)*year4(i,t)+b(17)*year5(i,t)+b(18)*year6(i,t)+b(19)*year7(i,t)+b(20)*workregion1(i,t)+b(21)*workregion2(i,t)+b(22)*workregion3(i,t)+b(23)*workregion4(i,t)+b(24)*workregion5(i,t)+b(25)*workregion6(i,t)+b(26)*workregion7(i,t)+b(27)*workregion8(i,t)+b(28)*workregion9(i,t)+b(29)*workregion10(i,t)+b(30)*workregion11(i,t)+b(31)*workregion12(i,t)+b(32)*workregion13(i,t)+b(33)*workregion14(i,t)+b(34)*workregion15(i,t)+b(35)*workregion16(i,t))));
end
S=S+qw(m,1)*P;
end
A=A+log(S/sqrt(pi));
A=-A;
end
这是我最小化的目标函数(实际上是最大化;我正在最小化-A
),我估计的参数是b=[b(1)............b(35)]
。 Y
,YL
,tempcyc
,..........,qw
是我作为数据导入的矩阵。目标函数由嵌套在总和(跨t=1:8
)内的产品(跨越m=1:12
)组成,而该产品又嵌套在一个总和中(跨越n=1:715
)。以下是我使用fminsearch
进行无约束最小化的代码。
% %% Minimization
start=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
iter=50000;
options=optimset('Display','iter','MaxIter',iter,'MaxFunEvals',100000);
[b, fval, exitflag, output]=fminsearch(@(b)obj(b,Y, YL, tempcyc, cyc, Yzero, age, agesq, educ, ageav, agesqav, educav, qv, year1, year2, year3, year4, year5, year6, year7, workregion1, workregion2, workregion3, workregion4, workregion5, workregion6, workregion7, workregion8, workregion9, workregion10, workregion11, workregion12, workregion13, workregion14, workregion15, workregion16, qw), start, options);%
%% Results
fprintf('[b] : % 1.4e % 1.4e %1.4e % 1.4e % 1.4e % 1.4e \n',...b(1),b(2),b(3),b(4), b(5),b(6),b(7),b(8), b(9),b(10),b(11),b(12), b(13),b(14),b(15),b(16), b(17),b(18),b(19),b(20), b(21),b(22),b(23),b(24), b(25),b(26),b(27),b(28), b(29),b(30),b(31),b(32), b(33),b(34), b(35));
end
问题在于优化结果即使在12个多小时后也没有出现(它仍在反思,扩展,收缩内部等)。有人可以让我知道如何更快地完成这个过程吗?
谢谢。
答案 0 :(得分:1)
这不是你问题的完整答案;这是关于如何更好地编写代码的建议,这可能是答案的一半。
我会写你的调用脚本:
%% Minimization
b0 = zeros(1,35);
iter = 5e4;
options=optimset(...
'Display' , 'iter',...
'MaxIter' , iter,...
'MaxFunEvals', 1e5);
data = {...
YL, tempcyc, cyc, Yzero, age, agesq, educ, ageav, agesqav, educav, qv, ...
year1, year2, year3, year4, year5, year6, year7, ...
workregion1, workregion2, workregion3, workregion4, workregion5, ...
workregion6, workregion7, workregion8, workregion9, workregion10, ...
workregion11, workregion12, workregion13, workregion14, workregion15, ...
workregion16
};
[b, fval, exitflag, output] = fminsearch(@(b)obj(b, Y,data,qw), b0, options);
%% Print results
fprintf('[b]:');
fprintf('%1.4e', b);
fprintf('\n');
(实际上,我还会将数据包装在单元格中而不是16 workregions
和7 years
等。但您可能不是数据的创建者,因此这可能并非总是可能)
您可以重写这样的目标函数:
function A = obj(b, Y, others, qw)
A = 0;
sPi = -0.5*log(pi);
bB = num2cell(b);
for ii = 1:715
P = prod( normcdf((2*Y(ii,1:8)-1) .* cellfun(@(x,y) x(ii,1:8).*y, others, bB)) );
S = sum( P*qw(1:12,1) );
A = A + log(S) + sPi;
end
A = -A;
end
也可以将外环简化为矢量化形式。但我无法测试所有这些的正确性(或者它是否完全运行),因为我无法访问您的数据。但我相信你明白了 - 你现在至少可以读取你的代码,并且可能自己发现错误。