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

📄 kernelfunction.m

📁 关于人脸识别的一个VC程序
💻 M
字号:
% KERNELFUNCTION	Compute kernel functions for the RV
%
%	K = KERNELFUNCTION(X1,X2,KERNEL,KP,OPTIONS)
%	
%		K	N1 x (N2+1) kernel matrix, the first column being
%			comprised of 1's.
%
%		X1	N1 x d data matrix
%		X2	N2 x d data matrix
%		KERNEL	Kernel type: currently one of
%			'gauss' *
%			'poly' *
%			'spline'
%		KP	[Optional] parameter for the kernel function, for
%			those above marked (*).
%		OPTIONS	'nobias' returns a kernel matrix without the
%			column of 1's.
%

function K = kernelFunction(X1,X2,kernel_,kp,options_)

[N1 d]		= size(X1);
[N2 d]		= size(X2);

if exist('options_') & strcmp(upper(options_),'AUTO')
  AUTO_FLAG	= 1;
  options_	= 'NOBIAS';
else
  AUTO_FLAG	= 0;
end

if nargin>3
  if length(kp)>1
    INPUT_RELEVANCE	= 1;
  else
    INPUT_RELEVANCE	= 0;
  end
end

if length(kernel_)>=4 & strcmp(kernel_(1:4),'poly')
  d		= str2num(kernel_(5:end));
  kernel_	= 'poly';
end
if length(kernel_)>=5 & strcmp(kernel_(1:5),'hpoly')
  d		= str2num(kernel_(6:end));
  kernel_	= 'hpoly';
end

switch kernel_
  
 case 'linear',
  K	= X1*X2';
  
 case 'inputs',
  K	= X1;
  
 case 'none',
  K	= [];
  return

 case 'gauss',
  eta	= kp;
  if AUTO_FLAG
    K	= ones(N1,1);
  else
    if ~INPUT_RELEVANCE
      K	= exp(-eta*mexdistxy2(X1,X2));
    else
      K	= exp(-diagdistxy(X1,X2,eta));
    end
  end
 
 case 'scaledgauss',
  scale	= 1e2;
  eta	= kp;
  if ~INPUT_RELEVANCE
    K	= exp(-eta*mexdistxy2(X1,X2))*scale;
  else
    K	= exp(-diagdistxy(X1,X2,eta))*scale;
  end
  
  case 'gauss_invar_bsc',
  sigma2	= 1/kp;
  K	= invar_rbf_dot(X1',X2',sigma2);

  
  case 'lowe',
  eta	= kp;
  r2	= eta*mexdistxy2(X1,X2);
  K	= r2.*log(r2+(r2==0));
  
  case 'thinplate',
  eta	= kp;
  r2	= eta*mexdistxy2(X1,X2);
  K	= 0.5 * r2.*log(r2+(r2==0));
  
  case 'cauchy',
  eta	= kp;
  r2	= eta*mexdistxy2(X1,X2);
  K	= 1./(1+r2);
  
  case 'cubic',
  eta	= kp;
  r2	= eta*mexdistxy2(X1,X2);
  K	= r2.*sqrt(r2);
  
  case 'r',
  eta	= kp;
  % K	= 1./ (1+sqrt(eta*mexdistxy2(X1,X2)));
  K	= sqrt(eta)*sqrt(mexdistxy2(X1,X2));
  
  case 'r2',
  eta	= kp;
  K	= (eta)*(mexdistxy2(X1,X2));
  
   case 'bubble',
  eta	= kp;
  K	= eta*mexdistxy2(X1,X2);
  K	= K<1;
  
  case 'cone',
  eta	= kp;
  K	= 1 - sqrt(eta*mexdistxy2(X1,X2));
  K(K<0) = 0;
  
  case 'laplace',
  if AUTO_FLAG
    K	= ones(N1,1);
  else
    eta	= kp;
    K	= exp(-sqrt(eta*mexdistxy2(X1,X2)));
  end
  
  case 'poly',
  eta	= kp;
  if ~INPUT_RELEVANCE
    K	= (X1*(eta*X2)' + 1).^d;
  else
    N1	= size(X1,1);
    K	= ((X1.*(ones(N1,1)*eta(:)'))*X2' + 1).^d;
  end

  case 'hpoly',
  eta	= kp;
  K	= (eta*X1*X2').^d;

  case 'tanh',
  v	= kp;
  if AUTO_FLAG
    K		= tanh(v*sum(X1.^2,2));
  else
    K	= tanh(v*X1*X2');
  end
  
 case {'local-linear','locallinear'},
  if AUTO_FLAG
    K		= sum(X1.^2,2);
  else
    eta		= kp;
    D2		= (eta*mexdistxy2(X1,X2));
    K		= X1*X2';
    K(D2>1)	= 0;
  end
  
  case 'spline',
  K	= 1;
  X1	= X1*kp;
  X2	= X2*kp;
  for i=1:d
    XX		= X1(:,i)*X2(:,i)';
    Xx1		= X1(:,i)*ones(1,N2);
    Xx2		= ones(N1,1)*X2(:,i)';
    minXX	= min(Xx1,Xx2);
    
    K	= K .* [1 + XX + XX.*minXX-(Xx1+Xx2)/2.*(minXX.^2) + (minXX.^3)/3];
  end
  
  otherwise,
  error(sprintf('Unrecognised kernel function type: %s', kernel_))
end
  
if ~exist('options_') | ~strcmp(options_,'NOBIAS')
  K	= [ones(N1,1) K];
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -