Hello Mat

 找回密码
 立即注册
查看: 13449|回复: 2

SVM算法之SMO算法

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-7-1 22:20:22 | 显示全部楼层 |阅读模式
SVM算法之SMO算法:百度网盘视频链接:
视频链接:http://pan.baidu.com/s/1kV5fPg7
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

运行环境:win7+32bit+matlab2014a
x:400x2
y:400x1
  1. % SVM using Sequential Minimal Optimization (SMO)
  2. clear all;clc;
  3. data=csvread('LinearlySeprerableData.csv');
  4. data(:,1:end-1)=zscore(data(:,1:end-1));
  5. x = data(:,1:end-1);
  6. y = data(:,end);
  7. N = length(y);
  8. C = 0.5;       % Concluded after Cross-Validation
  9. tol = 10e-5;
  10. alpha = zeros(N,1);
  11. bias = 0;

  12. %  SMO Algorithm
  13. while (1)
  14.     changed_alphas=0;
  15.     N=size(y,1)
  16.     for i=1:N
  17.         Ei=sum(alpha.*y.*K(x,x(i,:),'l'))-y(i);
  18.         if ((Ei*y(i)<-tol) && alpha(i)<C)||(Ei*y(i) > tol && (alpha(i) > 0))
  19.             for j=[1:i-1,i+1:N]
  20.                 Ej=sum(alpha.*y.*(x*x(j,:)'))-y(j);
  21.                 alpha_iold=alpha(i);
  22.                 alpha_jold=alpha(j);
  23.                
  24.                 if y(i)~=y(j)
  25.                     L=max(0,alpha(j)-alpha(i));
  26.                     H=min(C,C+alpha(j)-alpha(i));
  27.                 else
  28.                     L=max(0,alpha(i)+alpha(j)-C);
  29.                     H=min(C,alpha(i)+alpha(j));
  30.                 end
  31.                
  32.                 if (L==H)
  33.                     continue
  34.                 end
  35.                
  36.                 eta = 2*x(j,:)*x(i,:)'-x(i,:)*x(i,:)'-x(j,:)*x(j,:)';
  37.                
  38.                 if eta>=0
  39.                     continue
  40.                 end
  41.                
  42.                 alpha(j)=alpha(j)-( y(j)*(Ei-Ej) )/eta;
  43.                 if alpha(j) > H
  44.                     alpha(j) = H;
  45.                 end
  46.                 if alpha(j) < L
  47.                     alpha(j) = L;
  48.                 end
  49.                
  50.                 if norm(alpha(j)-alpha_jold,2) < tol
  51.                     continue
  52.                 end
  53.                
  54.                 alpha(i)=alpha(i)+y(i)*y(j)*(alpha_jold-alpha(j));
  55.                 b1 = bias - Ei - y(i)*(alpha(i)-alpha_iold)*x(i,:)*x(i,:)'...
  56.                     -y(j)*(alpha(j)-alpha_jold)*x(i,:)*x(j,:)';
  57.                 b2 = bias - Ej - y(i)*(alpha(i)-alpha_iold)*x(i,:)*x(j,:)'...
  58.                     -y(j)*(alpha(j)-alpha_jold)*x(j,:)*x(j,:)';
  59.                
  60.                
  61.                 if 0<alpha(i)<C
  62.                     bias=b1;
  63.                 elseif 0<alpha(j)<C
  64.                     bias=b2;
  65.                 else
  66.                     bias=(b1+b2)/2;
  67.                 end
  68.                 changed_alphas=changed_alphas+1;
  69.             end
  70.         end
  71.     end
  72.     if changed_alphas==0
  73.         break
  74.     end
  75.     x=x((find(alpha~=0)),:);
  76.     y=y((find(alpha~=0)),:);
  77.     alpha=alpha((find(alpha~=0)),:);
  78. end
  79. % Weights
  80. % W=sum(alpha.*y.*x)
  81. W(1)=sum(alpha.*y.*x(:,1));
  82. W(2)=sum(alpha.*y.*x(:,2));
  83. % Bias
  84. bias =mean( y - x*W')
  85. % Support Vectors
  86. disp('Number of support Vectors : ')
  87. disp(N)
  88. Xsupport=x;
  89. Ysupport=y;
  90. % Accuracy and F-measure
  91. x=data(:,1:end-1);
  92. y=data(:,end);
  93. fx=sign(W*x'+bias)';
  94. [~, Accuracy, F_measure ] = confusionMatrix( y,fx )
  95. % Plotting the Decision Boundry
  96. hold on
  97. scatter(x(y==1,1),x(y==1,2),'b')
  98. scatter(x(y==-1,1),x(y==-1,2),'r')
  99. scatter(Xsupport(Ysupport==1,1),Xsupport(Ysupport==1,2),'.b')
  100. scatter(Xsupport(Ysupport==-1,1),Xsupport(Ysupport==-1,2),'.r')

  101. x1 = -2:0.01:2;
  102. fn=((-bias-W(1)*x1)/W(2));
  103. fn1=((-1-bias-W(1)*x1)/W(2));
  104. fn2=((1-bias-W(1)*x1)/W(2));
  105. plot(x1,fn,'r','Linewidth',2);
  106. plot(x1,fn1,'Linewidth',1);
  107. plot(x1,fn2,'Linewidth',1);
  108. hold off
复制代码
参考链接:

【1】SVR回归(线性,多项式、RBF)预测模型
【2】Python底层SVR代码分享:http://pan.baidu.com/s/1kU773lt
【3】MATLAB底层SVR代码分享:http://pan.baidu.com/s/1pLG3dBd
【4】MATLAB底层SVC、SVR代码分享:http://pan.baidu.com/s/1dFEL6vB
【5】http://blog.csdn.net/yclzh0522/article/details/6900707
【6】http://blog.csdn.net/luoshixian099/article/details/51227754
【7】http://www.cnblogs.com/biyeymyhj ... /07/17/2591592.html
【8】支持向量机序列讲解http://blog.pluskid.org/?page_id=683
【9】python实现,理论与代码相结合的解说http://www.cnblogs.com/vivounicorn/archive/2011/06/01/2067496.html
【10】http://www.cnblogs.com/vivounicorn/archive/2011/01/13/1934296.html


算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2017-7-6 21:58:23 | 显示全部楼层
核函数如下:
  1. function ker=K(Xtrain,x_i,k)

  2. if k=='g'
  3.     for i=1:size(Xtrain,1)
  4.         ker(i,1)=exp(-norm(Xtrain(i,:)-x_i)); %gaussian Kernel
  5.     end
  6. elseif k=='l'
  7.     for i=1:size(Xtrain,1)
  8.         ker(i,1)=Xtrain(i,:)*x_i'; %linear Kernel
  9.     end
  10. elseif k=='p'
  11.     for i=1:size(Xtrain,1)
  12.         ker(i,1)=(Xtrain(i,:)*x_i').^3; %poly3 Kernel
  13.     end
  14. end

  15. end
复制代码

算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

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

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-19 11:31 , Processed in 0.234166 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表