2013-12-07 1 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 в зависимости от изображения, представляющего лицо или нет.

Вычисление у:

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); в вашей итеративной реверсивной реализации наименее квадратного алгоритма?

Смежные вопросы