我想并行化一些使用 MATLABmle
例程进行参数拟合的 MATLAB 代码。我进行并行化的原因是我想对mle
同一数据集执行多个不同猜测的例程。
初始模拟表明,并行化代码比串行版本(约 500 秒)多花费 200-400 秒,具体取决于我适合的数据集(到时间,我只是在代码的开头和结尾)tic
。toc
我使用parfor
不正确吗?
tic
mitdata; % load data
data=dmso; % take the 'DMSO' column data
num=length(data);
mm=linspace(.1, 1, 2)'; % mean values
vv=linspace(.1, 2, 2)'; % variance values
N=length(mm);
n=length(vv);
% get all combinations of the initial parameter guesses I want to try
pp = cell(N, n);
for i = 1:N
for j = 1:n
pp{(i-1)*N+j} = [mm(i), vv(j)];
end
end
temp = nchoosek([1:N*n, 1:N*n], 2);
temp = sort(temp, 2);
idx = unique(temp, 'rows');
P = zeros(length(idx),4);
for ii = 1:length(idx)
P(ii,:) = [pp{idx(ii,1)},pp{idx(ii,2)}];
end
Pcell = num2cell(P); % convert P to cell so that it's easier to assign parameter values for initial guess
options = statset('MaxIter',10000, 'MaxFunEvals',10000);
pd = zeros(length(P),4); % space for best fit parameters
ld = NaN*ones(length(P),1); % space for likelihood values
parfor i=1:length(P)
[m1,v1,m2,v2] = Pcell{i,:};
x0 = [m1,v1,m2,v2]; % initial guess
[p,conf1]=mle(data,'pdf',@convolv_2invG,'start',x0, 'upperbound', [Inf Inf Inf Inf],'lowerbound',[0 0 0 0],'options',options)
pd(i,:)=p; % get best fit parameters from MLE
l=convolv_2invG(data,p(1),p(2),p(3),p(4)); % use best fit parameters to evaluate pdf
l=sum(log(l));
if l<0
ld(i)=l; % store likelihood values
end
end
toc