優化

通過邏輯映射施加 MLE 限制

  • January 27, 2016

我正在做一些具有隨時間變化的參數的密度的最大概似估計。我正在使用Matlab中的函式,但我不知道如何對參數向量施加限制。需要明確的是,我有一個參數向量(不隨時間變化),我知道如何對它們施加限制。但是我想讓兩個參數隨時間變化,但我不知道如何對包含這些隨時間變化的參數的向量施加限制。總結一下,我有一個包含幾個時不變參數的向量和兩個時變參數的向量。fmincon

我發現一篇論文建議使用表單的邏輯映射 $ \Theta_{t, restricted} = L + \frac{(U-L)}{1+exp(-\Theta_t)} $ 在哪裡 $ \Theta_t = (x_1, x_2) $ U 和 L 分別是受限參數的上限和下限。 $ x_1, x_2 $ 是我要對其施加限制的時變參數。

對於將這個邏輯映射實現到我的優化問題中的任何幫助,我將不勝感激。

這是我建構的一個使用邏輯映射的 MLE。

%MLE iterator:
for cxm = 1:cxmax
   for cxth = 1:wx; %thx 
       %Incr. theta within asymptotic min and max.
           thi1 = thA1(cxth,1); mint = thA1(cxth,2); maxt = thA1(cxth,3);
           thix = -log((maxt - mint)/(thi1 - mint) - 1); %Logistic inverse.
           if rand > 0.5; signx = -1; else signx = 1; end
           expn = thix + 0.25 * signx / cxm; 
           thi2 = mint + ((maxt - mint)/(1 + exp(-expn))); %Logistic.
        %Calc. change in log likelihood.
           thA2 = thA1; 
           thA2(cxth,1) = thi2;
           %Constraint(s):
               thA2(wx+1:wx*2,1) = min(1,thA2(wx+1:wx*2,1) / sum(thA2(wx+1:wx*2,1))); 
           [llk1] = llkF(rC,thA1,tx,wx);
           [llk2] = llkF(rC,thA2,tx,wx);
       %Calc. update.
           thA3 = thA1;
           expn = thix + 1 * ((llk2 - llk1) / (expn - thix)) / cxm; 
           thA3(cxth,1) = mint + ((maxt - mint)/(1 + exp(-expn))); %Logistic.
           %Constraint(s):
               thA3(wx+1:wx*2,1) = min(1,thA3(wx+1:wx*2,1) / sum(thA3(wx+1:wx*2,1))); 
           [llk3] = llkF(rC,thA3,tx,wx);
       %Update thA1 only if thA2 or thA3 is better.
           disp([llk1 llk2 llk3]); %<<<<<<<<<<<<<<<<<<<<<<
           if llk2 > llk1 && llk2 > llk3; thA1 = thA2; llk1 = llk2; end
           if llk3 > llk1 && llk3 > llk2; thA1 = thA3; llk1 = llk3; end
   end%theta loop.
   llkV(cxm) = llk1;
   %disp(['     MLE: ', num2str(cxm),', ll = ',num2str(llk1)])
   %Test for MLE convergence.
       if cxm > 5;
           d5llk = (llkV(cxm) - llkV(cxm - 5)); %Calc. change in llk, lag 5.
           if d5llk < 0.0001; llkV(cxm + 1:cxmax) = llkV(1); 
               break; end; 
       end%test
end%MLE loop.
llkV = llkV(1:cxm); %Truncate away the zeros.
thA = thA1; %Reset theta array.

引用自:https://quant.stackexchange.com/questions/22114