数学建模社区-数学中国
标题:
支持向量机分类算法
[打印本页]
作者:
杨利霞
时间:
2022-9-13 12:41
标题:
支持向量机分类算法
支持向量机分类算法
4 F1 X2 h/ q. A5 K" P% J
) p! j9 W, M5 ^) }: o
🚀 优质资源分享 🚀
z! P( R( g1 k5 W( N' }
学习路线指引(点击解锁) 知识定位 人群定位
+ [# O( Z- S9 _2 |: n
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
5 H; i6 |3 g9 A; \3 C1 F& N5 P
💛
ython量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
4 ~2 i: r. Z$ Q9 ~% Z9 N
支持向量机SVM
# G( l7 g- L- E: Y
! V% q4 |# O6 F# E% `
支持向量机原理
3 Q& j& k* z$ r' p5 F% y
! Z# v. p. L* }& i
1.寻求最有分类边界
J* c1 m) o: E3 P* q- D7 ]7 S5 K
! I4 b0 S f* U9 @; U
正确:对大部分样本可以正确的划分类别
7 C9 g% w2 s, S
0 @0 P0 R: J' f8 q( E
泛化:最大化支持向量间距
+ r! Z; d# F* q9 Q9 W
* \0 S8 J* M5 K; Z0 Q; ^: E
公平:与支持向量等距
6 I7 S }$ [( J+ `
% l: }' {( g) ]' e2 j, X- Q
简单:线性、直线或平面,分割超平面
! o1 u2 l( s. W$ |0 M5 I
& m& B0 N0 t5 r+ R6 U
2.基于核函数的生维变换
6 r% |5 x7 d; l6 R
+ M- s( }$ H7 M; m) {
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。
; v* `6 ]8 A8 I# V
8 w& {" G* n. C, w1 D$ F3 `
一、引论
8 a+ m( D: C7 g W# d6 l9 U0 ^
7 C" y% O! J5 I) O
使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:
! h E$ {9 j3 W5 Z9 _( N) H
8 y6 ]1 O+ p/ P+ g" ?: T; G
4 X7 ?) P' R1 E/ h/ _9 [
+ M# J+ o8 [" W
现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。
& P) c, R* F7 K6 @; t/ C
" e9 F) A- u* Q3 \' J
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:
* k0 x7 E! A, N! _
3 o6 J) C/ u+ ^9 P5 T# f
二、理论铺垫
, [ Y7 M! K; a8 t9 Z8 B: o
4 z# T) q! m) j6 O4 _
线性可分性(linear separability)
% c5 [. ~( J: W0 z: |* m8 r6 |
) }4 x+ K1 Q! `6 g
0 X0 z3 i6 K7 I
' ]* R( W! ~* F* e' b% ]
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
& X" E4 A4 J. r! S
( _" i5 X& Z+ @) H2 Q; J5 r
; p% k3 `6 }5 z% F- {4 {" _
- V# y8 g* A7 |* A6 `$ c) b4 n
决策边界
9 \+ i2 [% b% z+ z0 G0 k4 Y# M
6 `, A' R7 J& A4 C5 m) L! O& J3 a
SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。
+ q2 P. ^; g5 ]) u2 B; K
* a& _ d. L* Y% F; y* s
S' F4 j: {2 t- L7 ?/ E7 B4 u3 K9 @! Z
5 V& R3 `: x8 F9 t
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
; a/ k# f8 h4 k! d2 G7 X
' ]% Z0 J0 r3 b3 [ H
支持向量(support vector)
' P0 e* y" z, U ?$ g
6 Q/ J8 E; d! p
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
4 H" P) H! m5 K- A
' Q, c$ i- Q; b- Z5 t
( L# v! n5 e6 O
0 p' @- j& t' h
# ~" s+ z" h( y. ^/ Q; a% [8 l
6 t3 p7 X) Q4 u3 I! p
核方法
6 s/ E# l# i x$ Z1 h& c; C3 v; O
- `3 F D# S# u3 H1 e$ t5 s
2 {, \- E; D2 G/ c
2 M9 r, _$ k4 t# D! ]$ Y# ?
3 o/ C" G; g, ]/ e+ i. t
. T! `# O0 k& I0 F% p E
以回避内积的显式计算。
: j+ Q( j9 g3 z- p' I, Z
" l: K. B: N p
常见的核函数:
9 V# G5 q0 A8 }. W) f D
, o. P$ W: @) C1 a, j3 u% W
, U( C" H' B, R$ [
9 W4 u) U7 O) T8 p3 q0 M6 Z
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
) t, ^. Z4 t" P3 R0 K
1
6 ]: Z% l7 D8 D: q- C
当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
. j2 K8 e3 D0 P' b! c7 q" c) r& T
8 \: q b' e' N2 F7 X7 o4 N
SMO序列最小优化算法
1 v. d) W4 q& w4 w+ Y- v' N
# x6 w! q1 W0 U- ?+ T, a0 Y7 h, r' H* V
5 p* s* x5 c# f/ I7 G2 p9 M
8 @" P A3 w; c- a: [
4 P' i7 N2 E+ X& M8 ^
! \, Y, G" }( p9 }0 Z
2 d' t0 D' d# O' V5 F$ ?: L6 n
: J$ \+ G" x5 Q, @+ n
三、Python sklearn代码实现:
8 T. S! n- J5 p8 @4 p. |$ @
- r+ l' e+ m6 g+ K4 U
sklearn.svm.SVC****语法格式为:
4 l ^) C9 o3 X, l# l$ f
, m+ J" Y, j5 U) z1 J7 @& W. t
class sklearn.svm.SVC( *,
9 Y3 @) w) v) c! ]5 N; u7 |
C=1.0,
2 ]$ S4 N! p) r; y- \# g9 g" F
kernel='rbf',
+ u+ Q( X( _, [. R0 `! E l, h# Z! i
degree=3,
) T: N5 P/ S) Z8 I& q
gamma='scale',
8 K: L4 v4 B0 [0 [5 ~
coef0=0.0,
& A% v+ ]4 s. R( ]: v* j
shrinking=True,
( t0 J2 }. f4 A$ ~, m! @5 q1 J. e
probability=False,
, G" d; I. F- ^. B
tol=0.001,
( c! ?! F: Z! Q' @8 V8 r
cache\_size=200,
7 f- C# S0 g3 o6 r4 `2 C
class\_weight=None,
" E+ c; y* g- }5 x& z
verbose=False,
* d9 n0 U6 h( ^, T5 I8 H
max\_iter=- 1,
5 g. h. y/ e( o7 b
decision\_function\_shape='ovr',
6 ^0 W0 x3 x4 f
break\_ties=False,
6 t7 e0 `! E$ f& K8 m( l! W. B
random\_state=None)
3 c1 d& [2 s% c
4 `7 M+ u$ W+ V- s6 H& {
1
; m5 V+ `0 E e4 V0 W
2
- h9 @; ^+ L' u B1 E
3
, G3 X) w; W$ ^5 N0 B# b& G6 J" H& W% }
4
0 r4 A( a# {+ T! t
5
' f8 g1 ]+ g7 s. I2 [7 R3 {3 M+ u' m U
6
% p/ Z r7 o( _+ X( o K" |
7
# g2 X" ^- X5 U& c% g
8
. j" S, m$ x f# G. p) T. B; H
9
( I& ?8 o/ q5 U. X' I8 Z2 p5 v
10
1 d* }+ Y8 D! {
11
. L8 D6 f+ b0 K7 v' f
12
3 {8 Y; r+ B f' [ P1 G' f6 S
13
/ P2 f) ^$ L; R7 ]
14
; D6 F; \4 x+ L& G
15
/ Q4 n" u9 A; w3 w) G* L6 a8 u
16
4 J4 W _4 m/ x7 m7 n
基于鸢尾花数据的实现及解释
/ G( u+ Z% p; \! G/ z
/ W; N' J0 e" Z* I# _- o
代码如下:
. f! m$ y, j! u) Y7 N. d# C
; _. U' m. x: }$ u$ j4 V6 [3 t% e
1 # 导入模块
- w+ l3 | h* l. H
2 import numpy as np
- a- O/ U$ p" @: c; F& _
3 import matplotlib.pyplot as plt
9 E) `# G) f- V& W- \
4 from sklearn import svm, datasets
1 }) X& v" `8 T
5 from sklearn.model\_selection import train\_test\_split
4 s) c+ z' @. {: c. @
6
& R Y) h5 n$ e: Y: R( Z
7 # 鸢尾花数据
7 u4 A$ n+ B" H( n# }- f7 x
8 iris = datasets.load\_iris() #原始数据
. V- i$ i7 v6 R0 \; O1 q
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)
3 e3 f* P* K$ d
10 target = iris.target
/ @) U) s# t) _# p
11
6 i8 o' X5 k& w9 _1 g% ]- G, X
12 #数组分组训练数据和测试数据
* `( g- _" c+ J( `& t
13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)
0 R% \, C/ j0 c/ ]3 b
14
5 d0 v! q; i! o2 {
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2
k& P3 p! E; c5 c" b
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
7 c% u/ Y& A, Q) a8 `
————————————————
4 Y2 b; v0 ~0 W1 O* r
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 V# ^; o( |% u: i1 r" j8 G2 W6 ~0 k& \
原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791
* C2 {% j: @7 o8 O. v" Z& J7 O9 l
/ j/ E5 l! k9 p* ]% y
9 T, L" W# k7 X6 N
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5