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

SVM matlab 代码详解说明

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑 5 c! g; `) `+ `! X0 p

2 Z. ^% I6 I' P5 z6 Rx=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];  q7 `2 h" P# i5 J7 p7 `4 ~4 q
%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。
. y" E) K* |$ x5 L- u, z# O
  e& \# a* V1 K5 e. d' odata=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点
  e+ T. ~# ~! u8 A  n$ T! c( Hgroups=[1;1;1;1;-1;-1];%各个数据点的标签
+ Z8 x# C4 z! g7 R7 Mfigure;
  s& o2 H% g3 V, Z9 o7 W# t' E0 Q' Z4 a0 c. ysubplot(2,2,1);3 r& ^0 z9 e, K; w9 e
Struct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练
8 h5 V% r/ n7 ]) S9 F3 G- Bclasses1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形
& h- P6 j$ o8 _  z. Gtitle('二次核函数');  s& C( k$ R8 w1 ?& k9 H
CorrectRate1=sum(groups==classes1)/6  
0 C9 u$ @2 Y  `7 S, V5 Lsubplot(2,2,2);
9 c5 O8 \* @! Z5 [- @0 bStruct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);
9 p! Z' @8 B$ I/ s! j( `classes2=svmclassify(Struct2,data,'showplot',true);7 h  t+ N1 S7 f& r, z% m3 [
title('高斯径向基核函数(核宽0.41)');' Q# r5 h- O0 s2 S" K
CorrectRate2=sum(groups==classes2)/6& H8 X4 q, ~! J: ?
subplot(2,2,3);1 @9 y3 A! l" T) M; h
Struct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
  B3 l9 A3 H4 Y# R4 j; T+ Iclasses3=svmclassify(Struct3,data,'showplot',true);
2 |. T" x; \6 x' M: T2 Rtitle('多项式核函数');
- c% v0 [# S6 U3 j5 P) cCorrectRate3=sum(groups==classes3)/6
' n9 P$ b4 {2 F& y8 Ksubplot(2,2,4);
- W1 P% f" k& h. T' n7 iStruct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);  @8 m& C, J$ A) O6 p
classes4=svmclassify(Struct4,data,'showplot',true);8 s8 p1 Q# }4 m9 y, D/ Q
title('多层感知机核函数');: B) {' G, j% j! S
CorrectRate4=sum(groups==classes4)/6
6 d2 E% P: }3 I
# r4 L' X* e1 G; W! z* O$ h" u; G7 V$ @; K$ d5 U; H1 O$ R
svmtrain代码分析:3 ^/ F& ^# f& ^' X1 O, ^
if plotflag   %画出训练数据的点: P9 X7 e: I, V/ I" M& O4 W+ r
[hAxis,hLines] = svmplotdata(training,groupIndex);; L) |) l. K+ U8 Q1 }
legend(hLines,cellstr(groupString));0 O+ N+ D/ L# ]& B4 v
end9 o' ~8 p# `5 ~3 s- I* }# @
+ h3 q  f  |7 Q; ~8 p0 R1 T
scaleData = [];0 t1 i: Q+ c$ }# g
if autoScale   %训练数据标准化
6 i" w$ u9 J- E5 s& C2 zscaleData.shift = - mean(training);
, B+ G, k. ?+ Y9 b2 i3 bstdVals = std(training);; A3 }9 S1 `$ [2 N/ E' u4 G
scaleData.scaleFactor = 1./stdVals;- b) R5 j  c' g7 n1 i1 u. r
% leave zero-variance data unscaled:
( O) ]- c* R  Q$ }! z/ j' u; pscaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;' R" Q% J2 C7 u) ~: o7 G# h

: N8 {0 \8 D4 n% shift and scale columns of data matrix:3 B0 O4 y$ ?; p5 q3 w, q! w
for c = 1:size(training, 2)
+ j& t: P# ]( B% x1 i9 ~' H( T) Dtraining(:,c) = scaleData.scaleFactor(c) * ...
: Q3 E  F  C2 w( m; H3 A( @(training(:,c) + scaleData.shift(c));, v5 ?& G1 l% N4 l# [
end
3 n# o, o5 f# j% f- I9 K; Fend
4 {! t" b7 t; A( s
( C) E  O- _0 p& F6 d( x2 q2 H! ]0 K/ H) D* r' h  H( x
if strcmpi(optimMethod, 'SMO')%选择最优化算法$ Z9 Z# x" d6 v  D  c* I' N
else % QP and LS both need the kernel matrix:; v! f! {9 `/ v8 p/ q1 i
%求解出超平面的参数 (w,b):     wX+b# v/ y; ~7 k, x; b* g
. U1 E  S" s& c1 R1 i

