2013-12-07 77 views
1

我想編碼一個迭代重新加權最小二乘算法用於人臉識別的邏輯迴歸(圖像表示爲19x19灰度圖像),但重量總是以NaN結束。爲什麼邏輯迴歸的迭代重加權最小二乘算法的權重總是以NaN結束?

w_new = zeros(361,1); 

for i = 1:35 % 100-fold cross-validation of 3480 samples 

    [ phi, t, ~, ~ ] = removeRows100FoldCV(i, trainx, traint); 
    t(t == -1) = 0; 
    while(true) 

     w_old = w_new; 
     y = computeYs(w_old, phi); 
     R = generateR(y); 
     w_new = w_old - inv(phi' * R * phi) * phi' * (y - t); 

     if onlyMarginalChangesInW(w_new, w_old) == true 
      break; 
     end 

    end 
end 

目標向量t原本是1或-1,具體取決於表示臉部的圖像。

計算的Y:

function [ y ] = computeYs(w, phi) 

y = zeros(size(phi,1), 1); 

for i = 1:size(phi,1) 
    a = w' * phi(i,:)'; 
    y(i) = 1/(1+exp(-a)); 
end 

end 

代的R:

function [ R ] = generateR(y) 

R = zeros(size(y)); 

for i = 1:size(R,1) 
    R(i,i) = y(i) * (1 - y(i)); 
end 

end 

而中斷條件觸發:

function [ result ] = onlyMarginalChangesInW(w_new, w_old) 

result = true; 
for i = 1:size(w_new) 
    if (w_new(i)/w_old(i) > 0.01) 
     result = false; 
     break; 
    end 
end 

end 

回答

1

NaN結果發生在你的inv(phi' * R * phi)。你有沒有檢查你的phi?嘗試cond(phi)來檢查它是否非常大。這可能會導致反向操作提供了一個巨大的元素。順便說一句,我想了解爲什麼它不是w_new = w_old - inv(phi' * R * phi) * phi' * R * (y - t);在你的迭代重加權最小二乘算法的實現?