找回密码
 注册
关于网站域名变更的通知
查看: 449|回复: 1
打印 上一主题 下一主题

SVM matlab 代码详解说明

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-30 10:48 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑 ! {3 _/ t, M7 Z% t

8 }, [/ o' m4 h3 E, z; j3 Sx=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];
. d- \: g$ F* w, }2 i: A$ s%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。. ?9 ~7 H, l( l, @
" m9 L, A6 Q0 h$ r
data=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点6 S' |' A& Q) m$ `7 \" b
groups=[1;1;1;1;-1;-1];%各个数据点的标签$ g4 {+ V. q: j4 I' ^
figure;: l6 ~) G6 g3 b- q& z
subplot(2,2,1);% F* p4 p' `3 r7 {
Struct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练
* ?3 }+ G: P! D/ u- o5 ?classes1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形
) P' Q7 A7 v; J+ l6 B& M- c( ^0 htitle('二次核函数');) ~9 O1 d/ l" ^3 s# ?( h' {
CorrectRate1=sum(groups==classes1)/6  4 z) ^) `: g* P$ F  W$ }8 C
subplot(2,2,2);/ Q- {# ^7 n* Z8 V! m( E  a+ c
Struct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);7 I+ K/ z9 {' a5 Q# c! H+ [; T
classes2=svmclassify(Struct2,data,'showplot',true);) D7 l7 l- ~( r/ \* J
title('高斯径向基核函数(核宽0.41)');
6 V2 T7 ~. z- }9 L$ ~! ^5 MCorrectRate2=sum(groups==classes2)/6
9 q% m; N, L, u& G# Isubplot(2,2,3);. `) e$ O: V$ k
Struct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
* L' a- E7 ~; J3 Lclasses3=svmclassify(Struct3,data,'showplot',true);
+ h% M# ]+ g, r; c8 h7 E& Jtitle('多项式核函数');
% m: U, H! q: L0 {+ E4 B0 |CorrectRate3=sum(groups==classes3)/6
/ @9 M7 n. ~( B) l, h/ W) {% t) }$ Isubplot(2,2,4);. Q+ j1 ^' U' j9 G2 r
Struct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);! S# O& W" L5 S
classes4=svmclassify(Struct4,data,'showplot',true);
) n3 H# V7 G8 r$ X: f( Ptitle('多层感知机核函数');
8 n7 c* W/ P; E7 LCorrectRate4=sum(groups==classes4)/6# h; q' }9 N2 x9 a- _7 R
# J# C; G0 l9 I* B: @( n& z

) E7 b+ T* o5 u  H9 p6 K* M9 o4 u+ r8 E3 _svmtrain代码分析:0 Q% i: V; v9 u- f6 x+ V2 t  Q
if plotflag   %画出训练数据的点
: ^% S9 H0 J, u* ~) V[hAxis,hLines] = svmplotdata(training,groupIndex);
  X8 j& S* {. n/ B/ h( wlegend(hLines,cellstr(groupString));
, t/ N+ D2 P- @7 Eend. _2 A, J$ X+ }2 ^& _
* [3 l) S, P8 @8 {6 P! K- Q6 ]
scaleData = [];
7 [6 a' b! Z1 V% Uif autoScale   %训练数据标准化( p! f3 l+ Y6 n
scaleData.shift = - mean(training);
7 G) D  J- p  a7 `stdVals = std(training);6 X4 H+ L4 j6 c4 c+ {
scaleData.scaleFactor = 1./stdVals;
8 q. z& m% ?3 X7 n# G& K9 Y3 h% leave zero-variance data unscaled:4 k# u" W) F9 f+ l. I
scaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;
9 e8 L: ?2 Y* F; b
7 S# [% O1 ]/ y5 c+ O% shift and scale columns of data matrix:% k8 X4 Z' n+ n2 `, ^* e/ E# M2 e
for c = 1:size(training, 2)- }6 J& E/ O6 u1 J3 O& p1 t* y
training(:,c) = scaleData.scaleFactor(c) * ...! W) J! J$ J/ g* g
(training(:,c) + scaleData.shift(c));
) N* o% b: x) F  }end' [9 X& s, E' g) m- s
end
8 D6 W- x% y( V! n5 v4 @! ~# v1 y" _9 }' F6 D* J

( N, Z% G) v6 T& [% U+ Lif strcmpi(optimMethod, 'SMO')%选择最优化算法( v1 {  M$ H' w: N* |$ h
else % QP and LS both need the kernel matrix:
8 U3 ^, H/ n; P& x3 {4 ]& J9 c%求解出超平面的参数 (w,b):     wX+b
- N1 q$ ^/ K8 ^( n0 l; y! q" g: {+ I' M8 T& k
- f# l. s' N3 o9 U! }0 `
if plotflag  %画出超平面在二维空间中的投影; m- S/ A, P* m( q
    hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);6 c/ ^; {9 Q6 M3 J& Z4 v# f  g2 D
    svm_struct.FigureHandles = {hAxis,hLines,hSV};4 q) m) c' }* L; b
end0 S$ v2 w0 j% j& [, i
2 ^! f# R. O, e  M0 ?  B
6 @6 G- t, W: s) b! v, e4 @5 P# e9 G
svmplotsvs.m文件  g/ b" Z7 ?/ d7 W3 O- }
* h* p$ q/ W3 ~2 O+ X: R
hSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来- H# _0 T4 O6 h  e9 X  N

0 w, M3 j+ n4 \: ]  z  dlims = axis(hAxis);%获取子图的坐标空间
; }, x6 `; Z5 w1 O[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份
0 m3 m  X+ e9 \& a# }0 Q, GXorig = X; Yorig = Y;
5 J, Y$ L" `# P% _# z$ l0 T) Y( t* f' }% E- J' K8 q
% need to scale the mesh    将这些隔点标准化/ j9 f4 y3 I" z4 f4 J! i: I
if ~isempty(scaleData)
- q& e4 ^1 u, L* d6 l    X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));$ U3 ]% J: N7 X3 k* T1 k
    Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));# _1 i% {4 a2 |+ k9 v* {
end! J$ X( B2 S5 T! P

2 m$ ]  |4 c+ f0 a. T) K[dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]
' G! p/ s1 p; Tcontour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线/ _3 K# F0 E. F: i

& E* f$ Z4 y& w
6 D! s% i: l6 X/ L( msvmdecision.m文件
: U$ ~! R% \: A# @1 A; L$ rfunction [out,f] = svmdecision(Xnew,svm_struct)% v; K9 V0 p3 R+ B3 a( I
%SVMDECISION evaluates the SVM decision function
) a: C- ]3 d* R; i; g2 z' _" l- I& T; b. `6 H
%   Copyright 2004-2006 The MathWorks, Inc.
2 v) N* T, |" {5 ^%   $Revision: 1.1.12.4 $  $Date: 2006/06/16 20:07:18 $: A2 f7 m# c! `0 z( }& {" s/ l, E

* `. `  ^; [  O1 p4 ~( lsv = svm_struct.SupportVectors;; `0 R) P! N" U* O, o$ F
alphaHat = svm_struct.Alpha;% O5 a5 `! Y+ D0 Z
bias = svm_struct.Bias;5 h4 |: \1 D9 t: A# U/ j3 L) g' d
kfun = svm_struct.KernelFunction;/ \' h3 ~7 d! g5 o( q/ r# O/ Z1 h0 {
kfunargs = svm_struct.KernelFunctionArgs;  N: z! Z7 P6 T
3 \# D5 _1 f3 x5 v/ \) f6 C
f = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离
# r  J- s5 C8 m' B8 r) H1 gout = sign(f);%距离转化成标签; }$ ~( O7 [9 g  Q% s; |0 T2 R1 I
% points on the boundary are assigned to class 1, c( U4 a4 g1 i3 |. [' Z
out(out==0) = 1;
: T& u+ Z9 s9 d- R) l, [0 i" f' I0 E3 z) n* b- h
4 f5 p6 b$ ]) p% p- s
function K = quadratic_kernel(u,v,varargin)%核函数计算
" _" }# c6 W/ o: b%QUADRATIC_KERNEL quadratic kernel for SVM functions, t% g, T( u. @
0 p  ]7 c$ X9 E8 M( B
% Copyright 2004-2008 The MathWorks, Inc.3 Q; P8 \. G/ o- W7 Y- B
  ]# F8 t6 b3 V. G4 R
