|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 baqiao 于 2020-4-30 13:18 编辑 / a. t! T$ k1 [* W2 ~7 x
: E5 g- u( g3 z; a
x=[0 1 0 1 2 -1];y=[0 0 1 1 2 -1];z=[-1 1 1 -1 1 1];
. w% v+ \+ i8 t4 v1 D G) a%其中,(x,y)代表二维的数据点,z 表示相应点的类型属性。
4 a0 c5 p" _/ C: o6 Q7 v; g. E/ k
data=[1,0;0,1;2,2;-1,-1;0,0;1,1];% (x,y)构成的数据点 Z, G& v0 A3 X$ i
groups=[1;1;1;1;-1;-1];%各个数据点的标签/ H# b; A0 X+ n5 b( ? X
figure;
1 s- L2 S% w3 {- ?, ~1 Usubplot(2,2,1);
1 G7 Q( y% i+ qStruct1 = svmtrain(data,groups,'Kernel_Function','quadratic', 'showplot',true);%data数据,标签,核函数,训练/ A$ Z, ~" }: P. ^" ]
classes1=svmclassify(Struct1,data,'showplot',true);%data数据分类,并显示图形6 E4 ^5 U$ W2 ^7 {2 z
title('二次核函数');
/ {! Q% f: P7 |* qCorrectRate1=sum(groups==classes1)/6 ( d: U1 r# n( O
subplot(2,2,2);
) x$ s8 U1 [: q, k1 O5 }; X9 ?0 i3 UStruct2 = svmtrain(data,groups,'Kernel_Function','rbf', 'RBF_Sigma',0.41,'showplot',true);
6 M5 I% O4 @. f9 p9 L0 Sclasses2=svmclassify(Struct2,data,'showplot',true);' Y3 n g; ^- w, I) _6 c
title('高斯径向基核函数(核宽0.41)');
8 E6 y# t% [; u+ ?6 J6 ACorrectRate2=sum(groups==classes2)/6! P' M2 _" `+ ~5 R0 _7 i
subplot(2,2,3);
/ {& B+ [7 } C+ {' l, ^6 E+ yStruct3 = svmtrain(data,groups,'Kernel_Function','polynomial', 'showplot',true);
' k. n% v0 V& h P9 R n' _* Kclasses3=svmclassify(Struct3,data,'showplot',true);
4 ?, D! ?. [ O3 n1 Otitle('多项式核函数');
+ T- o) ]5 R" `9 aCorrectRate3=sum(groups==classes3)/6
5 k) G; O) O$ x1 ^2 [$ f2 Asubplot(2,2,4);2 |# Y* x3 z4 i, G8 a, r
Struct4 = svmtrain(data,groups,'Kernel_Function','mlp', 'showplot',true);
" M- u) \$ T- Y! Kclasses4=svmclassify(Struct4,data,'showplot',true);7 v6 D' ^: c5 r `' L3 ^
title('多层感知机核函数');
/ q* t& J4 k. @! p( kCorrectRate4=sum(groups==classes4)/69 A* m8 }( d* b6 h$ B
( r6 L J5 U: D0 ^0 s* f. T
. ^1 }2 }/ M2 i4 P9 |svmtrain代码分析:3 c9 _* Q3 }4 q; b- z$ x
if plotflag %画出训练数据的点. a, s' f9 u; I
[hAxis,hLines] = svmplotdata(training,groupIndex);
$ e' ~3 h- v: p3 f5 p6 v7 @9 _legend(hLines,cellstr(groupString));
# ~6 Q* b5 X4 r/ p6 b$ Nend4 D" W" Q1 m! K7 U4 u) M/ O
$ J7 k" q! [! g6 m
scaleData = [];
1 I4 Q4 d. d0 D0 w8 Sif autoScale %训练数据标准化* b0 Q, p9 x& C) a" Q6 R
scaleData.shift = - mean(training);7 W" {: W9 y4 Z
stdVals = std(training);
" I' {' m0 S, PscaleData.scaleFactor = 1./stdVals;) l0 B& z) }# s8 N2 T& L* q
% leave zero-variance data unscaled:' w. c- r7 e/ l; K7 M
scaleData.scaleFactor(~isfinite(scaleData.scaleFactor)) = 1;6 @- c3 |/ t1 N4 w
$ N8 S; G( _+ }4 Q0 U+ o
% shift and scale columns of data matrix:9 Q/ b4 M7 ~; s6 D
for c = 1:size(training, 2)1 q& }; v9 |9 a
training(:,c) = scaleData.scaleFactor(c) * ...' D5 i/ D/ {+ r3 y, c0 d9 u
(training(:,c) + scaleData.shift(c));1 u. c/ g( V" V3 }6 V) d2 W! h
end
0 g) H/ Z% i' qend
: P0 E, Q4 o( `7 P0 D. a) w0 V. N, F u! }3 M
+ c1 ^1 W5 `& t& Iif strcmpi(optimMethod, 'SMO')%选择最优化算法- i# B) }# ]* w; o5 g; _
else % QP and LS both need the kernel matrix:
0 [0 Z/ F& m) R%求解出超平面的参数 (w,b): wX+b
2 r& D3 G/ Q& q# B% r6 n. J6 t( {, ^9 x: d6 I& Q/ c
$ W4 a8 k; v7 B. X5 vif plotflag %画出超平面在二维空间中的投影$ |6 \1 |9 y2 e7 e8 w/ u8 q- K
hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);
/ @4 P t5 D& N5 J/ F svm_struct.FigureHandles = {hAxis,hLines,hSV};
9 J& _0 C% h) h. R7 L0 \7 m, [4 yend
/ l k+ d& M1 T
" o# B# y D y9 i& f2 F r# N9 o; E* j, M
svmplotsvs.m文件
3 o8 ^( y/ a' G. t+ }* z+ x) u9 {1 U+ ]. O
hSV = plot(sv(:,1),sv(:,2),'ko');%从训练数据中选出支持向量,加上圈标记出来
0 A" K, y1 }9 k2 ^: Z6 A2 j) @$ x5 `# e
lims = axis(hAxis);%获取子图的坐标空间( t( Q+ W& `- n5 s+ y- K# g! ]
[X,Y] = meshgrid(linspace(lims(1),lims(2)),linspace(lims(3),lims(4)));%根据x和y的范围,切分成网格,默认100份& r* C2 t& b3 [) d7 z
Xorig = X; Yorig = Y;: j# b6 y T2 y" p Y0 G$ w* C
/ y d7 ]" I* W( Q9 T. U8 d: m( `. ~% need to scale the mesh 将这些隔点标准化
; ^5 V3 E$ u3 K# Y$ P* Uif ~isempty(scaleData)
# U" V4 @0 p/ o0 h) D: P X = scaleData.scaleFactor(1) * (X + scaleData.shift(1));" r4 N: q8 {- A# S- P3 q# A* N, A1 h
Y = scaleData.scaleFactor(2) * (Y + scaleData.shift(2));
" v. d R4 p8 S( O4 U4 W: c- ]" Oend
) `. Z G, j" B# k$ ]
) G w3 f9 a& V/ Y5 F% o }[dummy, Z] = svmdecision([X(: ),Y(: )],svm_struct); %计算这些隔点[标签,离超平面的距离]1 z) Q- z- G. ~# B2 c6 W
contour(Xorig,Yorig,reshape(Z,size(X)),[0 0],'k');%画出等高线图,这个距离投影到二维空间的等高线( @: G; _, k, Y- F" c
- v/ c7 Z. H7 U, ]1 j
1 Y, j' n7 {/ a5 [% k5 Tsvmdecision.m文件
& `9 J/ F) e& z5 |function [out,f] = svmdecision(Xnew,svm_struct)" R0 Z3 p* `1 o
%SVMDECISION evaluates the SVM decision function
1 x: Z- J8 J, N" c
) B: ?) Z% p! }, z: y) j$ W% Copyright 2004-2006 The MathWorks, Inc.
/ a7 j# {" @ j, N! V% $Revision: 1.1.12.4 $ $Date: 2006/06/16 20:07:18 $0 u" K0 T' F6 G5 A6 m1 ]
' D' B' g2 z! q) e5 ^/ A% Vsv = svm_struct.SupportVectors;9 I9 |0 J+ I, A% C, t3 a* k
alphaHat = svm_struct.Alpha;
0 r) j2 A- n; S% fbias = svm_struct.Bias;
1 b& B# H+ ` V' l) Vkfun = svm_struct.KernelFunction;
/ I' Z4 n5 V/ m1 b' [2 okfunargs = svm_struct.KernelFunctionArgs;
$ ]0 \' X/ \, y" Z; B! Q5 o
^/ ?" |0 V' f( Wf = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(: )) + bias;%计算出距离7 N" u- k# I7 W1 S! B4 d
out = sign(f);%距离转化成标签
4 e. \5 H/ a" T+ y% points on the boundary are assigned to class 1
% T9 n k& W& m" p4 sout(out==0) = 1;8 L+ ]4 F) N0 w0 f
- G" L- E+ C: w; x
+ ~$ X" t$ W. r8 D3 n7 G `
function K = quadratic_kernel(u,v,varargin)%核函数计算 x$ o( F. O5 g1 A
%QUADRATIC_KERNEL quadratic kernel for SVM functions6 B# b6 x4 `& C# _) }) I' ? r
6 o2 \) x$ O3 E2 R7 \1 c; P; ~
% Copyright 2004-2008 The MathWorks, Inc.
$ Y3 ^6 B# C4 ]" [, |: f; V+ _4 z$ ^5 t( y* d
dotproduct = (u*v');- B& P4 \" r$ |) c4 l2 x* m
K = dotproduct.*(1 + dotproduct);' D' Z3 i# M, \+ |/ c
/ r9 V8 }' W' t5 r$ t7 \% v- Y# L* n
维度分析:假设输入的训练数据为m个,维度为d,记作X(m,d);显然w为w(m,1); wT*x+b+ E; ~3 N6 w* V2 k/ Q# n' ]
( C* p1 ]! v7 ^9 ?3 U% U5 ?
核函数计算:k(x,y)->上公式改写成 wT*@(x)+b" y+ D1 c2 D' F3 ?# i9 e
! W) Y1 P# ? S& w
假设支持的向量跟训练数据保持一致,没有筛选掉一个,则支撑的数据就是归一化后的X,记作:Xst;
: v9 R: Z/ {& P c2 ~4 B1 L$ I
" I1 s0 q$ C } s- D+ V4 ?+ c测试数据为T(n,d);+ K& O" M( [; s w- T" C
( y% J% \2 r- ~% ^: W; q7 W则核函数计算后为:(m,d)*(n,d)'=m*n;与权重和偏移中以后为: (1,m)*(m*n)=1*n;如果是训练数据作核函数处理,则m*d变成为m*m) L( K. c% N' D( T) {
& z- G" |$ f$ [ s- m# `" z& N
这n个测试点的距离。' \& E+ Y; q8 B7 f' j) X: N
/ k6 ?. @! _8 P) k V: P9 S" O$ l
将这些隔点和其对应的超平面距离,画成等高线,得到现有图形。
+ e" i* |$ U7 Z4 U2 w0 S* @$ T# T: K: \
6 D1 Z+ C! f, m2 s5 w$ ]; R) U第二批测试数据:
t) M, P- I0 I+ E5 ~# f
9 P0 R6 J' A' g/ q& y! V( a- mclc;
& G# {- H7 E, Dclear;
, w! S5 v+ U( O6 m& }7 pclose all;# ~; S! k$ i: x6 B. q9 T4 E
%rng(1); % For reproducibility8 D: f4 A9 ]' M: X. ?2 A7 H/ C
r = sqrt(rand(100,1)); % Radius 0~1
% J0 U- q- \) V" ~" [) w1 @' ^t = 2*pi*rand(100,1); % Angle 0~2pi
7 m0 r( g8 L( Cdata1 = [r.*cos(t), r.*sin(t)]; % Points! E1 J+ S8 K1 u' q8 p
4 _9 e1 W% |/ q3 N- K* R9 y' Nr2 = sqrt(3*rand(100,1)+1); % Radius 1~4
( {/ w( M, D, | L" qt2 = 2*pi*rand(100,1); % Angle 0~2pi% F# C3 e; c9 _2 j9 C( }
data2 = [r2.*cos(t2), r2.*sin(t2)]; % points( {$ t% T1 e! h% q% X
' Z* ?* I) F* Sfigure;% u4 q* h e* p2 k0 F
plot(data1(:,1),data1(:,2),'r.','MarkerSize',15)
6 X2 x" @) v7 ]4 t, Khold on# H* P' }# v$ s9 W; W- g- A
plot(data2(:,1),data2(:,2),'b.','MarkerSize',15)
" ]9 j( A8 i$ Q8 F$ Rezpolar(@(x)1);ezpolar(@(x)2);, X9 {4 G# y- Q! t
axis equal
; t. z; W7 B4 x2 Ohold off, l( a( j( T( `4 q: W' r. x
( i8 |. k) Q; | e+ A6 W%Put the data in one matrix, and make a vector of classifications.
; o7 p, j- E$ X/ Pdata3 = [data1;data2];%标签 +1 -1
( _* s4 r& y$ P. G; ?, }theclass = ones(200,1);
, c( |0 C6 g, `7 f( `7 Q" Ztheclass(1:100) = -1;
. o; X0 ?8 ^2 |7 V( S5 W" k! ^3 Q1 C' w- v) m
: I4 Z, M2 x/ w7 K: l1 Z% r^2(r的平方) KMatrix = exp(-gamma*r2);4 y6 z% X& S3 i/ o2 |, u0 ]( v
function KMatrix = getKRBF(X, Y, gamma)%rbf核函数
+ F6 R# K4 b. |% V8 r0 ur2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...
$ z% }$ |: K+ O I8 Z( w' M + repmat( sum(Y.^2,2), 1, size(X,1) )'- 2*X*Y' 2 i& O8 J) @$ e2 o
%K(x,y) m*n' |: \: C- P% I
%sum(X.^2,2) m*d -> m*1 -> repmat -> m*n
) S1 K$ ~; s. [. C8 t3 ~% n*d -> n*1 -> n*m -> m*n
) |" Z+ C# D! j( b%m*n
/ ^9 ~) v% n# ^6 {9 A$ C1 K# |% V, O% |0 l
% XVec表示X向量。||XVec||表示向量长度。 r表示两点距离。r^2表示r的平方。 2 J7 Q4 s! `" x. `* o1 ~7 P
% k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2)) = exp(-gamma*r^2)
! j! j3 n9 A4 @2 c: N% V/ B% 公式-1 这里, gamma=1/(2*sigma^2)是参数, r=||XVec-YVec|| 实际上,可看作是计算2个点X与Y的相似性。" ?* l) t& ^0 B' J
- G# n E- @6 F- K, I5 M( i& R/ c, E' v; Z8 u9 `
由之前对核函数的定义(见统计学习方法定义7.6):
+ g+ d" g& l* ?设χ是输入空间(欧氏空间或离散集合),Η为特征空间(希尔伯特空间),如果存在一个从χ到Η的映射
! w8 ?3 n5 P+ D: `5 p: U# j+ c, C! C- @5 O2 I; B9 L% l" y
φ(x): χ→Η2 m. V$ l8 E( ^0 b
使得对所有的x,z∈χ,函数Κ(x,z)=φ(x)∙φ(z),
% C7 [! R8 O, D# e+ R则称Κ(x,z)为核函数,φ(x)为映射函数,φ(x)∙φ(z)为x,z映射到特征空间上的内积。
6 y7 }) ?) g+ o" q5 P3 j9 A由于映射函数十分复杂难以计算,在实际中,通常都是使用核函数来求解内积,计算复杂度并没有增加,映射函数仅仅作为一种逻辑映射,表征着输入空间到特征空间的映射关系。例如:
3 t" o" @2 G% Y! ]* z- [设输入空间χ:
,
& g2 W$ U8 Q& _+ ?% }9 h/ U
. s; t1 [3 S/ V+ {
/ y, }" h/ k7 a. r' V# F, d映射函数φ(x)= < X,X > =
6 K, I7 k7 b; }; g
核函数Κ(x,z)=
9 h# z5 s: _1 h6 x" e那么,取两个样例x=(1,2,3),z=(4,5,6)分别通过映射函数和核函数计算内积过程如下: % f; ^2 N( v) Z* v: c) c6 @
φ(x)=(1,2,3,2,4,6,3,6,9) $ h& j/ W. V5 b c p, U
φ(z)=(16,20,24,20,25,30,24,30,36) & I0 e% |% H H& I4 g
φ(x)∙φ(z)=16+40+72+40+100+180+72+180+324=1024
- e9 y0 C+ r1 E5 l* N. q而直接通过Κ(x,z)计算得[(4+10+18)]^2=1024
- \3 Q3 ^1 O2 e+ e0 i# r两者相比,核函数的计算量显然要比映射函数小太多了。
3 F& A4 C2 l( \0 H8 h" J$ l
4 G3 K- G; t, N* e" Q* a( h3 c6 x5 c6 m" H- b3 ^3 B! y
t: a9 [* g, }1 g( J6 C+ p
|
|