-1
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嵌套在总和 (across ) 中的乘积(across) 组成,而总和 (across m=1:12) 又嵌套在总和 (across 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 多个小时后也没有出现(它仍然在反射、扩展、收缩内部等)。有人能给我一个关于如何使过程更快的想法吗?

谢谢你。

4

1 回答 1

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');

(实际上,我也会将数据包装在单元格中,而不是 16workregions和 7years等。但您可能不是数据的创建者,所以这可能并不总是可能的)

你可以像这样重写你的目标函数:

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

可能外循环也可以简化为矢量化形式。但我无法测试所有这些的正确性(或者它是否运行),因为我无权访问您的数据。但我相信你明白了——你现在至少可以阅读你的代码,并且可能自己发现错误。

于 2014-06-20T11:50:20.253 回答