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

SVM matlab 代码详解说明

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑   r7 a. A! y) T! Q' ~1 v
8 U9 G* }2 G- i3 W  y
x=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];, J; X! y4 X; j# h  T# c5 |
%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。
6 @( G- K* y" {$ p5 N; t! {# r& T& X, F: P' H7 s6 t: C
data=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点. Z% p- P4 S' g+ s  A4 k# q- b; ?
groups=[1;1;1;1;-1;-1];%各个数据点的标签  e+ \- N+ k$ W4 l- K' a
figure;- L' a2 L2 Y1 c, e6 Q% K2 W
subplot(2,2,1);
1 _" H; r& c  e& A# Y) GStruct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练; h2 L$ y# |7 S5 g' l
classes1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形8 |1 u4 b0 q  \: j0 m3 e( U6 j, y: V
title('二次核函数');* J" Y) H& m; y! |2 m* W
CorrectRate1=sum(groups==classes1)/6  2 V- q( }) L/ K$ t; V& y
subplot(2,2,2);
$ M' ^6 z/ R1 n* P* z5 e$ o  X6 eStruct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);& ~2 v6 q0 @1 `- c: U/ ]/ P
classes2=svmclassify(Struct2,data,'showplot',true);
: X! n) [3 G4 Stitle('高斯径向基核函数(核宽0.41)');
2 x& [' [" j  u/ [CorrectRate2=sum(groups==classes2)/6
) d' v% k) }2 c& N, I, Zsubplot(2,2,3);4 I' z, @1 f; b: ?/ d
Struct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
; \: h* H7 Q0 I! q2 n. p1 a; k4 oclasses3=svmclassify(Struct3,data,'showplot',true);
# C- _* c2 Y; q. ]2 [1 ]title('多项式核函数');
5 H, _) k# ?) f8 G1 UCorrectRate3=sum(groups==classes3)/6
: Y. h5 i. ]2 ]  [9 _9 csubplot(2,2,4);
, P: ?5 h+ `5 G6 V5 aStruct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);
! [4 G5 W; ~3 g0 ^& v- uclasses4=svmclassify(Struct4,data,'showplot',true);( V8 o$ X! |( r8 Z+ t
title('多层感知机核函数');7 N0 p9 ~* ?/ c* ^
CorrectRate4=sum(groups==classes4)/6
9 x" ~! l, Z0 j% ?
" ?4 Z: f& }7 B' C
- q! l! l! u, l$ M; Nsvmtrain代码分析:
" n* y( V# z# p) y& j) bif plotflag   %画出训练数据的点
0 j4 f* n% h, p: H* B7 N3 B# _[hAxis,hLines] = svmplotdata(training,groupIndex);) O7 P  P0 O1 d' i, u* V$ g6 L
legend(hLines,cellstr(groupString));+ k. [+ Q/ b2 a% |. l6 O# P
end
. S  i8 }5 k" A7 ]0 }3 c2 }/ F, W* G, P  ?1 @8 h; Y
scaleData = [];* n5 n5 E  h9 y2 K1 Y4 g
if autoScale   %训练数据标准化
/ O2 ]+ i! y. S( z$ _% `scaleData.shift = - mean(training);
/ L. b4 d$ d$ i; a2 ^# {stdVals = std(training);! I' Z! n/ B- E' U1 W0 I
scaleData.scaleFactor = 1./stdVals;7 r; [  K, Z7 B1 p6 O
% leave zero-variance data unscaled:5 E( t6 h0 g: x1 ]
scaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;# h% W& |0 c2 H: g+ Y
' n* Q2 C; R9 M+ }- `$ V4 M0 C  r
% shift and scale columns of data matrix:
, h$ O9 u9 Z; O; x5 c) afor c = 1:size(training, 2)
9 I. \4 \" ?; h+ C8 Q; q' ~training(:,c) = scaleData.scaleFactor(c) * ...
2 u' [" i* s+ o6 }9 M/ B4 g(training(:,c) + scaleData.shift(c));
4 @+ K* r2 f6 F6 g8 e, [end
# }: t/ y8 C# t, V4 U9 c" Nend% P4 c4 u. T: m6 w/ u% I* s5 X
: D9 T2 T- P/ L2 I5 k
( l* O6 {( F! s- \1 T
if strcmpi(optimMethod, 'SMO')%选择最优化算法
" ^  d3 w  K  |+ uelse % QP and LS both need the kernel matrix:
9 O% c3 Y2 v- ?: P%求解出超平面的参数 (w,b):     wX+b+ v8 E% h6 w% ?$ U+ ]0 [: m7 I( q
2 l" y; R1 y& ~6 c& k

) [4 U. v( x* vif plotflag  %画出超平面在二维空间中的投影
) P) t, S& R  ^1 T    hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);! s4 c8 e- P- E1 |" v$ s8 n' @. ?
    svm_struct.FigureHandles = {hAxis,hLines,hSV};' B! P( X+ p; ^) O- y6 M
end- J6 t9 D0 M) r3 C
9 j* H4 S( V1 G; S; q2 z; y

/ l: B% w8 E8 gsvmplotsvs.m文件0 v% x6 V/ |! e1 q; }* l

) Z6 h* Q1 E. _$ bhSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来* c! f/ M, d% I5 Z/ Y5 X" o5 e

% A8 n" {" R1 S3 nlims = axis(hAxis);%获取子图的坐标空间, F0 ]5 f9 J; p% o/ k- ]: Z! c
[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份
5 ?; ^4 B/ C! W+ ^' S0 Y7 ~Xorig = X; Yorig = Y;
& d' d+ e; G& z/ l8 y+ S: r' G
8 m: \/ p# A4 U; f2 N+ u; \, K% need to scale the mesh    将这些隔点标准化
1 {% k. n" x, D0 T  [5 P8 s& d4 nif ~isempty(scaleData); \5 t3 H! C- @6 K
    X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));: k  N4 d* ~# _, ]0 U7 f6 k( x
    Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));7 z" Z& a! A1 k" `
end. v9 p0 R* P  U) e

% P6 a+ L6 Y' R/ _8 q5 |, F[dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]; @" u3 A6 B& j) h
contour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线
4 z! o. o  `3 y" |) j
: H; K4 X* @6 z4 b5 _. j2 Z- E+ R% W3 h2 q0 ^8 x
svmdecision.m文件
/ Q; Z& h9 `) \- B  ]function [out,f] = svmdecision(Xnew,svm_struct)
; Y7 s$ T3 u, c7 ?%SVMDECISION evaluates the SVM decision function0 Q# I7 Y  k& f) w

" F3 m3 W1 x& L%   Copyright 2004-2006 The MathWorks, Inc.
- c6 K9 V% X0 d7 t' P: g! f9 O%   $Revision: 1.1.12.4 $  $Date: 2006/06/16 20:07:18 $4 z% y3 z4 c6 d0 k
4 ?( f4 j' }1 E0 O$ K
sv = svm_struct.SupportVectors;
" b1 }4 {' w4 h( N* h+ u+ |# salphaHat = svm_struct.Alpha;, q5 s( B; l4 w8 [
bias = svm_struct.Bias;
% q8 t' @; ?4 t9 c% S& |kfun = svm_struct.KernelFunction;
0 M: s8 Z; j/ M( M* C3 ekfunargs = svm_struct.KernelFunctionArgs;0 v: S+ ?* F. e# l

3 F4 i" Q* T4 v. H$ P1 x- Kf = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离
5 q  g8 S4 y. v: T3 d' t* A3 _out = sign(f);%距离转化成标签
9 n6 k5 t7 ^# [: ?% points on the boundary are assigned to class 12 z0 n: T% v( n- V" S
out(out==0) = 1;" {) Y$ r# `1 X" E( y

