svc.m
上传用户:liu_jing
上传日期:2013-07-02
资源大小:4k
文件大小:3k
开发平台:

Matlab

  1. function [nsv, alpha, b0] = svc(X,Y,ker,C)
  2. %SVC Support Vector Classification
  3. %
  4. %  Usage: [nsv alpha bias] = svc(X,Y,ker,C)
  5. %
  6. %  Parameters: X      - Training inputs
  7. %              Y      - Training targets
  8. %              ker    - kernel function
  9. %              C      - upper bound (non-separable case)
  10. %              nsv    - number of support vectors
  11. %              alpha  - Lagrange Multipliers
  12. %              b0     - bias term
  13. %
  14. %  Author: Steve Gunn (srg@ecs.soton.ac.uk)
  15.   if (nargin <2 | nargin>4) % check correct number of arguments
  16.     help svc
  17.   else
  18.     fprintf('Support Vector Classificationn')
  19.     fprintf('_____________________________n')
  20.     n = size(X,1);
  21.     if (nargin<4) C=Inf;, end
  22.     if (nargin<3) ker='linear';, end
  23.     % tolerance for Support Vector Detection
  24.     epsilon = svtol(C);
  25.     
  26.     % Construct the Kernel matrix
  27.     fprintf('Constructing ...n');
  28.     H = zeros(n,n);  
  29.     for i=1:n
  30.        for j=1:n
  31.           H(i,j) = Y(i)*Y(j)*svkernel(ker,X(i,:),X(j,:));
  32.        end
  33.     end
  34.     c = -ones(n,1);  
  35.     % Add small amount of zero order regularisation to 
  36.     % avoid problems when Hessian is badly conditioned. 
  37.     H = H+1e-10*eye(size(H));
  38.     
  39.     % Set up the parameters for the Optimisation problem
  40.     vlb = zeros(n,1);      % Set the bounds: alphas >= 0
  41.     vub = C*ones(n,1);     %                 alphas <= C
  42.     x0 = zeros(n,1);       % The starting point is [0 0 0   0]
  43.     neqcstr = nobias(ker); % Set the number of equality constraints (1 or 0)  
  44.     if neqcstr
  45.        A = Y';, b = 0;     % Set the constraint Ax = b
  46.     else
  47.        A = [];, b = [];
  48.     end
  49.     % Solve the Optimisation Problem
  50.     
  51.     fprintf('Optimising ...n');
  52.     st = cputime;
  53.     
  54.     [alpha lambda how] = qp(H, c, A, b, vlb, vub, x0, neqcstr);
  55.     
  56.     fprintf('Execution time: %4.1f secondsn',cputime - st);
  57.     fprintf('Status : %sn',how);
  58.     w2 = alpha'*H*alpha;
  59.     fprintf('|w0|^2    : %fn',w2);
  60.     fprintf('Margin    : %fn',2/sqrt(w2));
  61.     fprintf('Sum alpha : %fn',sum(alpha));
  62.     
  63.         
  64.     % Compute the number of Support Vectors
  65.     svi = find( alpha > epsilon);
  66.     nsv = length(svi);
  67.     fprintf('Support Vectors : %d (%3.1f%%)n',nsv,100*nsv/n);
  68.     % Implicit bias, b0
  69.     b0 = 0;
  70.     % Explicit bias, b0 
  71.     if nobias(ker) ~= 0
  72.       % find b0 from average of support vectors on margin
  73.       % SVs on margin have alphas: 0 < alpha < C
  74.       svii = find( alpha > epsilon & alpha < (C - epsilon));
  75.       if length(svii) > 0
  76.         b0 =  (1/length(svii))*sum(Y(svii) - H(svii,svi)*alpha(svi).*Y(svii));
  77.       else 
  78.         fprintf('No support vectors on margin - cannot compute bias.n');
  79.       end
  80.     end
  81.     
  82.   end
  83.  
  84.