fminsearch(matlab)花费了太多时间


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是我作为数据导入的矩阵。目标函数由嵌套在总和(跨m=1:12(中的乘积(跨t=1:8(组成,而乘积又嵌套在总和(跨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+ 小时后优化结果也没有显示(它仍在内部反射、扩展、收缩等(有人可以给我一个关于如何使过程更快的想法吗?

谢谢。

这不是对你的问题的完整回答;这是一个关于如何更好地编写代码的建议,这可能是答案的一半。

我会给你的调用脚本写成这样:

%% 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

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

相关内容

  • 没有找到相关文章

最新更新