6 P6 f3 d' [# K4 b' h" j# G5 \. l: C
function K = quadratic_kernel(u,v,varargin)%核函数计算
, M# I* P! y, U, t%QUADRATIC_KERNEL quadratic kernel for SVM functions/ s/ x8 j6 I$ N( d

) s1 X: i" w: Y) a& v& W' b% Copyright 2004-2008 The MathWorks, Inc.3 H2 n- C6 {0 ~# F# J

1 P% l* a$ I2 K$ e* B0 z( ~5 ]8 vdotproduct = (u*v');
( `" o6 Z5 _- UK = dotproduct.*(1 + dotproduct);) `  X/ ?, J8 w" K3 Z8 d

" g6 N2 q" R# B* @* }$ U& @6 u$ A  H1 z
维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1);    wT*x+b
+ n8 C# H' M) R1 }' x6 }
" h# c2 G8 S2 K9 D核函数计算:k(x,y)->上公式改写成  wT*@(x)+b
+ @1 i0 }, I2 }& h: l# X, C8 r, g; }* U% Z
假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;  Y7 P  d: l! J/ _; J$ N
% `8 h* K5 R7 z' O# K$ t# }
测试数据为T(n,d);
) f8 e3 J% G8 A8 _, a
8 a( t. E* V. m( E  d( M则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m
! _8 T  _9 ?5 K  ^" E$ v. U) ]" u' i9 v2 L1 @, p! m
这n个测试点的距离。0 e: O3 \  O! W6 Z
/ m+ ~2 @8 A5 U+ Q/ m% y6 ~; M9 w( H
将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。
* J6 P/ I5 U7 f/ v* n& t4 B1 K
& y. V& v: d$ ~$ l+ t% N1 K2 n3 Z
第二批测试数据:
- G7 P. `( K! J5 m1 O% q# s* n8 ?- ~9 }+ g: O! Q# d, ?
clc;8 u' b  \3 g. `4 ]( o2 Q1 d
clear;1 v* t3 m/ r% d
close all;
2 A) l6 `' m6 e  t- N  X- i% v%rng(1); % For reproducibility9 v2 C$ M& P5 W$ l5 x( U# Z
r = sqrt(rand(100,1)); % Radius 0~1
+ W6 u$ Y0 |, X* F* |& C. b8 Nt = 2*pi*rand(100,1); % Angle 0~2pi
+ f! V0 b7 B$ i, A+ T- J" L& G" Y0 Zdata1 = [r.*cos(t), r.*sin(t)]; % Points! p) ^) Q) J& i+ H( n4 M

- F  J: v9 z$ rr2 = sqrt(3*rand(100,1)+1); % Radius 1~4
' ~1 X$ D* w1 w- E0 _( [. C7 dt2 = 2*pi*rand(100,1); % Angle 0~2pi
- T1 ~/ T6 c$ m5 K. w9 u, ^3 t9 Xdata2 = [r2.*cos(t2), r2.*sin(t2)]; % points
6 y! I& Q  E% N5 ]' c3 X6 l# p4 _7 `( x% i
figure;
  F1 T; f5 e( q, i" Mplot(data1(:,1),data1(:,2),'r.','MarkerSize',15)- F. ]2 h" q5 R' \5 U8 \
hold on
+ K+ x$ @5 S2 c" B' c9 m5 G6 tplot(data2(:,1),data2(:,2),'b.','MarkerSize',15)
: Y: Y& T! D: a1 mezpolar(@(x)1);ezpolar(@(x)2);
$ O2 u8 i0 X% m  a3 t6 P6 I) n6 Z8 zaxis equal
: }+ O; B3 l0 J$ C: @hold off
1 x3 `2 ?6 T/ I7 H/ }* a$ ?+ V) r( E
%Put the data in one matrix, and make a vector of classifications.. D( l' y% b2 e" H1 Y
data3 = [data1;data2];%标签 +1 -15 `: Z) Q6 c/ D
theclass = ones(200,1);
$ O4 [' T0 D7 gtheclass(1:100) = -1;( R7 A2 I: K  M$ L

) t% ?( \/ {2 n' ~
+ {% ~0 Z" F5 b# E  X7 m% r^2(r的平方) KMatrix = exp(-gamma*r2);. l: M9 v4 J7 ^8 x( `- P
function KMatrix = getKRBF(X, Y, gamma)%rbf核函数
1 c4 R; {/ B0 m+ o9 [* ?+ R* Ar2 =  repmat( sum(X.^2,2), 1, size(Y,1) ) ...! T$ V8 ^8 J# E( C
    + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y' ! t9 H& H# n: }# \: Q) j
%K(x,y)     m*n
0 E7 _* a8 ?3 t" _9 ~- S4 h4 q( t%sum(X.^2,2)   m*d  ->   m*1  ->   repmat ->  m*n# V% L* u4 m8 L. h
%              n*d  ->   n*1  ->   n*m    ->  m*n6 C! [( L' i+ S# ^* b0 t( q
%m*n
, B2 n( ?( f4 h% h6 L; w; E2 ~' q# u6 }
% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。
  p5 }6 C8 v4 n, H6 j% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)        
/ W$ A0 f2 {- j* i% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。6 N8 ^1 M) Z! _, C. l6 S8 }, s

+ b4 H, {/ e2 P. u$ T. h( R
9 x* H& v$ W# @; o+ O由之前对核函数的定义(见统计学习方法定义7.6):
! G9 q0 w& Y! _# q0 ^: h0 m7 M设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射
: Q3 K/ L7 T" G3 U' P. k& x4 T" }* S
φ(x): χ→Η
* F. i2 `2 M/ Y5 C, R+ S使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z),
# R1 d  a0 d9 p8 E: }则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。 : @* i  U- B. G/ h* ?
由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如: % o2 B' X9 @/ N
设输入空间χ: , 8 B6 f/ C9 P! S) X
3 F1 {- X/ X2 A  k- x& y* d5 A  f
1 u! W" _7 k% n
映射函数φ(x)= < X,X > =
. Y1 ~1 k0 E! L/ K核函数Κ(x,z)=
  n% _5 }. u# E+ B  j' y那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下:
( J* _: J  g& vφ(x)=(1,2,3,2,4,6,3,6,9) 8 Z& U8 i" s- k0 A2 `( h8 O
φ(z)=(16,20,24,20,25,30,24,30,36)
7 g% G. H  \" s2 q1 A/ O8 q; cφ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
) f" z+ M$ ]2 G而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024 ; |2 Q0 o; E4 O0 a% X
两者相比,核函数的计算量显然要比映射函数小太多了。' T2 D  H; r% P& p6 B
, x9 a+ k0 \# O$ s" Y' F
9 U2 B* d/ B! [8 [' b

) s3 _# L) C9 u8 z* M/ `) Q+ N6 r

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-23 22:01 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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