数学建模社区-数学中国
标题:
支持向量机分类算法
[打印本页]
作者:
杨利霞
时间:
2022-9-13 12:41
标题:
支持向量机分类算法
支持向量机分类算法
8 C5 W6 j4 R- e
% ~% b% j0 q! b9 G/ L/ G8 R
🚀 优质资源分享 🚀
3 q$ e' D# k. T2 F$ O. t
学习路线指引(点击解锁) 知识定位 人群定位
. o2 p: W8 q J- }. a
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
9 `$ i A: ]( D5 o" o+ A8 i, L6 [
💛
ython量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
# P. `/ @; u( c) g/ Q! e+ ?5 L) {
支持向量机SVM
3 C. P: S! @. Y- Y+ Z
! |& M* p9 {' Q) F* R) s- @
支持向量机原理
+ f$ J+ A' g8 I- v
' l3 ?, J5 ^( j% ` a; g5 S q% Y
1.寻求最有分类边界
& x4 v: u4 G+ w
; a& j" q5 s, }/ X9 m7 R; m1 Y
正确:对大部分样本可以正确的划分类别
6 k, Q8 {2 k2 W/ `
0 B. ]; J/ A+ N
泛化:最大化支持向量间距
! g, l( t$ x, G% }4 ^7 T; Y/ V
$ L% W( k2 {/ i o
公平:与支持向量等距
6 l4 U2 v1 D5 J/ O" |4 f$ u, l' N) g/ X
; ~1 D( y& ^3 }* A5 C
简单:线性、直线或平面,分割超平面
( O& d0 J4 j& Z% Q6 V5 x9 t
+ L7 u# e' A! V. g+ K+ B9 b2 {5 m
2.基于核函数的生维变换
& K: ^- b U2 R4 U/ c3 v
* M& O( e2 O- r! B$ ?6 R, j( h( S, K9 V
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。
5 R, }) @0 e+ |1 o* q5 `8 }' E8 L8 c
( O. l* S+ g3 Q% b: H
一、引论
, [5 }4 o1 a& P* R8 @- ~( O0 I
' T, M+ O8 k2 l p" p
使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:
# Y' @- h) j* T2 h
. W6 S% t& J0 x2 \* q9 w
& b3 v- b: @; f( t
. l6 z5 W& c2 H' E* M' ^
现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。
$ }2 A" K7 A5 _1 B
7 f, j4 O' s/ n6 }. H0 v& M
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:
: I4 g! u( H$ X6 D
4 a0 v. s- r. p9 ~0 M2 }! y% o
二、理论铺垫
9 m; ^1 O# p/ x1 e' p, |
3 S2 m) w5 K* Z6 _
线性可分性(linear separability)
+ x8 S+ a. P# O
6 n4 N, p5 {' ?( |; {& i- ?+ s
$ r% U- V' s9 A0 X" w& c
@# b0 E) ~5 B. }) ^9 {- ?
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
: `: ^2 `$ K: K% @% g
1 @1 }2 S# o; C# [/ K3 Z
$ v+ S# c( O: u9 S
! u. e4 e2 N& g
决策边界
# N1 N; v- z7 W: ~2 O
& [( [& X5 Y$ @, t! G4 p3 r
SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。
8 \1 D# C, S2 j* C1 T
# \& Z; ?$ d, j( \
( k B1 ?9 ?+ L# T
1 E; h* @/ k5 S1 g0 O. j
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
( ~; H2 y: Y$ D! u$ i
) G( b% L. b4 Q7 U# Z! c# m
支持向量(support vector)
0 \: s& G, @/ t# I* C5 f6 J5 K
w( l- j. f: D* h& q" p X6 @
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
) N+ [7 V2 \/ k' K |/ y
! _% S/ Z8 f& Y! j5 S
3 {: U; Y+ o( G+ p
" m* z' {& Y1 P1 | z
2 Z W* ?. a$ U' n1 K2 E
! r \( ^$ j/ D+ E9 Z3 L
核方法
. W" Y1 E0 N: e" s; }
5 Q% r% c" Q" R# a- v. t
; `, T6 m3 Q) N/ Z
$ J; T; Q1 L' D- Q9 Q, r
) C ^, P8 ^6 {( v+ ~
" a+ c& m. |% v
以回避内积的显式计算。
/ Q2 z9 F' F( c* W5 I2 A
- o3 f& ^& m* x* @
常见的核函数:
/ D; b0 U# N# M1 j4 {
6 o" a/ a. d, \4 X' F: a5 M
/ ^+ L& b- j! a$ o, Z' o7 n
* ^0 d# t. t+ u. d1 q
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
, O/ t' o' q0 j% D5 Y/ K5 O9 y
1
6 t ?. _" r" b& l7 f! [* I) i
当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
- g6 v$ I: X& M* l; i5 C% T
5 ~' o7 Q! q$ O" B5 |2 l9 ?
SMO序列最小优化算法
4 N( `2 ]& L0 M
* q5 {% a3 c* ~' a8 F
( n2 Z3 T# V; y/ ]: Y, Q
" `3 ]& q) ^: P
# U; ~7 H0 I, P4 s$ ?
9 z3 g: D8 c% T0 }
$ L( R& L% G, e4 O
# T- d i- n7 I) f
三、Python sklearn代码实现:
2 s5 z6 V' }1 ^' z7 A) \* R5 ~" `
5 t2 w3 G. W, j; W
sklearn.svm.SVC****语法格式为:
. k- a# O0 L% h- F
, d) q# r$ E! n7 c& ?% p
class sklearn.svm.SVC( *,
- w4 E2 Y1 c/ y! ?1 r
C=1.0,
; W3 f7 D& u% u8 @
kernel='rbf',
3 Y2 X& \5 V6 H' ^- _5 y
degree=3,
) D# }0 ?5 Y: q C2 |
gamma='scale',
6 W. h, b) Q, t1 \4 A* s! n# A- r
coef0=0.0,
4 _4 Y5 p, L4 C$ z
shrinking=True,
2 d7 J/ f" U3 _7 i
probability=False,
4 J$ u9 c- J: l# _
tol=0.001,
" [4 e) T1 I9 |. H7 b
cache\_size=200,
: @2 n6 H* ?3 {* Z0 k5 E4 Y
class\_weight=None,
5 o! z" B5 D% R N
verbose=False,
% s; b7 b/ Y6 ~. J" K
max\_iter=- 1,
" L: F; u5 V9 r+ _" O/ r4 x
decision\_function\_shape='ovr',
& y# o. H7 n8 F3 ?' ~
break\_ties=False,
+ A5 ?0 r. ], Q
random\_state=None)
; |7 N- R7 D+ M% y
! Q* q9 Q1 y2 `% T
1
$ u( w K: e. g
2
2 ?+ t4 w1 p* x: P, o# n
3
" ^% x! [8 S5 `
4
6 {3 F5 U& `& b; P s
5
2 i9 _; E. c* E [* o$ y U$ T4 U
6
7 p% K1 d: Y! O0 Z- g& } V) q
7
2 z2 F: ]3 Z. |/ | U" m
8
6 e8 s2 ]6 p7 }5 R8 Q
9
6 k) U$ d; E& X' i0 u
10
" w0 _, t! M" ]/ M9 o! `0 ~
11
4 m' z! N/ B/ B
12
, `) a/ \1 F% S1 p8 Y+ `
13
+ p# Y0 s. z x+ }
14
8 U" O2 ?1 c2 x! }2 j
15
( { z3 k) B* V9 X5 E
16
% b( t% F" b: c* T7 n1 ~
基于鸢尾花数据的实现及解释
8 o. c+ ~( R/ h- {) X
- D8 ^1 \+ L; ]: f2 Z
代码如下:
$ d g# c$ {( q! p
/ |2 ~: P2 Y) S
1 # 导入模块
+ h4 s- e7 i6 G7 R
2 import numpy as np
l6 r& z A2 c
3 import matplotlib.pyplot as plt
# X) P* i6 X& T5 ~' V2 }6 E
4 from sklearn import svm, datasets
! m+ p1 w0 d3 `
5 from sklearn.model\_selection import train\_test\_split
" P$ e* ~; V7 R' q" [. j. E
6
' T$ [ W( s' g! V8 q6 \3 ^
7 # 鸢尾花数据
2 J" ]; f& _6 C
8 iris = datasets.load\_iris() #原始数据
% z; N! ^6 Y' r' |
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)
$ i8 l; z: z7 [( P2 \: j1 [
10 target = iris.target
/ _1 Q5 D1 r. i0 L
11
- O1 {: X: U; z1 Q: z8 Y4 v3 @* m! h6 _, J" t
12 #数组分组训练数据和测试数据
3 q! V( E$ Q3 z0 z: W) V; b" Y# e
13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)
" [+ r, q9 Y( ?
14
3 X; G: r9 f9 j$ `
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2
2 B3 W- I5 @3 S7 ]; }2 B( o8 S
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
) S" S& m7 C3 w4 R
————————————————
* W- t& T6 G+ P
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; k/ {9 d% {! a# Q7 J
原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791
: E' F; Q) L9 B, a
4 h6 s1 `) s/ |9 ]+ c9 r
0 Q+ x% ~* X$ k0 I/ T
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5