📄 kernelfunction.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 + -