|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑 + W4 v+ q6 c" b! |: B
( X3 b4 Y% ^1 X: ox=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];) y0 W' f0 D, C/ K+ E( M' y+ g
%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。2 X- b n0 I( a8 L+ M7 U
9 V2 p" ]; t: B( `data=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点
6 F) T- W; r; O( q6 ~1 Ygroups=[1;1;1;1;-1;-1];%各个数据点的标签; u8 p, l: ?! P; t
figure;( E3 y$ B( |2 l
subplot(2,2,1);7 o# r D' @ S5 D/ Y
Struct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练
+ a, I: G e0 {- oclasses1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形
! @: L" m" |" F' [: xtitle('二次核函数');
' n- w. ^, V V; s3 J1 \, BCorrectRate1=sum(groups==classes1)/6
4 O7 a+ g* [8 d; |, Dsubplot(2,2,2);
. u( h8 W2 h7 f/ ] p6 v! P, O* t' xStruct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);+ Z2 \6 b' X8 |" ~- I: j
classes2=svmclassify(Struct2,data,'showplot',true);9 P0 R4 d! O' x$ g
title('高斯径向基核函数(核宽0.41)');6 K0 W' ~8 [. d5 {* C$ R# A
CorrectRate2=sum(groups==classes2)/6
4 E$ W& i3 O4 W8 c6 ]subplot(2,2,3);
7 u7 e' B/ z6 \+ U! UStruct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
8 v8 s- `- Y# P6 J& T( p2 O6 i! O4 tclasses3=svmclassify(Struct3,data,'showplot',true);
5 a% B( I( V* V q) {) Q9 x/ N; B# h- m# Ytitle('多项式核函数');
* ` Z5 f" \5 B; I0 e& @" WCorrectRate3=sum(groups==classes3)/6# v& \- V8 H6 Y8 n5 s& Q+ w
subplot(2,2,4);
; D' T( ]4 `! z* f" aStruct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);
/ u+ z( |3 Z, F [* Z% xclasses4=svmclassify(Struct4,data,'showplot',true);
# s2 A* p+ l8 q7 E' {title('多层感知机核函数');
' d3 o4 \2 P6 _3 h: W* }CorrectRate4=sum(groups==classes4)/6
1 t/ L% `' c! B" y# t- Z" G( ?. n* }8 v- ]5 k: i i" l
) T% t' f+ R3 o' T {svmtrain代码分析:( k" G$ X; O; C! a: c
if plotflag %画出训练数据的点% U: u1 g% K6 Y" s9 J! x
[hAxis,hLines] = svmplotdata(training,groupIndex);
6 |9 G' M- [! P$ Q+ F3 |legend(hLines,cellstr(groupString));% k2 X/ m5 s/ k$ F- n' g% Z
end" z! v _; z4 s+ e/ T
2 ]) I E5 X. Y. q ^5 A
scaleData = [];+ J* @" o5 E0 u; h4 r* K
if autoScale %训练数据标准化
1 n% Q; N3 w6 [scaleData.shift = - mean(training);
2 }5 X/ \8 D3 L4 OstdVals = std(training);1 q7 x9 n& W, A
scaleData.scaleFactor = 1./stdVals;
" G/ X7 j- o' ]0 k& Y$ Z0 M% leave zero-variance data unscaled:
( H! {2 [7 Z$ Q' b6 V& cscaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;
@6 w7 r. _8 [" n! C* |/ r; J1 M8 S' f* e( S
% shift and scale columns of data matrix:5 T0 p; u) v9 s( ^8 N/ y1 i4 R$ j& Z0 u
for c = 1:size(training, 2)
9 K9 i) m# T+ J: m7 h- l: Mtraining(:,c) = scaleData.scaleFactor(c) * ...
r( E( K# g: t$ G' E(training(:,c) + scaleData.shift(c));5 R" r1 o) d" f
end
8 v" X6 d# F4 Z) }* C Z+ p/ @end& O7 k! U1 V0 ~$ c
% w8 u) a$ d+ t+ O, F8 w: m2 i; N7 @3 Y/ _
if strcmpi(optimMethod, 'SMO')%选择最优化算法
/ \7 M a2 a% E5 e/ F8 O# welse % QP and LS both need the kernel matrix:
$ S1 [! }0 S2 b/ P. c. s%求解出超平面的参数 (w,b): wX+b
+ g1 R: q' ?; |3 Q! F8 w7 x
/ x" Z. {- I6 ~2 @- r; ^, H0 I; y: r8 r7 h
if plotflag %画出超平面在二维空间中的投影+ v: g& }8 e( v' x6 A' w2 v
hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);
7 C; J4 O1 P( L" |' F: p* p svm_struct.FigureHandles = {hAxis,hLines,hSV};; b% f. E: T* Q5 r& D# ~! @
end$ `" P; ?6 _9 l( Y9 }: A3 D5 u$ \
; c2 p9 d1 }/ G" P x A- d
; \) E4 [( @- d w: ?+ v5 W2 \0 v
svmplotsvs.m文件$ b9 e& k3 ~4 h3 F t# B' W& |
' ?" q |% l- B5 f/ I; VhSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来
/ L. }% ~! M) F1 C& x, I% D/ W: X8 A q- M+ y
lims = axis(hAxis);%获取子图的坐标空间
: q: o. Q: _- V4 t6 @2 H5 L; t[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份
6 V/ z) b8 P6 ^% x9 ]" Q ]Xorig = X; Yorig = Y;
7 R7 u0 _% p+ z" P$ Z% ~7 }+ s. v6 G2 b/ ?
% need to scale the mesh 将这些隔点标准化
" I+ H# H9 g9 N0 ?if ~isempty(scaleData)
! z" m, C5 Y. l) q7 e$ i X = scaleData.scaleFactor(1) * (X + scaleData.shift(1)); F% W3 T+ K- K
Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));
% b. }8 b$ n( N# \end* J% G8 H/ |' ~: s4 i& m
9 D+ e5 H9 T" A4 @% f[dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]
7 o! r$ {4 U/ H* m r r$ z& w; [contour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线6 K7 f8 ` i% A0 f# T* D
4 c7 s1 a, D9 I1 j& V7 T
; J6 Y! _1 G; l. Bsvmdecision.m文件, w p( {. l- D! y V
function [out,f] = svmdecision(Xnew,svm_struct)# \5 D/ P5 V$ g
%SVMDECISION evaluates the SVM decision function
' H1 J( X& K; P2 W
/ L: e1 E, k+ S% ]% Copyright 2004-2006 The MathWorks, Inc. i4 C, G$ V% ^2 U1 A: N: \' Q) E
% $Revision: 1.1.12.4 $ $Date: 2006/06/16 20:07:18 $
* C% `, z$ R9 z1 s& U. Y. U* M
2 D8 K/ |% K$ n0 X, y' f6 G$ Q4 v5 tsv = svm_struct.SupportVectors;* ~" S# A& O) j3 O, Q5 h2 h1 C; g
alphaHat = svm_struct.Alpha;
" v( q4 c: R% G1 c& tbias = svm_struct.Bias;4 r. v9 F, m1 y# V: [4 Y; Q
kfun = svm_struct.KernelFunction;
5 {$ C# |% O# X) R0 Wkfunargs = svm_struct.KernelFunctionArgs;( r+ t! a c. G; ^* R+ a" ^
& L; `& l$ I7 l8 \6 l1 `' `f = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离8 B$ Y, R0 b8 i$ ^# y9 W3 \
out = sign(f);%距离转化成标签- D. Q" {7 w8 w5 r1 `$ k
% points on the boundary are assigned to class 1
1 c- u0 G i4 pout(out==0) = 1;
( Y! t* C3 G# w! C, m4 a6 f L) @; `8 n- C+ ^$ q4 J$ }" V) P7 \7 C/ N' Y1 T% ?
- q( m, S! y$ Q0 b+ m8 A( }7 I/ ffunction K = quadratic_kernel(u,v,varargin)%核函数计算
" b9 G1 d. V9 _%QUADRATIC_KERNEL quadratic kernel for SVM functions
# b- c. t6 \( U' p8 ]. u
2 V' X/ f8 E3 f }2 Q, [0 R9 X/ E8 r% Copyright 2004-2008 The MathWorks, Inc.
o; w( m7 S6 e" ~5 d) o) [
: q' \( Q8 m! C% n! W; @/ i- ydotproduct = (u*v');+ O8 j' b. `) r, K9 t1 M+ f, J5 P
K = dotproduct.*(1 + dotproduct);5 x7 [- H1 v% V' M; T' H; f8 V
' o9 v% M0 }9 u+ K/ J: r, l+ p; D5 g+ e8 O8 k" v
维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1); wT*x+b
* l! n! K1 T" J: j7 l4 C+ F$ n- P7 I6 n4 W& }+ i5 e$ u5 z1 T
核函数计算:k(x,y)->上公式改写成 wT*@(x)+b
0 u2 L% F0 {2 Y7 z
3 i9 Y; |4 ^. z! B' @! X9 d假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;8 ]5 w+ ]8 Y* D% W
- d& i6 z( E+ @9 k: G$ @
测试数据为T(n,d);% J8 b# g. Z% [' R2 L. h
* l# \. I+ Q+ a$ A' s
则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m& J) u( e' h, }
' B. q0 [9 z" a- j+ e6 I这n个测试点的距离。) y4 X2 v8 l* [8 ]5 ^
1 ` A0 G& P0 P; X% g! t将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。
# Z/ L! a/ H5 k/ P6 G1 Z7 O1 _7 s8 I# s- }( F+ C& C; m
* n9 N$ y6 w2 Q; k
第二批测试数据:% X5 c% j' j T& w/ {. p
3 u5 J5 f( |1 B: n Gclc;
. O N& V+ q5 s+ k" Eclear;
5 }" n* b- {+ s4 _2 r5 k" v9 Cclose all;( r* e, [& A3 ?! a1 Y. m0 v
%rng(1); % For reproducibility4 T% M' w! y/ R; Y
r = sqrt(rand(100,1)); % Radius 0~1
; l. P" H, f1 Zt = 2*pi*rand(100,1); % Angle 0~2pi8 K, `4 E$ X* Z
data1 = [r.*cos(t), r.*sin(t)]; % Points# i+ D' D. J# y
- N5 R, i9 V( i: M$ F8 O
r2 = sqrt(3*rand(100,1)+1); % Radius 1~46 J0 k+ @ D3 U
t2 = 2*pi*rand(100,1); % Angle 0~2pi
1 G# M$ G: J! m+ C0 Cdata2 = [r2.*cos(t2), r2.*sin(t2)]; % points3 M2 V6 y! u7 A% c& q1 n! \
! a3 ?" p$ e) c% |9 zfigure;
& X/ X X& h2 Z& lplot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
8 ^+ P1 P0 e1 ghold on
* ^" i9 a5 w* @+ _plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)
$ z. w4 A0 W0 d. v0 c0 Mezpolar(@(x)1);ezpolar(@(x)2);) F/ A5 m' [( b( \1 o
axis equal3 s, y, P, W; I; d- f7 Q G+ C
hold off e/ u0 Q% k1 I8 {5 Z: H. W Z( A
9 Q/ _& x4 t7 [3 [4 ?) ?
%Put the data in one matrix, and make a vector of classifications.
2 N8 p2 j7 W1 Idata3 = [data1;data2];%标签 +1 -1" P g, l4 ^6 q& ~7 c6 ~
theclass = ones(200,1);) M2 s0 }* f5 w8 A
theclass(1:100) = -1;
6 e8 k ]% q! q2 H# `. @, o
+ h4 K* ^0 t7 V, t
! q1 @/ u8 r; l% r^2(r的平方) KMatrix = exp(-gamma*r2);9 O; ]; f e' D9 Y6 V r( D
function KMatrix = getKRBF(X, Y, gamma)%rbf核函数
: I" {+ k4 B% R6 l4 x7 O# p* Ur2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...: r6 E5 Y- R3 j% S2 a
+ repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y'
2 b ^; ~- ?8 q2 Y%K(x,y) m*n; \4 M# F \: k* k4 ^, m- G
%sum(X.^2,2) m*d -> m*1 -> repmat -> m*n3 a2 I7 O7 x2 r. j p' b$ D" Q6 E
% n*d -> n*1 -> n*m -> m*n
' z" K: r) {1 ^; B, a0 H" K& w%m*n
" d0 }" l7 O% I; l+ _( X7 K) c# p8 ?% p) p3 i; M& O+ L: O
% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。
. r7 N/ L3 F) r4 R: i, j% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2) $ K( X& f" D7 }9 `
% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。
$ j. h& |+ y$ `3 r7 B6 J* g
) i X6 W- s p, `2 }7 {4 f8 h! t3 y
由之前对核函数的定义(见统计学习方法定义7.6): : c0 ^$ U* g8 W5 k) f* ~
设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射
2 r1 G/ n7 P: s, c- T. A: A; G I' M8 O% a" }" l! W1 I/ ]1 v
φ(x): χ→Η7 @ L+ o2 g- ?5 G) g% _' t
使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z), . l! f. V' v" |" X! x9 |
则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。
' f) e# a4 W% x# O由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如:
$ p: ~; L+ ^. \& N/ b设输入空间χ:
,
9 b# i2 X$ l! U5 M" l
4 m$ T l- q$ _# p+ j
! u% S9 Z( H! `* s+ R
映射函数φ(x)= < X,X > =
( }1 s4 f) m7 r8 e9 D2 z
核函数Κ(x,z)=
, w# m" t/ }- t. I( c那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下: 8 G, ]! b; O" W
φ(x)=(1,2,3,2,4,6,3,6,9) - B7 ~+ ], Z+ h( ]
φ(z)=(16,20,24,20,25,30,24,30,36) , Y9 p& Y6 }9 y* r5 a2 g* ]) ~
φ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
' _+ W2 S3 A: V' n而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024 % D9 v V' p4 G7 c5 t/ m
两者相比,核函数的计算量显然要比映射函数小太多了。
) m. ^* l# V$ W* [% t4 N0 ?5 g- x) E& W
. |8 ?; p7 E: n% i! ]- T4 J& ?, n6 A( U0 ^6 T
|
|