svmTrain.m
上传用户:bixinwl
上传日期:2015-03-02
资源大小:227k
文件大小:4k
源码类别:

数据结构

开发平台:

Matlab

  1. function svm = svmTrain(svmType,X,Y,ker,p1,p2)
  2. % SVM Classification:
  3. %   svm = svmTrain('svc_c',x,y,ker,C); 
  4. %   svm = svmTrain('svc_nu',x,y,ker,nu); 
  5. %
  6. % One-Class SVM:
  7. %   svm = svmTrain('svm_one_class',x,[],ker,nu);
  8. %
  9. % SVM Regression:
  10. %   svm = svmTrain('svr_epsilon',x,y,ker,C,e); 
  11. %   svm = svmTrain('svr_nu',x,y,ker,C,nu); 
  12. % 输入参数:
  13. % X  训练样本,d×n的矩阵,n为样本个数,d为样本维数
  14. % Y  训练目标,1×n的矩阵,n为样本个数,值为+1或-1
  15. % ker  核参数(结构体变量)
  16. % the following fields:
  17. %   type   - linear :  k(x,y) = x'*y
  18. %            poly   :  k(x,y) = (x'*y+c)^d
  19. %            gauss  :  k(x,y) = exp(-0.5*(norm(x-y)/s)^2)
  20. %            tanh   :  k(x,y) = tanh(g*x'*y+c)
  21. %   degree - Degree d of polynomial kernel (positive scalar).
  22. %   offset - Offset c of polynomial and tanh kernel (scalar, negative for tanh).
  23. %   width  - Width s of Gauss kernel (positive scalar).
  24. %   gamma  - Slope g of the tanh kernel (positive scalar).
  25. % 输出参数:
  26. % svm  支持向量机(结构体变量)
  27. % the following fields:
  28. %   type - 支持向量机类型  {'svc_c','svc_nu','svm_one_class','svr_epsilon','svr_nu'}
  29. %   ker - 核参数
  30. %   x - 训练样本,d×n的矩阵,n为样本个数,d为样本维数
  31. %   y - 训练目标,1×n的矩阵,n为样本个数,值为+1或-1
  32. %   a - 拉格朗日乘子,1×n的矩阵
  33. % ------------------------------------------------------------%
  34. options = optimset;
  35. options.LargeScale = 'off';
  36. options.Display = 'off';
  37. switch svmType
  38.     case 'svc_c',
  39.         
  40.         C = p1;
  41.         n = length(Y);
  42.         H = (Y'*Y).*kernel(ker,X,X);
  43.         f = -ones(n,1);
  44.         A = [];
  45.         b = [];
  46.         Aeq = Y;
  47.         beq = 0;
  48.         lb = zeros(n,1);
  49.         ub = C*ones(n,1);
  50.         a0 = zeros(n,1);
  51.         
  52.         [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);                    
  53.     
  54.     case 'svc_nu',
  55.         
  56.         nu = p1;
  57.        
  58.         n = length(Y);
  59.         H = (Y'*Y).*kernel(ker,X,X);
  60.         f = zeros(n,1);
  61.         A = -ones(1,n);
  62.         b = -nu;
  63.         Aeq = Y;
  64.         beq = 0;
  65.         lb = zeros(n,1);
  66.         ub = ones(n,1)/n;
  67.         a0 = zeros(n,1);
  68.         
  69.         [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);                    
  70.     case 'svm_one_class',
  71.         
  72.         nu = p1;
  73.     
  74.         n = size(X,2);
  75.         H = kernel(ker,X,X);
  76.         f = zeros(n,1);
  77.         for i = 1:n
  78.             f(i,:) = -kernel(ker,X(:,i),X(:,i));
  79.         end
  80.         A = [];
  81.         b = [];
  82.         Aeq = ones(1,n);
  83.         beq = 1;
  84.         lb = zeros(n,1);
  85.         ub = ones(n,1)/(nu*n);
  86.         a0 = zeros(n,1);
  87.         [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);                    
  88.         
  89.     case 'svr_epsilon',
  90.         
  91.         C = p1;
  92.         e = p2;
  93.         
  94.         n = length(Y);
  95.         Q = kernel(ker,X,X);
  96.         H = [Q,-Q;-Q,Q];
  97.         f = [e*ones(n,1)-Y';e*ones(n,1)+Y'];          % 符号不一样,决策函数就不一样,实际上是一回事!
  98.         %f = [e*ones(n,1)+Y';e*ones(n,1)-Y'];
  99.         A = [];
  100.         b = [];
  101.         Aeq = [ones(1,n),-ones(1,n)];
  102.         beq = 0;
  103.         lb = zeros(2*n,1);               
  104.         ub = C*ones(2*n,1);
  105.         a0 = zeros(2*n,1);
  106.         
  107.         [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);  
  108.         a = a(1:n)-a(n+1:end);
  109.     case 'svr_nu',
  110.         C = p1;
  111.         nu = p2;
  112.         n = length(Y);
  113.         Q = kernel(ker,X,X);
  114.         H = [Q,-Q;-Q,Q];
  115.         f = [-Y';+Y'];          % 符号不一样,决策函数就不一样,实际上是一回事!
  116.         %f = [+Y';-Y'];
  117.         A = [];
  118.         b = [];
  119.         Aeq = [ones(1,n),-ones(1,n);ones(1,2*n)];
  120.         beq = [0;C*n*nu];
  121.         lb = zeros(2*n,1);               
  122.         ub = C*ones(2*n,1);
  123.         a0 = zeros(2*n,1);
  124.         
  125.         [a,fval,eXitflag,output,lambda]  = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);            
  126.         a = a(1:n)-a(n+1:end);
  127.     otherwise,
  128. end
  129. eXitflag
  130. % ------------------------------------------------------------%
  131. % 输出 svm
  132. svm.type = svmType;
  133. svm.ker = ker;
  134. svm.x = X;
  135. svm.y = Y;
  136. svm.a = a';