我正在尝试使用迭代重加权最小二乘算法进行逻辑回归以进行人脸识别(图像表示为19x19灰度图像),但权重总是以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
答案 0 :(得分:1)
NaN
结果发生在inv(phi' * R * phi)
。你检查了phi
吗?尝试cond(phi)
检查它是否非常大。这可能会导致逆操作提供巨大的元素。
顺便说一下,我试图理解为什么在迭代重加权最小二乘算法实现中它不是w_new = w_old - inv(phi' * R * phi) * phi' * R * (y - t);
?