⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regirls.m

📁 关于人脸识别的一个VC程序
💻 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 + -