-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathsvmkernel.m
More file actions
85 lines (80 loc) · 2.74 KB
/
svmkernel.m
File metadata and controls
85 lines (80 loc) · 2.74 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
function K = svmkernel(net, X1, X2)
% SVMKERNEL - Compute Support Vector Machine kernel function
%
% K = SVMKERNEL(NET, X1, X2)
% The Support Vector Machine structure NET must contain 2 field
% NET.kernel and NET.kernelpar, selecting the kernel function and its
% parameters. X1 and X2 contain one example per row. If X1 is of size
% [M, NET.nin] and X2 is of size [N, NET.nin], K will be a matrix
% [M, N]. K(i,j) is the result of the kernelfunction for inputs X1(i,:)
% and X2(j,:).
% Currently the only valid kernel functions are
% NET.kernel = 'linear'
% inner product
% NET.kernel = 'poly'
% (1+inner product)^NET.kernelpar(1)
% NET.kernel = 'rbf'
% radial basis function, common length scale for all inputs is
% NET.kernelpar(1), scaled with the number of inputs NET.nin
% K = exp(-sum((X1i-X2i)^2)/(NET.kernelpar(1)*NET.nin))
% NET.kernel = 'rbffull'
% radial basis function, different length scale for each input.
% If NET.kernelpar is a vector of length NET.nin
% K = exp(-sum((X1i-X2i)^2*NET.kernelpar(i))/NET.nin)
% If NET.kernelpar is a vector of length NET.nin+1
% K = exp(NET.kernelpar(end)-sum((X1i-X2i)^2*NET.kernelpar(i))/NET.nin)
% If NET.kernelpar is a matrix of size [NET.nin, NET.nin]
% K = exp(-(X1-X2)*NET.kernelpar*(X1-X2)'/NET.nin)
%
% See also
% SVM, SVMTRAIN, SVMFWD
%
%
% Copyright (c) Anton Schwaighofer (2001)
% $Revision: 1.3 $ $Date: 2001/06/18 15:21:55 $
% mailto:anton.schwaighofer@gmx.net
%
% This program is released unter the GNU General Public License.
%
errstring = consist(net, 'svm', X1);
if ~isempty(errstring);
error(errstring);
end
errstring = consist(net, 'svm', X2);
if ~isempty(errstring);
error(errstring);
end
[N1, d] = size(X1);
[N2, d] = size(X2);
switch net.kernel
case 'linear'
K = X1*X2';
case 'poly'
K = (1+X1*X2').^net.kernelpar(1);
case 'rbf'
dist2 = repmat(sum((X1.^2)', 1), [N2 1])' + ...
repmat(sum((X2.^2)',1), [N1 1]) - ...
2*X1*(X2');
K = exp(-dist2/(net.nin*net.kernelpar(1)));
case 'rbffull'
bias = 0;
if any(all(repmat(size(net.kernelpar), [4 1]) == ...
[d 1; 1 d; d+1 1; 1 d+1], 2), 1),
weights = diag(net.kernelpar(1:d));
if length(net.kernelpar)>d,
bias = net.kernelpar(end);
end
elseif all(size(net.kernelpar)==[d d]),
weights = net.kernelpar;
else
error('Size of NET.kernelpar does not match the chosen kernel ''rbffull''');
end
dist2 = (X1.^2)*weights*ones([d N2]) + ...
ones([N1 d])*weights*(X2.^2)' - ...
2*X1*weights*(X2');
K = exp(bias-dist2/net.nin);
otherwise
error('Unknown kernel function');
end
K = double(K);
% Convert to full matrix if inputs are sparse