1 | %KFD Kernel Fisher Discriminant |
---|
2 | % |
---|
3 | % W = KFD(K,ALF,BIAS) |
---|
4 | % |
---|
5 | % INPUT |
---|
6 | % K NxN kernel or similarity matrix (dataset) |
---|
7 | % ALF Regularization constant |
---|
8 | % BIAS Use bias (1) or not (0) |
---|
9 | % |
---|
10 | % OUTPUT |
---|
11 | % W Trained Kernel Fisher discriminant |
---|
12 | % |
---|
13 | % DEFAULT |
---|
14 | % ALF = 0.0001 |
---|
15 | % BIAS = 1 |
---|
16 | % |
---|
17 | % DESCRIPTION |
---|
18 | % Finds a Fisher linear discriminant in a kernel-induced space. |
---|
19 | % Regularization is necessary. |
---|
20 | % Multi-class classifier is trained one-vs-all classes. |
---|
21 | % |
---|
22 | % SEE ALSO |
---|
23 | % KPCA, FISHERC, MAPPINGS, DATASETS |
---|
24 | % |
---|
25 | % REFERENCE |
---|
26 | % S. Mika, G. Ratsch, J. Weston, B. Scholkopf, and K.-R. Muller. |
---|
27 | % Fisher discriminant analysis with kernels. In: Neural Networks for |
---|
28 | % Signal Processing IX, pages 41-48, 1999. |
---|
29 | % |
---|
30 | |
---|
31 | % Copyright: Ela Pekalska, ela.pekalska@googlemail.com |
---|
32 | % Faculty EWI, Delft University of Technology and |
---|
33 | % School of Computer Science, University of Manchester |
---|
34 | % |
---|
35 | |
---|
36 | |
---|
37 | function W = kfd(K,alf,isb0) |
---|
38 | if nargin < 3, |
---|
39 | isb0 = 1; |
---|
40 | end |
---|
41 | if nargin < 2 | isempty(alf), |
---|
42 | alf = 0.0001; |
---|
43 | end |
---|
44 | if nargin < 1 | isempty(K), |
---|
45 | W = prmapping(mfilename,{alf,isb0}); |
---|
46 | W = setname(W,'KFD'); |
---|
47 | return |
---|
48 | end |
---|
49 | |
---|
50 | if alf <= 0, |
---|
51 | error('A small positive regularization ALF is necessary.'); |
---|
52 | end |
---|
53 | |
---|
54 | islabtype(K,'crisp'); |
---|
55 | isvaldset(K,1,2); % At least one object per class and two classes |
---|
56 | |
---|
57 | lab = getnlab(K); |
---|
58 | lablist = getlablist(K); |
---|
59 | [n,k,C] = getsize(K); |
---|
60 | |
---|
61 | |
---|
62 | % If more than two classes, train in the one-against-all strategy. |
---|
63 | if C > 2, |
---|
64 | W = []; |
---|
65 | for i=1:C |
---|
66 | mlab = 2 - (lab == i); |
---|
67 | KK = setlabels(K,mlab); |
---|
68 | KK = remclass(KK,0); |
---|
69 | if ~isempty(K.prior) |
---|
70 | KK = setprior(KK,[K.prior(i),1-K.prior(i)]'); |
---|
71 | end |
---|
72 | |
---|
73 | v = kfd(KK,alf,isb0); |
---|
74 | W = [W,setlabels(v(:,1),lablist(i,:))]; |
---|
75 | end |
---|
76 | return |
---|
77 | |
---|
78 | else % Two classes |
---|
79 | |
---|
80 | % V = kcenterm(K); % Center the kernel |
---|
81 | % KK = +(K*V); % but ... centering is not necessary |
---|
82 | |
---|
83 | KK = +K; |
---|
84 | Y = 3 - 2 * lab; % Set labels to +/-1 |
---|
85 | I1 = find(Y==1); |
---|
86 | I2 = find(Y==-1); |
---|
87 | n1 = length(I1); |
---|
88 | n2 = length(I2); |
---|
89 | |
---|
90 | M1 = sum(KK(:,I1),2)/n1; |
---|
91 | M2 = sum(KK(:,I2),2)/n2; |
---|
92 | M = (M1-M2)*(M1-M2)'; |
---|
93 | N = KK(:,I1)*(eye(n1) - ones(n1)/n1)*KK(:,I1)' + KK(:,I2)*(eye(n2) - ones(n2)/n2)*KK(:,I2)'; |
---|
94 | |
---|
95 | % Regularization |
---|
96 | N = N + alf * eye(n); |
---|
97 | |
---|
98 | % Optimization |
---|
99 | %[W,V,U] = svds(prinv(N)*M,1); |
---|
100 | W = prinv(N)*(M1-M2); % The same as above up to scaling |
---|
101 | |
---|
102 | % Project data on the found direction |
---|
103 | b0 = 0; |
---|
104 | if isb0, |
---|
105 | % Find the free parameter |
---|
106 | b0 = -W'*(M1+M2)/2; |
---|
107 | end |
---|
108 | end |
---|
109 | |
---|
110 | |
---|
111 | % Determine the mapping |
---|
112 | W = affine(W,b0,K,lablist,k,2); |
---|
113 | %W = cnormc(W,K); |
---|
114 | %W = V*W; |
---|
115 | W = setname(W,'KFD'); |
---|
116 | return; |
---|