fminsearch(matlab)花了太多时间

时间:2014-06-20 08:14:42

标签: matlab fminsearch

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)]YYLtempcyc,..........,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个多小时后也没有出现(它仍在反思,扩展,收缩内部等)。有人可以让我知道如何更快地完成这个过程吗?

谢谢。

1 个答案:

答案 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

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