dotproduct = (u*v');1 h/ _. m  T9 ~0 m
K = dotproduct.*(1 + dotproduct);  y$ V, I( a# B) p# l
3 X5 G* |# g. u7 K. f, f

. a: V. z- \2 L" F( b/ M维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1);    wT*x+b
. ^0 Q4 o& H& \/ Z
6 @" a- _2 y  T/ k1 X( D. X5 z核函数计算:k(x,y)->上公式改写成  wT*@(x)+b
! L7 V# i. f2 A: [4 u
! K4 I# Z; Y" u7 ?% @; L假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;* a2 _9 }3 }! K/ K

( ~7 |4 s  i; I  ^. v测试数据为T(n,d);* y6 L" a" V% t0 N; k

! }$ |# Y; @/ J6 t/ B则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m
, @0 A) Q; m& r# G% D
- c/ e' j# o# t. V4 R0 U这n个测试点的距离。
1 _9 A% q  ^% N: [' T4 q
5 n; ~! O% X1 [; j8 ?6 O将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。
4 L* Q8 |3 r( a/ h& F7 _" g5 P$ `' J* d4 I  g; z$ y- z$ B# W* Y

* [* |; p  f" ]6 x& c第二批测试数据:3 v* K( x0 \' D8 R

6 X/ y3 O) q% Fclc;
( N. P( _7 W3 T5 }9 wclear;
- B; ~, V; W" Z! A6 tclose all;
) M6 x9 u% p5 M# h  t: H4 j- C%rng(1); % For reproducibility
+ v' D! @3 S2 z/ u, F# Tr = sqrt(rand(100,1)); % Radius 0~1
# D& `  H* _9 Tt = 2*pi*rand(100,1); % Angle 0~2pi
: M4 L! k( Y, @3 |data1 = [r.*cos(t), r.*sin(t)]; % Points
1 X/ \# }. Z2 z4 [) O- F, A9 N5 t$ Z* O" T' h- J" h# X: y) k# j
r2 = sqrt(3*rand(100,1)+1); % Radius 1~4. S9 m. @- U1 a; `/ \+ S9 u6 G) Y
t2 = 2*pi*rand(100,1); % Angle 0~2pi# y8 \5 I" U6 s  e8 D- x3 ^6 R
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points4 ?: j- ]0 x1 V; Q- U
+ |: L+ o& c* g  U  b7 R
figure;- F; b0 G& h2 F8 b7 E. l
plot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
  p! d! j8 {% U' y: Dhold on. A0 x/ e% p/ E. G! ^( O6 \
plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)% X4 b1 b6 f/ J: a: @, J9 h- R& p* r
ezpolar(@(x)1);ezpolar(@(x)2);; C& g( m  Y0 K. c
axis equal
/ L/ Y- X) O. l) _1 }/ @0 L* Dhold off
$ J/ |0 C0 E# X2 q) J) v
7 y9 V- Z3 {3 P) f%Put the data in one matrix, and make a vector of classifications.
( A6 U9 x/ j' z4 L% n6 _3 k! ^5 zdata3 = [data1;data2];%标签 +1 -17 ^8 d; R1 P2 K9 n
theclass = ones(200,1);; }% A% s5 Z5 v( y+ s: x
theclass(1:100) = -1;
( @: d, e- Z4 a2 T2 }$ R' X* I( T' k% M
$ v- {; a2 |1 O8 ]* j& @
% r^2(r的平方) KMatrix = exp(-gamma*r2);, p1 D/ w( w6 Y7 V+ ]; l) }
function KMatrix = getKRBF(X, Y, gamma)%rbf核函数
* a) a) t  J# \8 E! D+ u/ x  M3 P  Rr2 =  repmat( sum(X.^2,2), 1, size(Y,1) ) ...
# q/ w2 m3 m# R! M  V! f  l* v    + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y'
. v( t$ M1 y$ _%K(x,y)     m*n: d, d1 {5 A- w4 T3 n+ o- r/ k* h- h/ ?& [
%sum(X.^2,2)   m*d  ->   m*1  ->   repmat ->  m*n
" ~7 I! w! b, p3 o%              n*d  ->   n*1  ->   n*m    ->  m*n" C) Q; c" k8 s! L+ z+ t9 s1 J
%m*n$ e. I" R, H: _5 D1 }& Z
- f- }* q' q, Q& i, n% W
% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。 9 A! f5 \* D9 c; G$ G- p+ K
% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)        
+ X; T) z/ ~( }5 J, p+ y% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。
4 \! U0 c% K5 _1 \# b/ @
3 k/ R6 ]. Q; T  {! f( z0 Z+ u5 I( q2 a7 y! N- g4 `; N
由之前对核函数的定义(见统计学习方法定义7.6): ; ~! c4 K5 h3 t3 ^9 Y
设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射
, y* i5 K& K+ ?9 x+ s) }$ k' S. s! q; H# ?$ `2 d
φ(x): χ→Η' |1 J4 T* g8 l  [2 D
使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z), 2 k; C: g6 n: a& k' U! E5 X
则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。
$ x' k' T$ z. @  g由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如: 1 B, j" J3 t- l" J
设输入空间χ: , 9 G' e5 @$ K$ I# N( t; P

4 o/ }% Y2 l* Q! Z
; m: @0 K& l. q( W1 `6 e" D映射函数φ(x)= < X,X > = / ~2 }  L* i( J% m& ]) _1 p* ]
核函数Κ(x,z)=
  _: `0 M# S$ W, M+ E" `那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下:
; B3 P0 k  o( d- k0 }8 ~1 d+ zφ(x)=(1,2,3,2,4,6,3,6,9)
; M0 W- o! r% i! ?φ(z)=(16,20,24,20,25,30,24,30,36) - k9 V" B' x# e
φ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
, |2 Y6 l: W) J# ]0 O2 J而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024 9 D% {6 X! l5 }# |8 e/ q
两者相比,核函数的计算量显然要比映射函数小太多了。7 K! J/ }  f$ _6 p; g

7 P) L* d  A* p+ N8 V  l
9 j8 e( e  T+ `. }: J+ ?6 a% D
$ h3 x' ]0 X9 N0 d+ d8 a

该用户从未签到

2#
发表于 2020-4-30 13:59 | 只看该作者
SVM matlab 代码详解说明
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 05:33 , Processed in 0.171875 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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