% U8 {4 F: z8 {if plotflag  %画出超平面在二维空间中的投影  {: j; o  G5 G
    hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);" H* g" N; J+ \- \: i5 M3 [( c% ^
    svm_struct.FigureHandles = {hAxis,hLines,hSV};5 s9 }9 k5 K. S7 L
end; j' n" x& f. W: C" f+ \2 U

5 \' B: f6 l& b. p
5 D! y% v$ T8 [# K' Hsvmplotsvs.m文件. M- y5 o1 C3 u$ X* b. l

1 ?% }1 l6 |* b1 N- D# BhSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来
# r+ w! r6 r* l3 r! X5 h
5 I1 N3 Z& r6 p$ I% E+ V& `lims = axis(hAxis);%获取子图的坐标空间  \9 g9 U  x; v2 U6 J; o
[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份
) w2 w! ~# g% w, s! I9 u' RXorig = X; Yorig = Y;# M) w" _  m' H
7 U" I+ M6 b# P2 H
% need to scale the mesh    将这些隔点标准化* T" W! r2 W* L# N" U
if ~isempty(scaleData)9 ~7 k  \  V* S$ u6 Z# ?" @5 ]
    X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));
, N" ]3 N2 ^6 m9 B8 `5 D9 s4 p/ Q. n- ^    Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));
% [# X' D' Q/ i0 Wend
7 s5 g' g1 X2 p- k, a
' q. D4 o/ W, ?, \! O, o1 h8 P[dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]
& X& M# l  w; Q% ^0 y, Icontour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线
. t" x3 }1 v, p
& [. y& h6 }) y% q
% Z% e! g8 Q9 osvmdecision.m文件0 H1 [3 P6 k/ U) _2 w8 A9 \
function [out,f] = svmdecision(Xnew,svm_struct)
" U0 a2 D# c" D' l: N0 I%SVMDECISION evaluates the SVM decision function7 W1 f! l; h% f( A/ d. U3 W

# S2 X% G/ c0 z4 E* a+ g6 E) D%   Copyright 2004-2006 The MathWorks, Inc.
) o2 [6 k" _3 B9 Z2 B) l%   $Revision: 1.1.12.4 $  $Date: 2006/06/16 20:07:18 $
' t* z4 q6 [- l, Q/ Q
8 a# A2 c; [8 L" I3 Qsv = svm_struct.SupportVectors;% D) D! H4 K8 j# {5 \4 |7 g; W! m
alphaHat = svm_struct.Alpha;, c+ H6 o) e2 O: ?  X6 {
bias = svm_struct.Bias;
" W) Y1 }& ]2 ?, M) l3 [kfun = svm_struct.KernelFunction;
" X/ y' W8 b3 Q9 F+ A/ G7 okfunargs = svm_struct.KernelFunctionArgs;
; |$ k& u4 a( }7 I! j- H+ A$ W: K: O/ _8 F6 q: U& K. ~4 H1 u
f = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离# S9 G* c: H% E- o+ I9 [
out = sign(f);%距离转化成标签
( z1 m2 O/ n8 U) n% points on the boundary are assigned to class 1
3 |1 L& W* C5 G+ J7 }out(out==0) = 1;; [, o! D+ c$ ~4 ?$ ]
7 t& {) D$ c; t2 I5 {8 O; x
2 N) w# _5 Z. X/ I3 [
function K = quadratic_kernel(u,v,varargin)%核函数计算- {0 S# `1 R! Q0 L8 j. r0 h$ j. t
%QUADRATIC_KERNEL quadratic kernel for SVM functions
+ Q% ~; g5 {6 F- a
- e/ r0 `- J, [# K% Copyright 2004-2008 The MathWorks, Inc.
7 i( |3 {9 ~5 m1 u) C7 O- |0 X) L4 O4 L1 U  ?* X7 N, E) k4 ]" ?
dotproduct = (u*v');' s. M+ W1 p/ `! p% n2 w5 k1 _
K = dotproduct.*(1 + dotproduct);
! ?* d6 z$ P+ C8 K* S% K' r  V. n2 t- _8 F5 K& |( M! I* E

3 {, ~) V  p' S5 w$ k# C维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1);    wT*x+b
! P% W$ H2 v8 T5 s0 e
' L5 I$ h: V1 [9 c& Z( u核函数计算:k(x,y)->上公式改写成  wT*@(x)+b
; T& |" J# p- m+ V4 P8 J9 L( M6 b. W4 j: J8 |8 L) L4 N
假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;9 J8 x9 h3 i6 k4 T3 u+ c

/ w% u# U% L0 Q$ L* j测试数据为T(n,d);
& d( w; f" _' x' H) A8 ?6 p1 w$ b" ^2 O8 ~& Z0 O: o, n% T
则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m
3 a- q) ~3 l- N* O4 o  U: H; T1 S8 E& j" |5 T
这n个测试点的距离。. d6 m+ v7 Z! d" [

; c% i# @' \2 m& H) H将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。* c, q  @6 f) p0 c2 I
( o; l+ ~, G. {; I& g
; U+ V& n" s2 Q" R4 X+ ]2 G
第二批测试数据:/ N, r) b% r$ x3 E

* P" z' ?# y4 J5 x3 k2 Cclc;
: p% \8 S* ~5 [; x) y# G9 O* Y/ B! d5 Bclear;
4 }2 B* e! O1 I0 d6 tclose all;
% e9 q& f$ Y3 z/ j' q, i  U0 Y%rng(1); % For reproducibility
6 R/ a2 [4 c$ b; l1 b+ ar = sqrt(rand(100,1)); % Radius 0~1; N- a  g; q) d/ C) o
t = 2*pi*rand(100,1); % Angle 0~2pi( q" i. r% i" P' v
data1 = [r.*cos(t), r.*sin(t)]; % Points  @- Q" r* U3 B8 c
( a1 i- K: R* @
r2 = sqrt(3*rand(100,1)+1); % Radius 1~4
* O3 f3 M9 a& tt2 = 2*pi*rand(100,1); % Angle 0~2pi. K( `: M3 D, H- \5 U) k3 N
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points
% U- [- d6 b% P4 h( Q/ |  m; T) N1 Z1 [& U& F* _0 j' U2 \  Z
figure;
8 K6 i9 L% L6 J8 k) `5 Rplot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
) X6 U- x5 l- l9 [, q# M# Zhold on
1 [% _- ^+ f* G; k4 aplot(data2(:,1),data2(:,2),'b.','MarkerSize',15)8 i3 w: M* K  L) j( w6 J
ezpolar(@(x)1);ezpolar(@(x)2);
  [- v( N4 f! E% ~7 Faxis equal
( }' b/ i* Z. v: H! p5 O' o3 E7 Rhold off! q  e5 S6 E, A7 a8 `/ w( P! h
8 z' B+ C) f8 T: F
%Put the data in one matrix, and make a vector of classifications.
/ K" h9 ?. G  Z( Y) H& p: b9 B/ T/ v0 Pdata3 = [data1;data2];%标签 +1 -11 A' j% t; Y) U
theclass = ones(200,1);7 J7 C* t$ h6 s; |( B+ X  @
theclass(1:100) = -1;+ x) c8 ?4 R& m# W% u( H: j2 v
& K& P, t/ K+ s6 R

# U6 v# W. P- W- G6 k- K1 O) c% r^2(r的平方) KMatrix = exp(-gamma*r2);
7 [" H, C  _0 S# ?& m' yfunction KMatrix = getKRBF(X, Y, gamma)%rbf核函数
& u3 D1 B% M: v4 h# cr2 =  repmat( sum(X.^2,2), 1, size(Y,1) ) ...
0 I) j1 G0 V/ b* A- c) W    + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y'
* {6 D, [! I: [+ G4 U6 F$ A: L1 q%K(x,y)     m*n
7 L, ?. X: `9 q+ F1 P2 J) [  j9 G, ^. S& \%sum(X.^2,2)   m*d  ->   m*1  ->   repmat ->  m*n
: `& H% W% F( G( p& a5 @  F9 d%              n*d  ->   n*1  ->   n*m    ->  m*n
2 R! ~3 C4 e2 F! Q4 M%m*n
  N4 w: o! p! h. p9 o; J& ?3 i
! m$ u- [6 q* i% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。
+ A$ z- ^! ?' o4 e) o. |5 @% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)        
; V  N: A9 N9 t- @, Y( X0 g0 L, X0 \% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。
+ Z* q, Q6 w' R% {" U. J4 z/ T8 ?1 n
' i8 g9 Q8 T+ k. J' n
9 g; v4 Y( N( B2 A( m# E由之前对核函数的定义(见统计学习方法定义7.6):
3 e9 Q- b1 c( a. B设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射
3 }" Z1 j) A  V# Q4 _6 a
6 C/ L8 w) v* E" l+ z: ?$ Fφ(x): χ→Η9 O; F/ d* ]. s, R$ f5 F
使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z), 5 l  c; a+ c9 ?# M$ f" |! ~
则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。 2 ]/ C4 q$ b. I' l* ?' ^; y
由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如:
4 g* J+ A; W7 T' F* i设输入空间χ: , " D( P0 V0 o1 z
3 O- K# r$ c1 D) z% Q: C

7 Q+ n( q( W6 u5 [映射函数φ(x)= < X,X > = 3 y9 A$ a6 x( b. |( Q4 n
核函数Κ(x,z)=
" ^; W5 ]2 L1 d1 B$ P那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下: 1 U3 V5 v, s) A9 C$ |4 t
φ(x)=(1,2,3,2,4,6,3,6,9)
  ]& B  O8 C1 N8 aφ(z)=(16,20,24,20,25,30,24,30,36) - F& _$ \, y+ c0 \
φ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
+ l9 Z' m* t" L  {) p而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024
  u9 f0 T$ P0 I$ N& u1 q* X两者相比,核函数的计算量显然要比映射函数小太多了。- \& F; B! n2 A) d: `. C; \

3 f' Z; O( h, w2 i( A) o2 H! Q2 j* I9 g! J( s9 \& Y( t/ `9 N

/ c: K$ V2 U: B% h: ?9 s

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 03:17 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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