--- a +++ b/Semantic Features/NotUsed/svr.m @@ -0,0 +1,121 @@ +function [ nsv , beta , bias ] = svr (X,Y,ker ,C, loss ,e) +%Note: As of 7/17/2013 this code is broken and has not be used once - ES + +% SVR Support Vector Regression +% +% Usage : [ nsv beta bias ] = svr (X,Y,ker ,C ,loss ,e) +% +% Parameters : X - Training inputs +% Y - Training targets +% ker - kernel function +% C - upper bound ( non - separable case ) +% loss - loss function +% e - insensitivity +% nsv - number of support vectors +% beta - Difference of Lagrange Multipliers +% bias - bias term +% +% Author : Steve Gunn ( srg@ecs . soton .ac .uk ) +if ( nargin < 3 | nargin > 6) % check correct number of arguments + help svr +else + fprintf ('Support Vector Regressing ....\ n') + fprintf (' ______________________________ \n') + n = size (X ,1); + if ( nargin <6) e =0.0; , end + if ( nargin <5) loss =' eInsensitive ';, end + if ( nargin <4) C= Inf ;, end + if ( nargin <3) ker ='linear ';, end + + % Construct the Kernel matrix + + fprintf (' Constructing ...\ n'); + H = zeros (n,n); + for i =1: n + for j =1: n + H(i,j ) = svkernel (ker ,X(i ,:) ,X(j ,:)); + end + end + + % Set up the parameters for the Optimisation problem + switch lower ( loss ) + case ' einsensitive ', + Hb = [ H -H; -H H]; + c = [( e* ones (n ,1) - Y ); ( e* ones (n ,1) + Y )]; + vlb = zeros (2*n ,1); % Set the bounds : alphas >= 0 + vub = C* ones (2*n ,1); % alphas <= C + x0 = zeros (2*n ,1); % The starting point is [0 0 0 0] + neqcstr = nobias ( ker ); % Set the number of equality constraints (1 or 0) + if neqcstr + A = [ ones (1,n) - ones (1,n)]; , b = 0; % Set the constraint Ax = b + else + A = []; , b = []; + end + case 'quadratic ', + Hb = H + eye (n )/(2* C); + c = -Y; + vlb = -1 e30 * ones (n ,1); + + vub = 1 e30 * ones (n ,1); + x0 = zeros (n ,1); % The starting point is [0 0 0 0] + neqcstr = nobias ( ker ); % Set the number of equality constraints (1 or 0) + if neqcstr + A = ones (1,n); , b = 0; % Set the constraint Ax = b + else + A = []; , b = []; + end + otherwise , disp ('Error : Unknown Loss Function \n'); +end + +% Add small amount of zero order regularisation to +% avoid problems when Hessian is badly conditioned . +% Rank is always less than or equal to n. +% Note that adding to much reg will peturb solution + +Hb = Hb + 1e -10 * eye ( size (Hb )); + +% Solve the Optimisation Problem +fprintf ('Optimising ...\ n'); +st = cputime ; + +[ alpha lambda how ] = qp(Hb , c , A , b , vlb , vub , x0 , neqcstr ); + +fprintf ('Execution time : %4.1 f seconds \n',cputime - st ); +fprintf ('Status : % s\n',how ); + +switch lower ( loss ) + case ' einsensitive ', + beta = alpha (1: n) - alpha (n +1:2* n); + case 'quadratic ', + beta = alpha ; +end +fprintf ('|w0 |^2 : % f\n',beta '*H* beta ); +fprintf ('Sum beta : % f\n',sum ( beta )); + +% Compute the number of Support Vectors +epsilon = svtol ( abs ( beta )); +svi = find ( abs ( beta ) > epsilon ); +nsv = length ( svi ); +fprintf ('Support Vectors : % d (%3.1 f %%)\ n',nsv ,100* nsv /n); + +% Implicit bias , b0 +bias = 0; + +% Explicit bias , b0 +if nobias ( ker ) ~= 0 + switch lower ( loss ) + case ' einsensitive ', + % find bias from average of support vectors with interpolation error e + % SVs with interpolation error e have alphas : 0 < alpha < C + svii = find ( abs ( beta ) > epsilon & abs ( beta ) < (C - epsilon )); + if length ( svii ) > 0 + bias = (1/ length ( svii ))* sum (Y( svii ) - e* sign ( beta ( svii )) - H(svii , svi )* beta ( svi )); + else + fprintf ('No support vectors with interpolation error e - cannot compute bias .\n'); + bias = ( max (Y)+ min (Y ))/2; + end + case 'quadratic ', + bias = mean (Y - H* beta ); + end + end +end \ No newline at end of file