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

数据结构

开发平台:

Matlab

  1. % 支持向量机Matlab工具箱1.0 - One-Class SVM, 一类支持向量机
  2. % 使用平台 - Matlab6.5
  3. % 版权所有:陆振波,海军工程大学
  4. % 电子邮件:luzhenbo@yahoo.com.cn
  5. % 个人主页:http://luzhenbo.88uu.com.cn
  6. % 参数文献:Chih-Chung Chang, Chih-Jen Lin. "LIBSVM: a Library for Support Vector Machines"
  7. %
  8. % Support Vector Machine Matlab Toolbox 1.0 - One-Class Support Vector Machine
  9. % Platform : Matlab6.5 / Matlab7.0
  10. % Copyright : LU Zhen-bo, Navy Engineering University, WuHan, HuBei, P.R.China, 430033  
  11. % E-mail : luzhenbo@yahoo.com.cn        
  12. % Homepage : http://luzhenbo.88uu.com.cn     
  13. % Reference : Chih-Chung Chang, Chih-Jen Lin. "LIBSVM: a Library for Support Vector Machines"
  14. %
  15. % Solve the quadratic programming problem - "quadprog.m"
  16. clc
  17. clear
  18. close all
  19. % ------------------------------------------------------------%
  20. % 定义核函数及相关参数
  21. nu = 0.2;           % nu -> [0,1] 在支持向量数与错分样本数之间进行折衷
  22.                     % 支持向量机的 nu 参数(取值越小,异常点就越少)
  23. ker = struct('type','linear');
  24. %ker = struct('type','ploy','degree',3,'offset',1);
  25. %ker = struct('type','gauss','width',500);
  26. %ker = struct('type','tanh','gamma',1,'offset',0);
  27. % ker - 核参数(结构体变量)
  28. % the following fields:
  29. %   type   - linear :  k(x,y) = x'*y
  30. %            poly   :  k(x,y) = (x'*y+c)^d
  31. %            gauss  :  k(x,y) = exp(-0.5*(norm(x-y)/s)^2)
  32. %            tanh   :  k(x,y) = tanh(g*x'*y+c)
  33. %   degree - Degree d of polynomial kernel (positive scalar).
  34. %   offset - Offset c of polynomial and tanh kernel (scalar, negative for tanh).
  35. %   width  - Width s of Gauss kernel (positive scalar).
  36. %   gamma  - Slope g of the tanh kernel (positive scalar).
  37. % ------------------------------------------------------------%
  38. % 构造一类训练样本
  39. n = 100
  40. randn('state',1);
  41. x1 = randn(2,floor(n*0.95));
  42. x2 = 5+randn(2,ceil(n*0.05));
  43. X = [x1,x2];            % 训练样本,d×n的矩阵,n为样本个数,d为样本维数
  44. figure;
  45. plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.');
  46. axis([-5 8 -5 8]); 
  47. title('One-Class SVM');
  48. hold on;
  49. % ------------------------------------------------------------%
  50. % 训练支持向量机
  51. tic
  52. svm = svmTrain('svm_one_class',X,[],ker,nu);
  53. t_train = toc
  54. % svm  支持向量机(结构体变量)
  55. % the following fields:
  56. %   type - 支持向量机类型  {'svc_c','svc_nu','svm_one_class','svr_epsilon','svr_nu'}
  57. %   ker - 核参数
  58. %   x - 训练样本,d×n的矩阵,n为样本个数,d为样本维数
  59. %   y - 训练目标,值为[]
  60. %   a - 拉格朗日乘子,1×n的矩阵
  61. % ------------------------------------------------------------%
  62. % 寻找支持向量
  63. a = svm.a;
  64. epsilon = 1e-10;                    % 如果小于此值则认为是0
  65. i_sv = find(abs(a)>epsilon);        % 支持向量下标
  66. plot(X(1,i_sv),X(2,i_sv),'ro');
  67. % ------------------------------------------------------------%
  68. % 测试输出
  69. [x1,x2] = meshgrid(-5:0.05:6,-5:0.05:6);
  70. [rows,cols] = size(x1);
  71. nt = rows*cols;                  % 测试样本数
  72. Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];
  73. tic
  74. Yd = svmSim(svm,Xt);           % 测试输出
  75. t_sim = toc
  76. Yd = reshape(Yd,rows,cols);
  77. contour(x1,x2,Yd,[0 0],'m');       % 分类面
  78. hold off;