-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdd_kernel.m
More file actions
executable file
·117 lines (113 loc) · 2.62 KB
/
dd_kernel.m
File metadata and controls
executable file
·117 lines (113 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
%DD_KERNEL Kernel computation
%
% K = DD_KERNEL(A,B,KTYPE,P);
%
% INPUT
% A,B Data matrices
% KTYPE Kernel type
% P Kernel parameter
%
% OUPUT
% K Matrix with kernel values
%
% DESCRIPTION
% Computation of a kernel function between A and B. The data A and B are
% expected to be standard Matlab matrices (NOT prtools datasets).
%
% The kernel is defined by the kernel type KTYPE, and its parameter P.
% KTYPE defines the kernel type
% 'linear' | 'l': A*B'
% 'polynomial' | 'p': sign(A*B'+1).*(A*B'+1).^P
% 'homogeneous' | 'h': sign(A*B').*(A*B').^P
% 'exponential' | 'e': exp(-(||A-B||)/P)
% 'radial_basis' | 'r': exp(-(||A-B||.^2)/(P*P))
% 'sigmoid' | 's': sigm((sign(A*B').*(A*B'))/P)
% 'distance' | 'd': ||A-B||.^P
% 'cityblock' | 'c': ||A-B||_1
% 'negdistance' | 'n': -||A-B||.^P
%
% When more than 1 free parameter is required, then parameter P can be a
% vector of length 2 or more.
%
% SEE ALSO
% dd_proxm, sqeucldistm
% Copyright: D.M.J. Tax, D.M.J.Tax@prtools.org
% Faculty EWI, Delft University of Technology
% P.O. Box 5031, 2600 GA Delft, The Netherlands
% See also: incsvdd, proxm, Wstartup, Wadd
function K = dd_kernel(A,B,ktype,kpar);
switch ktype
case {'linear' 'l'}
K = A*B';
case {'polynomial' 'p'}
K = A*B';
if kpar ~= 1
n = size(A,1);
m = size(B,1);
if kpar ~= round(kpar)
K = K + ones(n,m);
K = sign(K).*abs(K).^kpar;
else
K = K + ones(n,m);
K = K.^kpar;
end
end
case {'homogeneous' 'h'}
K = A*B';
if kpar ~= 1
n = size(A,1);
m = size(B,1);
if kpar ~= round(kpar)
K = sign(K).*abs(K).^kpar;
else
K = K.^kpar;
end
end
case {'sigmoid' 's'}
K = A*B';
if length(kpar)>1
K = sigm(K/kpar(1) + kpar(2)); %DXD: I need this sometimes
else
K = sigm(K/kpar);
end
case {'exponential' 'e'}
K = sqeucldistm(A,B);
J = find(K<0);
K(J) = zeros(size(J));
K = exp(-sqrt(K)/kpar);
case {'radial_basis' 'r'}
K = sqeucldistm(A,B);
J = find(K<0);
K(J) = zeros(size(J));
K = exp(-K/(kpar*kpar));
case {'inv_radial_basis' 'i'}
K = sqeucldistm(A,B);
J = find(K<0);
K(J) = zeros(size(J));
K = exp(sqrt(K)/kpar);
case {'distance' 'd'}
K = sqeucldistm(A,B);
J = find(K<0);
K(J) = zeros(size(J));
if kpar ~= 2
K = K.^(kpar/2);
end
case {'negdistance' 'n'}
K = sqeucldistm(A,B);
J = find(K<0);
K(J) = zeros(size(J));
if kpar ~= 2
K = K.^(kpar/2);
end
K = -K;
case {'cityblock', 'c'}
n = size(A,1);
m = size(B,1);
K = zeros(n,m);
for j=1:m
K(:,j) = sum(abs(A - repmat(B(j,:),n,1)),2);
end
otherwise
error(sprintf('Unknown proximity type: %s',ktype))
end
return