|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑
0 s6 n1 [, \ C6 Y
2 M1 @0 G/ k" g6 [6 x+ e: B: vx=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];
" G* N- s8 @) X- O n8 v I%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。
3 C6 E9 O5 j2 W0 Y" s* L
6 @4 Z5 O% ` a! Tdata=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点
9 I& [' Z' K0 Agroups=[1;1;1;1;-1;-1];%各个数据点的标签
8 {- _$ P) [, }* R3 j! |9 ~figure;# m0 q2 Y; A6 ~6 Z0 n3 g
subplot(2,2,1);
! t0 \% f' a. w+ R a! o8 A* WStruct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练) e# l6 W2 P+ \, I& K
classes1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形
& R& ]/ U$ ?+ P- }) ftitle('二次核函数');
2 B: t! R5 O2 P( N, ?CorrectRate1=sum(groups==classes1)/6 1 y1 H: h; s2 X) ~2 y
subplot(2,2,2);' m& n1 F; d1 v1 q; g4 P: O! i: n
Struct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);
/ b+ @: J& ?: W# c {3 b, pclasses2=svmclassify(Struct2,data,'showplot',true);" Z6 V5 {% \* L& k# B
title('高斯径向基核函数(核宽0.41)');! @) v2 f6 G; e2 v6 ~
CorrectRate2=sum(groups==classes2)/6$ i4 v1 U2 X+ z
subplot(2,2,3);5 t% A3 v5 B# d( T7 U4 I
Struct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);' G7 S, o& q2 r' |$ U' E# X+ I
classes3=svmclassify(Struct3,data,'showplot',true);
" O: E9 F9 n! I* O3 [" d% S! ntitle('多项式核函数');7 b3 q) m1 r" f' G* z: \: d
CorrectRate3=sum(groups==classes3)/6
+ B i6 W" |. j4 ~2 g* ]subplot(2,2,4);
/ ]/ I$ w% N6 KStruct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);8 P* e9 b- P% N+ p& E3 h
classes4=svmclassify(Struct4,data,'showplot',true);( x& \! ?! R8 U5 k( u' B
title('多层感知机核函数');6 b! Q$ b( i5 U! O) X% R C* U
CorrectRate4=sum(groups==classes4)/6
" B! n" O& a6 ~# i& D9 J: z& T0 y: ?2 ]* E8 p
M- y. ~, L: k) L2 a
svmtrain代码分析:3 @1 Q; }; S; H
if plotflag %画出训练数据的点: a: B1 c+ `8 v. _ Z0 z4 L
[hAxis,hLines] = svmplotdata(training,groupIndex);' y6 o. y! @" f
legend(hLines,cellstr(groupString));
4 X) h6 B! E- h' N. p3 u( Lend" ?" N8 k+ c5 b. n
, r4 }" P& J+ e F4 tscaleData = [];
, O7 i% G* H3 Z# ?if autoScale %训练数据标准化 K1 C: h J: q; {8 i; _! q. D
scaleData.shift = - mean(training);2 ?: N8 w6 N) L/ B
stdVals = std(training);. a; s7 L4 T y4 c" w6 F# e9 z, o' J
scaleData.scaleFactor = 1./stdVals;' P& k9 u" d' Q
% leave zero-variance data unscaled:+ L- R$ U5 ]6 t: \/ w* C0 O# y! c
scaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;! J: a1 ~. l9 s' x- |
- @" v# X+ M$ z* T2 c
% shift and scale columns of data matrix:
% c3 d) R y& R7 N2 w5 s2 e5 z. z4 S; ufor c = 1:size(training, 2)
+ S; e" p, t1 A G- R1 ytraining(:,c) = scaleData.scaleFactor(c) * ...
4 P6 A! v( }) X5 W1 o7 Q(training(:,c) + scaleData.shift(c));6 d5 x4 y9 O m: z8 e4 D# J( V
end
- V' J; J: x! c: `end
: S" H% Y3 k! k
( h( t9 |# k! m% D, [/ c; }. n" I9 K
if strcmpi(optimMethod, 'SMO')%选择最优化算法
9 V# N+ }2 p( Y# z I" o( ielse % QP and LS both need the kernel matrix:( C3 z# \6 Y: Z0 f/ `
%求解出超平面的参数 (w,b): wX+b
% N1 \: c& {7 f- @6 N
; `, s$ z- ^& J: j1 j4 B( N* c6 R. _
if plotflag %画出超平面在二维空间中的投影; @0 a1 m" Q' |* l4 G6 L
hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);" f" G& k' r5 F4 Q2 {0 c2 q$ y
svm_struct.FigureHandles = {hAxis,hLines,hSV};
# J% O' I1 p8 r6 E" R. w6 X3 cend
; G/ k' a& n9 X/ [
8 ], ^- p5 d4 |! G0 v+ k1 V' q: n5 {2 K# p$ L- b8 m
svmplotsvs.m文件, M, n8 }8 i4 z& e5 w, T
5 s: G0 E0 r' L- v2 r3 \% [# j. T {5 ~hSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来
+ i: J1 t- ~. h, B1 i( D/ x
8 Q3 M; ]" e+ A% s& Flims = axis(hAxis);%获取子图的坐标空间) O9 |0 ^* }3 b- z: M
[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份
" l2 N$ `- x/ lXorig = X; Yorig = Y;$ U1 U2 U( u3 ~: l$ S6 K \
0 z( L' n. a- X% need to scale the mesh 将这些隔点标准化
8 v, F# u$ T) sif ~isempty(scaleData)& A# X- @4 ]/ J' @0 R: O1 `8 b6 q2 }
X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));3 g" F% ~( e, }3 j( N
Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));
* A& w" _8 G3 V" dend
( r* C3 {( V+ m, J, O' Q
* \+ s8 P1 v0 D0 ][dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]- n8 o* {6 b( ^) M
contour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线/ Z1 q6 ~( v+ F8 c
# r V( w/ N j
) u! Y, y0 k' ?- u! Esvmdecision.m文件$ P* S' ^# ~1 b0 I k+ x
function [out,f] = svmdecision(Xnew,svm_struct)
- x! q) e( k! H: D. z%SVMDECISION evaluates the SVM decision function- s8 f/ ]$ [3 y$ m: ] I6 K" J
2 c n% X' _- |$ t$ d
% Copyright 2004-2006 The MathWorks, Inc.# i0 P$ N; I" ]
% $Revision: 1.1.12.4 $ $Date: 2006/06/16 20:07:18 $
* j5 Z. p$ _) t- n }) O
( r- k4 I8 r! q7 ^( Z4 w E! e8 ~sv = svm_struct.SupportVectors;9 U; o; D: Y+ ~: D% q& e* O
alphaHat = svm_struct.Alpha;
7 \4 ~0 j8 B/ l4 r' Q" P& ^, qbias = svm_struct.Bias;
5 d: o" y- |2 `kfun = svm_struct.KernelFunction;
+ ? v' K# |% }4 lkfunargs = svm_struct.KernelFunctionArgs;0 H {- i) Y( i' @3 H4 V q5 x
# T5 u, o. h3 w3 R& Of = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离# e6 \7 B5 x l7 B: c. h# Q7 ~
out = sign(f);%距离转化成标签
) K/ G* B! R7 v3 b! U7 ^% points on the boundary are assigned to class 1/ i3 W0 i1 B/ w6 Z
out(out==0) = 1;
- _% A, {3 a5 q: r' m* u1 T5 y; ]& }& f A. V) p) M
' N5 e' r- ^) |6 Q# p! f
function K = quadratic_kernel(u,v,varargin)%核函数计算* D+ b4 s. m i$ i3 n2 a, s! W ~
%QUADRATIC_KERNEL quadratic kernel for SVM functions/ w7 E; c2 G* S0 v- M5 D% H* O( E
6 S0 ]7 C+ G) w( R
% Copyright 2004-2008 The MathWorks, Inc.4 U% k5 g& [2 u+ _( I h, \
/ s' i; O% _# X7 ydotproduct = (u*v');
: z) |' _, i, N: o4 JK = dotproduct.*(1 + dotproduct);2 o9 j7 R! B4 v) }' k
, @! L% q1 Y: ^; @$ g' g; z5 Y$ o7 s* _, n$ c3 s
维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1); wT*x+b, f% ]3 x; J" B* ?! N. _2 Y
8 X6 b/ S4 A4 X1 i核函数计算:k(x,y)->上公式改写成 wT*@(x)+b p0 T& d" r. U# y
4 L. h5 e( E$ u# z4 P4 u2 @假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;
9 } O# y# F. p7 U2 z
$ Z/ P+ G8 p) `: e2 T: Q- |* ]测试数据为T(n,d);. h+ ~1 L! \1 _- G/ t! e
6 L- H; {: Q5 v/ i/ T" t
则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m- F% t5 n8 F+ J/ v" h. ]3 m
! |; G% q# {( f: F" i3 x7 g3 f这n个测试点的距离。
Q' r# |/ F: w7 m2 _: y2 r4 d9 a2 T }' E2 U; R3 m
将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。
5 \9 F( _: X/ f& M v" u& J3 S4 |, x% B2 R$ _5 I9 w9 u
0 h B. z( K, U4 F- E! r
第二批测试数据:
. o5 i8 _( i+ A: l$ ^+ b4 J
+ \; O$ [# H7 ^: Aclc;* G& l( D- w7 D k
clear;
' l; \/ }3 S' T, H0 a ]close all;& W h9 O& z3 @4 k) C3 x
%rng(1); % For reproducibility
3 s1 V: H C: }r = sqrt(rand(100,1)); % Radius 0~1/ ~: e8 d# S7 e! K2 F5 k2 j
t = 2*pi*rand(100,1); % Angle 0~2pi
) A# P1 e2 D! B+ zdata1 = [r.*cos(t), r.*sin(t)]; % Points
# i7 P) D7 V; s I2 J/ D% R3 i9 \! t% O6 s; J. b) |( f
r2 = sqrt(3*rand(100,1)+1); % Radius 1~41 E: F: k. X" i* q1 f' x9 E
t2 = 2*pi*rand(100,1); % Angle 0~2pi
0 o* \6 e4 m, l/ T3 O3 Kdata2 = [r2.*cos(t2), r2.*sin(t2)]; % points
: r% t/ F f I! x" C1 s: h$ B3 D
figure;
& g: m6 q1 j( x4 C" l9 tplot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
) c# ?& ^0 X5 o- l$ ~" [3 x9 w" D& L7 ghold on; F" \" {+ ?5 p1 u( l5 v* b0 K% v
plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)) @% ]6 I% S( i. P! m( Z
ezpolar(@(x)1);ezpolar(@(x)2);
' S: z/ S0 R) Baxis equal
' q7 `5 w0 [* Yhold off2 l1 A# ?' [# \. O
# m' n5 U& ^6 a- s) J7 I8 [3 k%Put the data in one matrix, and make a vector of classifications.
5 E8 ~ s/ t; q* h* \. q1 wdata3 = [data1;data2];%标签 +1 -1/ P; d2 Q: S: F0 P6 C! q, m6 R
theclass = ones(200,1);0 e! G' _4 x% G. ^
theclass(1:100) = -1;( v4 v' A9 _8 ~; L
& Z, p, P" k% C4 c1 U
2 D! o" u6 z+ ^! l" |4 k2 C9 v8 `% r^2(r的平方) KMatrix = exp(-gamma*r2);
# ]3 |, X6 P/ j: N3 Ofunction KMatrix = getKRBF(X, Y, gamma)%rbf核函数
3 E" w0 Q& t* e, y$ m. cr2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...
+ Q7 C! B t! k" W* M: B + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y' - m4 o' Z# L# P- t A
%K(x,y) m*n
* I& S: A( e. B: D/ e; n; Y%sum(X.^2,2) m*d -> m*1 -> repmat -> m*n
2 r t7 j/ C( `' p9 s% n*d -> n*1 -> n*m -> m*n
" H) B- M% r/ d7 R% V1 Y' {5 `%m*n
7 J2 f- a3 }( l" Z0 E8 h
" V; B! R- w. J8 [! I6 F% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。
; b; l! e/ s0 x1 I% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)
4 `0 k1 s" O2 H3 g% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。
/ F+ P7 k2 V C* M$ t; H' h3 Z
6 o/ e2 B& h1 R* S* G6 u
, r, I e4 B( R! x) E: `6 R由之前对核函数的定义(见统计学习方法定义7.6): ; B. Y# \; w& n$ ^! Z4 T1 i# e
设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射 8 m$ b8 V/ Z! M
$ ~0 u; S) v* ~$ ?- E7 W# ^
φ(x): χ→Η h$ b6 E3 H# K1 l1 y0 W) u& O
使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z),
' I7 Z& E3 o, e9 |; R3 k则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。 ) O" e& p7 _. y* M
由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如:
1 a1 P1 Q ]/ ?, z设输入空间χ:
,
/ h% o% U& e! I1 f4 m( O/ m7 B
1 V: }% \0 ^* ^5 n! ^. ?+ }# a0 I D4 ^2 d3 w
映射函数φ(x)= < X,X > =
7 u( h+ J0 \' b* T6 f$ ~3 R. z& e& a
核函数Κ(x,z)=
( F1 \/ `% i- A9 W9 C那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下:
. ?& Q8 n9 }. e3 Dφ(x)=(1,2,3,2,4,6,3,6,9)
7 J0 A$ \# ]0 @2 V2 F% e* |φ(z)=(16,20,24,20,25,30,24,30,36)
7 D! p: t0 Z/ ?. U: W; }: hφ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
L$ U( f# u+ D; X7 z' W而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024 $ d8 w$ b1 m2 ]% f. Y
两者相比,核函数的计算量显然要比映射函数小太多了。5 y# w. M4 \- _: c2 `3 L
& k! k7 a. ]9 {0 E% p8 c) I1 a% c' A, B0 M/ v* `
. D+ Z) ^8 e! O* O' j* W2 N- d |
|