source: prextra/incsvc.m @ 5

Last change on this file since 5 was 5, checked in by bduin, 14 years ago
File size: 3.4 KB
RevLine 
[5]1function w = incsvc(a,ktype,par,C)
2%INCSVC Incremental support vector classifier
3%
4%     W = INCSVC(A,KTYPE,PAR,C)
5%
6% INPUT
7%   A      Dataset
8%   KTYPE  Type of the kernel (optional; default: 'p')
9%    PAR   Kernel parameter (optional; default: 1)
10%    C     Regularization parameter (optional; default: 1)
11%
12%  OUTPUT
13%    W     Mapping: Support Vector Classifier
14%
15%  DESCRIPTION
16%  Optimizes a support vector classifier for the dataset A by an
17%  incremental procedure to perform the quadratic programming. The
18%  classifier can be of one of the types as defined by PROXM. Default is
19%  linear (TYPE = 'p', PAR = 1). The kernel computation is done by
20%  INCKERNEL which is more lightweight than PROXM.  C < 1 allows for
21%  more class overlap. Default C = 1.
22%
23%  See also ADD_OBJ_CL, SVC, INCKERNEL
24
25% Copyright: D.M.J. Tax, D.M.J.Tax@prtools.org
26% Faculty EWI, Delft University of Technology
27% P.O. Box 5031, 2600 GA Delft, The Netherlands
28
29if nargin < 4 | isempty(C)
30        C = 1;
31        prwarning(3,'Regularization parameter C set to 1\n');
32end
33if nargin < 3 | isempty(par)
34        par = 1;
35        prwarning(3,'Kernel parameter par set to 1\n');
36end
37if nargin < 2 | isempty(ktype)
38        ktype = 'p';
39        prwarning(3,'Polynomial kernel type is used\n');
40end
41if nargin < 1 | isempty(a)
42        w = mapping(mfilename,{ktype,par,C});
43        w = setname(w,'Inc. Support Vector Classifier');
44        return;
45end
46
47if ~isa(ktype,'mapping') %training
48        %Basic sizes::
49        [N,k,c] = getsize(a);
50        %kernel definition:
51        kernel = 'inckernel';
52        kpar.type = ktype;
53        kpar.s = par;
54        %setting for displaying: (I know you can program it shorter, but this is
55        %more clear):
56        if N>=1000
57                dodisplay = 1;
58        else
59                dodisplay = 0;
60        end
61
62        if c==2
63                % randomize the data:
64                %I = randperm(N); a = a(I,:);
65                a = unrandomize(a);
66
67                % settings for the program:
68                global X_incremental;
69                X_incremental = +a;
70                y = 3 - 2*getnlab(a);
71
72                % here we go:
73                alf = zeros(N,1);   % weights
74                grad = [];          % the gradient of all seen objects
75                setR = [];          % 'rest' set
76                Kr = [];            % kernel matrix of the rest objects(RxS)
77                setD = [];
78                setS = [];
79                setE = [];
80                Ke = [];
81                Ks = 0;
82                b = 0;
83                R = inf;
84                tol = 1e-8;
85
86                % startup:
87                for c=1:N
88                        if dodisplay & mod(c,100)==0
89                                fprintf('%d/%d ',c,N);
90                        end
91                        add_obj_cl;
92                end
93
94                % make the classifier
95                W.kernel = kernel;
96                W.kpar = kpar;
97                J = [setS;setE];
98                W.J = J;
99                W.sv = X_incremental(J,:);
100                W.v = y(J).*alf(J,:);
101                W.b = b;
102                w = mapping(mfilename,'trained',W,getlablist(a),k,2);
103                w = setname(w,'Inc. Support Vector Classifier');
104
105        else   % multi-class classifier:
106               
107                w = mclassc(a,mapping(mfilename,{ktype,par,C}));
108               
109        end
110
111else   %execution
112        W = +ktype;
113        [n,d] = size(a);
114        laba = getlab(a);
115        orga = a;
116        a = +a;
117        global X_incremental;
118        X_incremental = [W.sv; zeros(1,d)];
119        nra = size(W.sv,1)+1; I = 1:nra;
120        out = repmat(W.b,n,1);
121        for i=1:n
122                X_incremental(nra,:) = a(i,:);
123                Ka = feval(W.kernel,W.kpar,nra,I);
124                out(i) = out(i) + Ka(1:(nra-1))*W.v;
125        end
126        newout = [out -out];
127        w = setdat(orga,newout,ktype);
128end
129
130return
131
132
133
134function a= unrandomize(a);
135% Unrandomize a dataset;
136
137[n,k,c]=getsize(a);
138if c~=2
139        error('I assume 2 classes');
140end
141
142nlab = getnlab(a);
143I1 = find(nlab==1);
144I2 = find(nlab==2);
145
146if length(I1)<length(I2)
147        cmin = length(I1);
148else
149        cmin = length(I2);
150        tmpI = I1;
151        I1 = I2;
152        I2 = tmpI;
153end
154
155J=[];
156J(1:2:2*cmin) = I1;
157J(2:2:2*cmin) = I2(1:cmin);
158J = [J,I2((cmin+1):end)'];
159a = a(J,:);
160
161return
Note: See TracBrowser for help on using the repository browser.