fmincon的快速替代品,可实现对数似然

时间:2019-05-22 09:37:45

标签: matlab optimization log-likelihood

我目前正在使用fmincon来针对18 * 18矩阵最小化对数似然函数。在较小的问题上,该算法速度非常快,但在当前设置中收敛大约需要2小时-当我迭代此最小化问题时,运行代码可能需要长达2周的时间。

是否有基于Matlab的fmincon的免费替代品,可以提高处理此类特定问题的速度? (通常讨论的解决方案为here,非解决方案的解决方案为here。)或者我需要致电例如来自matlab的python脚本?

我要最小化的功能:

function [L] = logL(A, U, Sigma_e, T, lags)
% A - parameters to optimize w.r.t

logL = 0;
for t = 1 : T - lags
   logL(t, 1) = 0.5*(log(det(A * diag(Sigma_e(t,:)) * A' ) ) + ...
                U(t,:) * (A * diag(Sigma_e(t,:))  * A' )^(-1) *  U(t,:)' );

end
L = sum(logL);

并通过以下方式调用:

Options = optimset('Algorithm', 'active-set', 'Display', 'off', 'Hessian','bfgs', ...
'DerivativeCheck','on','Diagnostics','off','GradObj','off','LargeScale','off'); 


A = fmincon( @(A0)logL(A0, U, Sigma_e, T, lags), A0 , [], [] , [] , [] , [] , [] , [], Options); 

(我尝试了不同的fmincon算法,但没有太大改进)。注意,T很大〜3000。 A和A0是18 * 18的矩阵, Sigma_e是T * 18, U是T * 18

1 个答案:

答案 0 :(得分:1)

我不知道fminconst的任何快速替代方法,但是您可以向量化logL函数以加快算法的速度。这是矢量化版本:

function [L] = logL(A, U, Sigma_e, T, lags)
    ia = inv(A);
    iat = ia.';
    N = T - lags;
    UU = zeros(N,1); 
    for t = 1: N
        UU (t) = U(t,:) * (iat .* 1./Sigma_e(t,:) * ia) * U(t,:)';
    end

    L =  0.5 *sum( log(det(A) ^ 2  .* prod(Sigma_e(1:N,:),2)) + UU);
end

在Octave的某些测试中,它的速度几乎比您的解决方案快10倍。

请注意,如果Sigma_e的某些元素等于零,则需要将UU计算为:

UU (t)=U(t,:) * (A * diag(Sigma_e(t,:))  * A' )^(-1) *  U(t,:)';

这些关系用于将循环解转换为矢量化的解:

det(a * b * c) == det(a) * det(b) * det(c)

det(a) == det(a.')

det(diag(a)) == prod(a)

(a * b * c)^-1 == c^-1 * b^-1 * a^-1

a * diag(b) == a .* b

inv(diag(a)) == diag(1./a)