📄 regirls.m
字号:
% REGIRLS Regularised IRLS with Newton Step Backoff
function [w, errs, diagC, logDetH, LD, badHess, Li, e, vary] = ...
regirls(X,t,alpha,w,options)
STOP_CRITERION = 1e-6;
LAMBDA_MIN = 2^(-8);
its = optimget(options,'MaxIter');
dispFlag = optimget(options,'Display');
[N d] = size(X);
A = diag(alpha);
errs = zeros(its,1);
Xw = X*w;
y = sigmoid(Xw);
t = logical(t);
data_term = -(sum(log(y(t))) + sum(log(1-y(~t))))/N;
regulariser = (alpha'*(w.^2))/(2*N);
err_new = data_term + regulariser;
for i=1:its
betaFactor = 1;
vary = y.*(1-y)*betaFactor;
XV = X .* (vary * ones(1,d));
e = (t-y)*betaFactor;
g = X'*e - alpha.*w;
Hessian = (XV'*X + A);
if i==1
condHess = rcond(Hessian);
if condHess<eps
fprintf('(regirls) warning: ill-conditioned Hessian (%g)\n', condHess)
fprintf('(regirls) returning for alpha-update (%g , %g)\n',...
max(alpha), min(alpha));
badHess = 1;
diagC = 0;
logDetH = 0;
return
end
end
errs(i) = err_new;
if dispFlag>1
fprintf('Cycle: %d\t error: %.3f\n', i, errs(i))
end
if i>3 & abs(errs(i)-errs(i-1))<STOP_CRITERION
errs = errs(1:i);
if dispFlag
fprintf(['(regirls) converged (<%g) after %d iterations, ' ...
'gradient = %g\n'],...
STOP_CRITERION,i,sum(abs(g)))
end
break
end
L = chol(Hessian);
delta_w = L \ (L' \ g);
lambda = 1;
while lambda>LAMBDA_MIN
w_new = w + lambda*delta_w;
Xw = X*w_new;
y = sigmoid(Xw);
if any(y(t)==0) | any(y(~t)==1)
err_new = inf;
else
data_term = -(sum(log(y(t))) + sum(log(1-y(~t))))/N;
regulariser = (alpha'*(w_new.^2))/(2*N);
err_new = data_term + regulariser;
end
if err_new>errs(i)
lambda = lambda/2;
if dispFlag>1
fprintf('(regirls) error increase! Backing off ... (%.3f)\n',lambda)
end
else
w = w_new;
lambda = 0;
end
end
if lambda
if dispFlag
fprintf('(regirls) stopping due to back-off limit, gradient = %g\n',...
sum(abs(g)))
end
break;
end
end
%data_term
%regulariser
Li = L \ eye(d);
diagC = sum(Li.^2,2);
logDetH = 2*sum(log(diag(L)));
badHess = 0;
LD = -N*data_term;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -