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

数据结构

开发平台:

Matlab

  1. function Yd = svmSim(svm,Xt)
  2. % ------------------------------------------------------------%
  3. cathe = 10e+6;                 % kernel输出的元素个数的上限
  4. nx = size(svm.x,2);            % 训练样本数
  5. nt = size(Xt,2);               % 测试样本数
  6. block = ceil(nx*nt/cathe);     % 分块处理
  7. num = ceil(nt/block);          % 每块测试样本数
  8. for i = 1:block
  9.     if (i==block)
  10.         index = [(i-1)*num+1:nt];
  11.     else
  12.         index = (i-1)*num+[1:num];
  13.     end
  14.     Yd(index) = svmSim_block(svm,Xt(:,index));           % 测试输出
  15. end
  16. % ------------------------------------------------------------%
  17. function Yd = svmSim_block(svm,Xt);
  18. % 输入参数:
  19. % svm  支持向量机(结构体变量)
  20. % the following fields:
  21. %   type - 支持向量机类型  {'svc_c','svc_nu','svm_one_class','svr_epsilon','svr_nu'}
  22. %   ker - 核参数
  23. %       type   - linear :  k(x,y) = x'*y
  24. %                poly   :  k(x,y) = (x'*y+c)^d
  25. %                gauss  :  k(x,y) = exp(-0.5*(norm(x-y)/s)^2)
  26. %                tanh   :  k(x,y) = tanh(g*x'*y+c)
  27. %       degree - Degree d of polynomial kernel (positive scalar).
  28. %       offset - Offset c of polynomial and tanh kernel (scalar, negative for tanh).
  29. %       width  - Width s of Gauss kernel (positive scalar).
  30. %       gamma  - Slope g of the tanh kernel (positive scalar).
  31. %   x - 训练样本
  32. %   y - 训练目标;
  33. %   a - 拉格朗日乘子 %
  34. % Xt  测试样本,d×n的矩阵,n为样本个数,d为样本维数
  35. % 输出参数:
  36. % Yd  测试输出,1×n的矩阵,n为样本个数,值为+1或-1
  37. % ------------------------------------------------------------%
  38. type = svm.type;
  39. ker = svm.ker;
  40. X = svm.x;
  41. Y = svm.y;
  42. a = svm.a;
  43. % ------------------------------------------------------------%
  44. % 测试输出
  45. epsilon = 1e-8;                  % 如果小于此值则认为是0
  46. i_sv = find(abs(a)>epsilon);          % 支持向量下标
  47. switch type
  48.     case 'svc_c',
  49.         
  50.         tmp = (a.*Y)*kernel(ker,X,X(:,i_sv));          % 行向量
  51.         b = Y(i_sv)-tmp;
  52.         b = mean(b);
  53.         tmp =  (a.*Y)*kernel(ker,X,Xt);
  54.         tmp = tmp+b;
  55.         Yd = sign(tmp);
  56.         
  57.     case 'svc_nu', 
  58.         %------------------------------------%
  59.         % 与 'svc_c' 情况相同
  60.         tmp = (a.*Y)*kernel(ker,X,X(:,i_sv));          % 行向量
  61.         b = Y(i_sv)-tmp;
  62.         b = mean(b);
  63.         tmp =  (a.*Y)*kernel(ker,X,Xt);
  64.         Yd = sign(tmp+b);
  65.         
  66.     case 'svm_one_class',
  67.         
  68.         n_sv = length(i_sv);
  69.         tmp1 = zeros(n_sv,1);
  70.         for i = 1:n_sv
  71.             index = i_sv(i);
  72.             tmp1(i) = kernel(ker,X(:,index),X(:,index));
  73.         end
  74.         tmp2 = 2*a*kernel(ker,X,X(:,i_sv));           % 行向量
  75.         tmp3 = sum(sum(a'*a.*kernel(ker,X,X)));    
  76.         R_square = tmp1-tmp2'+tmp3;
  77.         R_square = mean(R_square);                       % 超球半径 R^2 (对所有支持向量求平均的结果)
  78.         nt = size(Xt,2);                  % 测试样本数
  79.         tmp4 = zeros(nt,1);               % 列向量
  80.         for i = 1:nt
  81.             tmp4(i) = kernel(ker,Xt(:,i),Xt(:,i));
  82.         end
  83.     
  84.         tmp5 = 2*a*kernel(ker,X,Xt);                % 行向量
  85.         Yd = sign(tmp4-tmp5'+tmp3-R_square);
  86.     case 'svr_epsilon',
  87.         
  88.         tmp = a*kernel(ker,X,X(:,i_sv));   % 行向量
  89.         b = Y(i_sv)-tmp;                    % 符号不一样,决策函数就不一样,实际上是一回事!
  90.         %b = Y(i_sv)+tmp;
  91.         b = mean(b);
  92.         tmp =  a*kernel(ker,X,Xt);         % 符号不一样,决策函数就不一样,实际上是一回事!
  93.         %tmp =  -a*kernel(ker,X,Xt);
  94.         Yd = (tmp+b);        
  95.         
  96.     case 'svr_nu',
  97.         %------------------------------------%
  98.         % 与'svr_epsilon' 情况相同
  99.         
  100.         tmp = a*kernel(ker,X,X(:,i_sv));   % 行向量
  101.         b = Y(i_sv)-tmp;                    % 符号不一样,决策函数就不一样,实际上是一回事!
  102.         %b = Y(i_sv)+tmp;
  103.         b = mean(b);
  104.         tmp =  a*kernel(ker,X,Xt);         % 符号不一样,决策函数就不一样,实际上是一回事!
  105.         %tmp =  -a*kernel(ker,X,Xt);
  106.         Yd = (tmp+b);        
  107.         
  108.     otherwise,
  109. end