数学建模社区-数学中国
标题:
支持向量机分类算法
[打印本页]
作者:
杨利霞
时间:
2022-9-13 12:41
标题:
支持向量机分类算法
支持向量机分类算法
( t8 g" y7 Q5 ^. O' s
1 J& w5 v! T: F! F" N* J
🚀 优质资源分享 🚀
. T$ g" m4 i5 u0 B' u
学习路线指引(点击解锁) 知识定位 人群定位
; O. H% J) C+ a/ q8 ~
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
4 i8 z* ]: B( u, r! F
💛
ython量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
- X: c0 c2 v9 b9 b
支持向量机SVM
8 p& z/ R3 @1 r( d$ C3 O+ K# Y
2 F+ x8 D& Y; A! n* m
支持向量机原理
7 F' M6 u |5 R; x3 U! Q) A
P+ J5 N4 w( {7 x8 M
1.寻求最有分类边界
' D( ^6 O# b+ y. `" K- e
5 x' }* Q2 ?' v
正确:对大部分样本可以正确的划分类别
# n, H1 r$ v3 P, g3 g( l% J0 r
0 W" t- K+ ~+ j$ ~1 g5 M. U4 ~& [
泛化:最大化支持向量间距
9 R$ |$ z5 x4 P2 e
/ v. I2 A) f) B- m |0 l6 V) d/ i. }
公平:与支持向量等距
9 p& O: u8 p t6 t( U( \/ t
3 j' l3 \1 `% g" V" W
简单:线性、直线或平面,分割超平面
4 L9 x2 U4 D! t' i. X
$ j+ t; k( a# w% v5 S U
2.基于核函数的生维变换
( B4 ^& Y k+ F3 f! o& Y6 G
: y- S& D; R! D9 c/ f; y3 P
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。
( Z, Q2 N# w) z/ H @! k+ v8 ^# U4 _+ |
, N% m }" F/ O% B! \/ S2 h6 b
一、引论
9 N* q. v& L. {8 _1 y
' M4 {! [, P! ?: ^. x1 Z' D
使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:
( N0 A/ T$ V* e
' c& z7 g% }( S5 ?* }2 I
/ z; K E. E7 N: E) E( S& C
0 @8 b8 G2 D* j
现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。
$ `/ e! ~5 q* |( x
+ l. R3 b% N; v9 n: q( ?
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:
! E! ~5 J3 b; v/ A
8 z% e2 e/ m4 ~$ Z# Z x! c
二、理论铺垫
( _( f' D3 h: A6 B
8 k. u, R0 U' N6 C$ w, N
线性可分性(linear separability)
- A. V! ~; I) y; w z# ~
9 J, K3 h+ v: n2 l0 G
) w+ O7 A5 f! p8 R9 t
: O/ x/ E1 U2 j8 C6 Y3 Z
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
3 F7 e1 c/ M2 `8 w+ O& s
b2 y" ~( |9 l" F. `6 X6 P% g& p/ h
" n) I. H4 r5 V2 p: l' @% }0 o! }% k
- _. _$ `: p( S" w0 C9 [) J$ B
决策边界
8 m! h& }# |+ D
8 z; v1 |4 K+ T
SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。
* D9 r Q2 o* `8 q8 ^
; X4 M2 N6 p% y+ a
* V$ E% k- ]# o5 ^
% J/ v, W1 L% T4 B: V! w! f* R
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
4 G# r3 H: h% ?0 m2 M) M- Y
( Z5 \$ l8 y$ q
支持向量(support vector)
9 A7 t: m7 O7 k' I
2 T1 l8 x- X6 O0 v+ B
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
W2 }& P& A, e3 x$ N' g; `$ m; g: d
5 a# K# z+ L- p3 b
, A% e5 S+ \- d' h6 ?
! B3 O5 T; b6 L. l& J9 O- c
( j- o* c" v: h: m
4 M& _7 q+ y+ {! R
核方法
) O& T1 c' U8 V B
' U! I( W. B. [- M! {* _6 g
: E4 m% l1 B, Z' z" J( h
0 y; [) A! L2 T- C; }4 b. {
" o; H! c' Y+ k) k1 @) E
3 C* a1 i; y: J$ I& [
以回避内积的显式计算。
7 G! P& Q# y0 v7 }7 V; v# ?. L
# M# p! R& L% c' W2 W
常见的核函数:
8 L: Y( }/ @! O3 f2 v$ t: W9 G
& n% }; r9 B- k
) `1 A; b' k& x" X* m, L
^: i3 x/ J7 L
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
- G2 u+ o8 c& L8 B
1
. C- }+ D% A. w/ i% c
当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
) Q8 @' `. a8 f- T9 q) d: Y
% l% c" a# y5 ~4 u
SMO序列最小优化算法
! q5 X V# |3 D/ q1 g* F! ^
) g7 L- e1 |% m0 o, P2 P0 W
$ b0 [) L8 h$ P9 }) s* x8 l
2 q& A; a( {1 u( w* o" H9 r- \ Y
, a. C% i. A Z' z* Y5 s1 x
$ A; u6 h4 }/ Q
, \0 \8 Y7 {0 f# R
' W2 Q) c! e4 Z r2 L* V. \
三、Python sklearn代码实现:
+ p W$ Z9 }5 A
4 i, G* [# _* @: e0 I" Q. M! [
sklearn.svm.SVC****语法格式为:
1 q/ d4 f" i/ C' u& j, q; @
; J; `/ N) p: D6 M! g) |3 c0 k
class sklearn.svm.SVC( *,
2 C2 n- @1 B$ L' I. b* a3 j8 h
C=1.0,
4 G A+ V3 A- V0 U9 ~
kernel='rbf',
. K( o; v( B1 ~# v+ F# \( @3 q
degree=3,
" N/ u+ y; O/ W7 H5 U; E/ ?8 D
gamma='scale',
5 M. I9 f+ [4 [" V
coef0=0.0,
0 g! {: a; I. T! s
shrinking=True,
# X! D3 z' c8 z: X- a
probability=False,
' k h7 E0 [0 v( v1 c
tol=0.001,
/ v8 G" D( a+ s6 j8 O8 k
cache\_size=200,
+ y* Y9 R. K# b9 @8 |" R5 J
class\_weight=None,
! W" K! R5 Y8 J- o, `8 x, j1 c( \
verbose=False,
t% x* P6 Z0 y9 P1 v; W( `+ l
max\_iter=- 1,
& D+ B' R1 D0 d2 o& v7 l# b) P( \, w9 T
decision\_function\_shape='ovr',
6 ^8 \8 y6 {, A0 A" o( R
break\_ties=False,
3 J, I$ M/ O. G
random\_state=None)
8 T! O7 z- Y, Z
0 p) f( r' j \* \0 L
1
' C) T* w5 g* A6 b1 l
2
, e+ `. {! I; P1 {9 ~
3
8 R' T" Q! b+ O% D6 u
4
2 ?% q$ ]0 m; a0 v' g4 _. N5 z
5
+ Z, w0 _1 I5 [. W( z1 q% N H
6
' g, N c/ |3 T3 k% R) |
7
- M9 q/ i9 B& z3 i1 b
8
j! [) p& ^+ `
9
0 k3 c p s( f! L a4 t
10
5 u* |; a) E; ?6 T3 u$ G/ Q5 v5 A
11
4 ?) y+ r+ w! O* M
12
6 H& x7 `* c# C, o Q& d K! H: d
13
: ]) F+ S+ e/ i2 y4 y2 F
14
4 p! [4 l1 _2 X3 ?
15
5 J, s& [) m" j2 j+ q9 H
16
# ]- S; U3 ], |. m, I
基于鸢尾花数据的实现及解释
1 S4 A& a- \9 e
. [& i; f1 s2 p: f* ^! O6 d' A% k
代码如下:
% e0 S `+ w7 n
: V& }& _8 L! o$ ?( W6 N
1 # 导入模块
$ l+ m5 A1 F, `3 d1 v% W
2 import numpy as np
* G# Z: F; p$ U# P$ B4 I: o
3 import matplotlib.pyplot as plt
% s- b, p" _& ~; D: i: L% n) D
4 from sklearn import svm, datasets
0 T" K/ F" p4 V( F/ C
5 from sklearn.model\_selection import train\_test\_split
: _/ P8 C# S) s) n2 W* g% {
6
) I% ~& u) F3 i) j# N* H* O
7 # 鸢尾花数据
5 p) d$ x. V0 B7 `+ x2 x
8 iris = datasets.load\_iris() #原始数据
( l0 ?1 g+ f5 w+ m' ^8 _& B
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)
3 B% }# J$ S5 Y* z" j2 N; q
10 target = iris.target
" K1 J4 s5 ]+ j+ D# T
11
& H1 |* V# Y* J+ |# M& G% f8 h. S
12 #数组分组训练数据和测试数据
& J. P6 n+ G1 z
13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)
) d* T* ~' @: O2 ?( k* h; D
14
4 z6 N/ ?, h: w6 i. B
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2
8 S! N6 a4 J2 u( v
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
" f! x( ]* V! z1 y$ g6 h3 C1 |, ]3 w
————————————————
' Y# Q* v. N1 j; H% `) E+ }/ F
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; [$ i; Z4 |$ T& i/ H' E
原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791
8 l2 F" _+ _& D m' D
4 g9 e7 u2 v7 z, J* ~
3 o5 r8 U& T" o5 g
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5