请选择 进入手机版 | 继续访问电脑版
楼主: fantuanxiaot
6844 56

[源码分享] [转载]数据挖掘SVM的MATLAB实现 [推广有奖]

Ψ▄┳一大卫卍卐席尔瓦

大师

8%

还不是VIP/贵宾

-

威望
7
论坛币
-234475 个
通用积分
124.0224
学术水平
3783 点
热心指数
3819 点
信用等级
3454 点
经验
150207 点
帖子
7546
精华
32
在线时间
1327 小时
注册时间
2013-2-3
最后登录
2022-2-24

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

fantuanxiaot 发表于 2015-2-15 11:24:41 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

数据挖掘中SVM算法的MATLAB的实现


代码如下:




本帖隐藏的内容

  1. function [D, a_star] = SVM(train_features, train_targets, params, region)

  2. % Classify using (a very simple implementation of) the support vector machine algorithm
  3. %
  4. % Inputs:
  5. % features- Train features
  6. % targets - Train targets
  7. % params - [kernel, kernel parameter, solver type, Slack]
  8. %               Kernel can be one of: Gauss, RBF (Same as Gauss), Poly, Sigmoid, or Linear
  9. %               The kernel parameters are:
  10. %                   RBF kernel  - Gaussian width (One parameter)
  11. %                   Poly kernel - Polynomial degree
  12. %                   Sigmoid     - The slope and constant of the sigmoid (in the format [1 2], with no separating commas)
  13. %   Linear   - None needed
  14. %               Solver type can be one of: Perceptron, Quadprog
  15. % region - Decision region vector: [-x x -y y number_of_points]
  16. %
  17. % Outputs
  18. % D - Decision sufrace
  19. % a - SVM coeficients
  20. %
  21. % Note: The number of support vectors found will usually be larger than is actually
  22. % needed because both solvers are approximate.

  23. [Dim, Nf]       = size(train_features);
  24. Dim             = Dim + 1;
  25. train_features(Dim,:) = ones(1,Nf);
  26. z = 2*(train_targets>0) - 1;

  27. %Get kernel parameters
  28. [kernel, ker_param, solver, slack] = process_params(params);

  29. %Transform the input features
  30. y = zeros(Nf);
  31. switch kernel,
  32. case {
  33. 'Gauss','RBF'
  34. },
  35.    for i = 1:Nf,
  36.       y(:,i)    = exp(-sum((train_features-train_features(:,i)*ones(1,Nf)).^2)'/(2*ker_param^2));
  37.    end
  38. case {
  39. 'Poly', 'Linear'
  40. }
  41.    if strcmp(kernel, 'Linear')
  42.       ker_param = 1;
  43.    end
  44.    
  45.    for i = 1:Nf,
  46.       y(:,i) = (train_features'*train_features(:,i) + 1).^ker_param;
  47.    end
  48. case 'Sigmoid'
  49.     if (length(ker_param) ~= 2)
  50.         error('This kernel needs two parameters to operate!')
  51.     end
  52.      
  53.    for i = 1:Nf,
  54.       y(:,i) = tanh(train_features'*train_features(:,i)*ker_param(1)+ker_param(2));
  55.    end
  56. otherwise
  57.    error('Unknown kernel. Can be Gauss, Linear, Poly, or Sigmoid.')
  58. end

  59. %Find the SVM coefficients
  60. switch solver
  61. case 'Quadprog'
  62.    %Quadratic programming
  63.    if ~isfinite(slack)
  64.        alpha_star = quadprog((z'*z).*(y'*y), -ones(1, Nf), [], [], z, 0, 0)';
  65.    else
  66.        alpha_star = quadprog((z'*z).*(y'*y), -ones(1, Nf), [], [], z, 0, 0, slack)';
  67.    end
  68.    a_star = (alpha_star.*z)*y';
  69.    
  70.    %Find the bias
  71.    in           = find((alpha_star > 0) & (alpha_star < slack));
  72.    if isempty(in),
  73.        bias = 0;
  74.    else
  75.     B            = z(in) - a_star * y(:,in);
  76.        bias         = mean(B(in));
  77.    end
  78.    
  79. case 'Perceptron'
  80.    max_iter = 1e5;
  81.    iter = 0;
  82.    rate        = 0.01;
  83.    xi = ones(1,Nf)/Nf*slack;
  84.    
  85.    if ~isfinite(slack),
  86.        slack = 0;
  87.    end
  88.    
  89.    %Find a start point
  90.    processed_y = [y; ones(1,Nf)] .* (ones(Nf+1,1)*z);
  91.    a_star = mean(processed_y')';
  92.    
  93.    while ((sum(sign(a_star'*processed_y+xi)~=1)>0) & (iter < max_iter))
  94.       iter = iter + 1;
  95.       if (iter/5000 == floor(iter/5000)),
  96.          disp(['Working on iteration number ' num2str(iter)])
  97.       end
  98.       
  99.       %Find the worse classified sample (That farthest from the border)
  100.       dist = a_star'*processed_y+xi;
  101.       [m, indice] = min(dist);
  102.       a_star = a_star + rate*processed_y(:,indice);
  103.       
  104.       %Calculate the new slack vector
  105.       xi(indice)  = xi(indice) + rate;
  106.       xi = xi / sum(xi) * slack;
  107.    end
  108.    
  109.    if (iter == max_iter),
  110.       disp(['Maximum iteration (' num2str(max_iter) ') reached']);
  111.    else
  112.       disp(['Converged after ' num2str(iter) ' iterations.'])
  113. end
  114.    
  115.    bias   = 0;
  116.    a_star = a_star(1:Nf)';
  117.    
  118. case 'Lagrangian'
  119.     %Lagrangian SVM (See Mangasarian & Musicant, Lagrangian Support Vector Machines)
  120.     tol         = 1e-5;
  121.     max_iter    = 1e5;
  122.     nu          = 1/Nf;
  123.     iter        = 0;

  124.     D           = diag(z);
  125.     alpha       = 1.9/nu;
  126.      
  127.     e           = ones(Nf,1);
  128.     I           = speye(Nf);
  129.     Q           = I/nu + D*y'*D;
  130.     P           = inv(Q);
  131.     u           = P*e;
  132.     oldu        = u + 1;
  133.      
  134.     while ((iter<max_iter) & (sum(sum((oldu-u).^2)) > tol)),
  135.         iter    = iter + 1;
  136.         if (iter/5000 == floor(iter/5000)),
  137.            disp(['Working on iteration number ' num2str(iter)])
  138.         end
  139.         oldu    = u;
  140.         f       = Q*u-1-alpha*u;
  141.         u       = P*(1+(abs(f)+f)/2);
  142.     end
  143.    
  144.     a_star    = y*D*u(1:Nf);
  145.     bias      = -e'*D*u;
  146.      
  147. otherwise
  148.    error('Unknown solver. Can be either Quadprog or Perceptron')
  149. end

  150. %Find support verctors
  151. sv = find(abs(a_star) > 1e-10);
  152. Nsv = length(sv);
  153. if isempty(sv),
  154.    error('No support vectors found');
  155. else
  156.    disp(['Found ' num2str(Nsv) ' support vectors'])
  157. end

  158. %Margin
  159. b = 1/sqrt(sum(a_star.^2));
  160. disp(['The margin is ' num2str(b)])

  161. %Now build the decision region
  162. N           = region(5);
  163. xx          = linspace (region(1),region(2),N);
  164. yy          = linspace (region(3),region(4),N);
  165. D = zeros(N);

  166. for j = 1:N,
  167.    y = zeros(N,1);
  168.    for i = 1:Nsv,
  169.       data = [xx(j)*ones(1,N); yy; ones(1,N)];
  170.       
  171.       switch kernel,
  172. case {
  173. 'Gauss','RBF'
  174. },
  175.          y     = y + a_star(i) * exp(-sum((data-train_features(:,sv(i))*ones(1,N)).^2)'/(2*ker_param^2));
  176. case {
  177. 'Poly', 'Linear'
  178. }
  179.          y     = y + a_star(i) * (data'*train_features(:,sv(i))+1).^ker_param;
  180. case 'Sigmoid'
  181.          y     = y + a_star(i) * tanh(data'*train_features(:,sv(i))*ker_param(1)+ker_param(2));
  182.       end
  183.    end
  184.    D(:,j) = (y + bias);
  185. end


  186. D = D>0;
复制代码



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:matlab实现 MATLAB matla atlab 数据挖掘

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
oink-oink + 5 + 5 + 5 精彩帖子

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

whfzi 在职认证  发表于 2015-2-15 11:45:22 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

Xx谢谢分享 !

使用道具

Crsky7 发表于 2015-2-15 13:06:55 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

[转载]数据挖掘SVM的MATLAB实现

使用道具

luojscd 发表于 2015-2-15 13:37:45 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

看看讲嘛!!

使用道具

oink-oink 发表于 2015-2-15 13:40:30 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

使用道具

adxl888 发表于 2015-2-15 15:19:05 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

绝对干干货,分量足

使用道具

fjrong 在职认证  发表于 2015-2-15 15:39:22 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

使用道具

小丫0123 发表于 2015-2-15 15:47:15 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

哇哦,谢谢楼主分享。。

使用道具

flyhkboy 发表于 2015-2-16 10:49:30 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

支持一下,老大最近的贡献不少哈!

使用道具

justplay16 发表于 2015-2-16 13:01:06 |显示全部楼层 |坛友微信交流群

回帖奖励 +8

感谢分享~~!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 18:45