SVM.txt
上传用户:yexinsheng
上传日期:2009-03-21
资源大小:2k
文件大小:4k
源码类别:

matlab例程

开发平台:

Matlab

  1. function [iter, optCond, time, w, gamma] = lsvm(A,D,nu,tol,maxIter,alpha, ...
  2. perturb,normalize);
  3. % LSVM Langrangian Support Vector Machine algorithm
  4. %   LSVM solves a support vector machine problem using an iterative
  5. %   algorithm inspired by an augmented Lagrangian formulation.
  6. %
  7. %   iters = lsvm(A,D)
  8. %
  9. %   where A is the data matrix, D is a diagonal matrix of 1s and -1s
  10. %   indicating which class the points are in, and 'iters' is the number
  11. %   of iterations the algorithm used.
  12. %
  13. %   All the following additional arguments are optional:
  14. %
  15. %   [iters, optCond, time, w, gamma] = ...
  16. %     lsvm(A,D,nu,tol,maxIter,alpha,perturb,normalize)
  17. %
  18. %   optCond is the value of the optimality condition at termination.
  19. %   time is the amount of time the algorithm took to terminate.
  20. %   w is the vector of coefficients for the separating hyperplane.
  21. %   gamma is the threshold scalar for the separating hyperplane.
  22. %
  23. %   On the right hand side, A and D are required. If the rest are not
  24. %   specified, the following defaults will be used:
  25. %     nu = 1/size(A,1), tol = 1e-5, maxIter = 100, alpha = 1.9/nu,
  26. %       perturb = 0, normalize = 0
  27. %
  28. %   perturb indicates that all the data should be perturbed by a random
  29. %   amount between 0 and the value given. perturb is recommended only
  30. %   for highly degenerate cases such as the exclusive or.
  31. %
  32. %   normalize should be set to 1 if the data should be normalized before 
  33. %   training.
  34. %
  35. %   The value -1 can be used for any of the entries (except A and D) to
  36. %   specify that default values should be used.
  37. %
  38. %   Copyright (C) 2000 Olvi L. Mangasarian and David R. Musicant.
  39. %   Version 1.0 Beta 1
  40. %   This software is free for academic and research use only.
  41. %   For commercial use, contact musicant@cs.wisc.edu.
  42.  % If D is a vector, convert it to a diagonal matrix.
  43.  [k,n] = size(D);
  44.  if k==1 | n==1
  45.    D=diag(D);
  46.  end;
  47.  % Check all components of D and verify that they are +-1
  48.  checkall = diag(D)==1 | diag(D)==-1;
  49.  if any(checkall==0)
  50.    error('Error in D: classes must be all 1 or -1.');
  51.  end;
  52.  m = size(A,1);
  53.  if ~exist('nu') | nu==-1
  54.    nu = 1/m;
  55.  end;
  56.  if ~exist('tol') | tol==-1
  57.    tol = 1e-5;
  58.  end;
  59.  if ~exist('maxIter') | maxIter==-1
  60.    maxIter = 100;
  61.  end;
  62.  if ~exist('alpha') | alpha==-1
  63.    alpha = 1.9/nu;
  64.  end;
  65.  if ~exist('normalize') | normalize==-1
  66.    normalize = 0;
  67.  end;
  68.  if ~exist('perturb') | perturb==-1
  69.    perturb = 0;
  70.  end;
  71.  
  72.  % Do a sanity check on alpha
  73.  if alpha > 2/nu,
  74.    disp(sprintf('Alpha is larger than 2/nu. Algorithm may not converge.'));
  75.  end;
  76.  % Perturb if appropriate
  77.  rand('seed',22);
  78.  if perturb,
  79.    A = A + rand(size(A))*perturb;
  80.  end;
  81.  
  82.  % Normalize if appropriate
  83.  if normalize,
  84.    avg = mean(A);
  85.    dev = std(A);
  86.    if (isempty(find(dev==0)))
  87.      A = (A - avg(ones(m,1),:))./dev(ones(m,1),:);
  88.    else
  89.      warning('Could not normalize matrix: at least one column is constant.');
  90.    end;
  91.  end;
  92.  
  93.  % Create matrix H
  94.  [m,n] = size(A);
  95.  e = ones(m,1);
  96.  H = D*[A -e];
  97.  iter = 0;
  98.  time = cputime;
  99.  
  100.  % "K" is an intermediate matrix used often in SMW calclulations
  101.  K = H*inv((speye(n+1)/nu+H'*H));
  102.  
  103.  % Choose initial value for x
  104.  x = nu*(1-K*(H'*e));
  105.  
  106.  % y is the old value for x, used to check for termination
  107.  y = x + 1;
  108.  
  109.  while iter < maxIter & norm(y-x)>tol
  110.    % Intermediate calculation which is used twice
  111.    z = (1+pl(((x/nu+H*(H'*x))-alpha*x)-1));
  112.    y = x;
  113.    % Calculate new value of x
  114.    x=nu*(z-K*(H'*z));
  115.    iter = iter + 1;
  116.  end;
  117.  
  118.  % Determine outputs
  119.  time = cputime - time;
  120.  optCond = norm(x-y);
  121.  w = A'*D*x;
  122.  gamma = -e'*D*x;
  123.  disp(sprintf('Running time (CPU secs) = %g',time));
  124.  disp(sprintf('Number of iterations = %d',iter));
  125.  disp(sprintf('Training accuracy = %g',sum(D*(A*w-gamma)>0)/m));
  126.  
  127.  return;
  128.  
  129. function pl = pl(x);
  130.  %PLUS function : max{x,0}
  131.  pl = (x+abs(x))/2;
  132.  return;