数学建模社区-数学中国

标题: 支持向量机分类算法 [打印本页]

作者: 杨利霞    时间: 2022-9-13 12:41
标题: 支持向量机分类算法
支持向量机分类算法' Q. u. g' }; t# s

2 P/ v6 ~/ P+ q5 [. z7 @🚀 优质资源分享 🚀
" ?" M" j4 k+ }学习路线指引(点击解锁)        知识定位        人群定位
5 ~& d% B) o9 n+ Y$ y' N/ P🧡 Python实战微信订餐小程序 🧡        进阶级        本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
  R* p9 n/ C$ T4 B7 ~&#128155ython量化交易实战💛        入门级        手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
/ s- z" R6 f- ]4 S支持向量机SVM& W6 t  y! g' @  |

# Q9 X- }) v' ~/ C! J支持向量机原理6 B4 ^! [; T6 ?. p8 S5 ]

! y/ p; U( {  P* N1.寻求最有分类边界, e3 N: f7 R( i4 d  c7 E

  d6 ]$ T& ~1 g. R正确:对大部分样本可以正确的划分类别& s" g! _2 ]$ R3 m
8 D' d1 ?, d8 P2 S3 l4 W
泛化:最大化支持向量间距
$ L- L6 d* F# x; \5 p( L: n$ L6 [) f4 Y8 |
公平:与支持向量等距
" ?, }7 Y( f% X0 L5 {; g4 e4 a  ~+ g0 y$ G& j: `4 A* B
简单:线性、直线或平面,分割超平面1 {" l' Z6 r+ y  @& }
: t& N+ B  n! P7 X4 ]
2.基于核函数的生维变换( E+ V! M  O) x# h) A
) @7 e6 \8 Z" T  v& @( B: F
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。
4 o9 a$ C' ], h5 g" M9 s2 z9 K# X; b* S9 c2 v2 `2 O
一、引论) k- K& y, C2 i3 P7 n

8 G% w& G7 H8 @' s使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:5 R) y+ _- |& @  C; t

  V0 S! j2 f) M9 I
  c. V+ p  }% `9 e$ y; j. ?' g5 \' C- Y5 K, G, F6 l
现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。, [6 ]% b) w* j  H
: d6 I. s2 u7 v
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:5 ~  }$ s- D( z+ m' U' c

# O; f4 K1 N- @- ]; Q. U" H* o二、理论铺垫
! \( Q, |# M+ {7 l6 Q- v; b- ^* w4 H! ^, L$ ^9 m2 w
线性可分性(linear separability)
4 N4 S; o+ `4 ]9 [
* y/ L1 b  N5 b/ o- A" {' v$ g8 a3 Y5 l" f. K& U

( Y& y' d2 B5 l而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
# M. s* H- M0 ~$ {+ [. _7 c" C. R; H. A% C2 |: E

% V: U5 E& L0 l0 j' ?- `" A2 K/ n* z0 h# X% `7 z: l9 J, \
决策边界
; K; Q  Y4 H! T) W2 T4 q
6 e0 }+ p: r" y/ [" F( CSVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。
, _4 [5 D6 T0 D4 I6 H, @' H& g) j" ~+ l

! f6 \5 j) w! {5 r; W2 {4 |7 m' e: c+ k/ e! ?
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
* s! p3 }5 T1 V% Q7 ~3 ]/ C* h
& f5 [& J, o4 o* E) Z- s支持向量(support vector)
8 F# X( H( p$ y. b0 V/ G: D9 ]$ w" d4 l0 @4 ~! V3 l/ _
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
% g$ |+ r; ^# B, `: v5 x: v6 ]4 e$ [9 I0 w5 k/ ]2 ^, o
/ ~' C3 h2 F* `& Y% f, r4 W
) Q# D+ R( V& X/ l. H( ]' p

4 E/ S; l5 P: x1 v9 t/ C( i6 z; n* j: p/ t& Q- Y2 j9 ]% [3 L. D
核方法4 E! d7 d/ m3 C8 K
8 P( ~9 Z: a2 o- E( ^) B$ h, `
# E3 V; B0 {. L) P$ o3 M
: _8 l; c$ V3 `; L3 B+ }

- [5 h& h/ A- t0 U9 e
8 f0 M7 }3 K# P% B. `以回避内积的显式计算。! c2 g+ g& g6 o* {6 B

3 [+ ]) X0 H5 e! t常见的核函数:
# }! {- }: y' Y) L( H$ _4 o5 X; K" G$ Q  L
4 ~+ B* v* X0 r: ?

( m7 [" |2 g3 Y! J% Zkernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
5 R0 H1 B! o: r2 _4 U1
. Q6 U/ O8 c1 U) q" }当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
6 [! A3 y, r0 R  Y9 T& T# e* |1 b6 a2 i" L; ^* r* n4 D6 ^
SMO序列最小优化算法7 {8 ]* ~# z9 b9 o$ {/ m/ H* N

& c5 k) T; W6 h' w8 e+ u8 w8 X0 K0 l

7 f5 ]8 q7 d, m1 I- J
8 w' H) |/ f% L6 W
8 c7 c% D* U% ^7 [# g! x; a; W; g8 Q' t7 i* k& G
% Y' r* o6 }3 q
三、Python sklearn代码实现:
" L& m5 g0 h2 }" i8 Q1 C3 Z: `8 k9 Q+ a# ^0 R) C3 ?
sklearn.svm.SVC****语法格式为:6 _! P6 L0 G/ T4 h; h

9 `0 P' ]  j7 i6 j1 E; Qclass sklearn.svm.SVC(  *,
. o2 M: @2 }7 M' M C=1.0, 5 j' \+ O; P' b; N5 [) [
kernel='rbf',' J; F5 g5 R- v# u
degree=3, : o' N, g6 s8 j  ~/ y
gamma='scale',
( n6 j6 j. Y( J- Q coef0=0.0,
1 X" M1 C& G& b/ r  R# G shrinking=True,
8 [/ x0 |4 P% @0 I/ o, } probability=False,
  |* \6 t% q  _" [; H tol=0.001,
- [$ \/ y2 r1 I  D3 p4 E5 T! B2 c cache\_size=200, - c* c/ L' A! G$ z( l$ B7 m
class\_weight=None,
3 H' F8 t* c/ |4 p% a verbose=False,
6 k; a4 N7 q" s max\_iter=- 1, ! a; G% Q& \- L
decision\_function\_shape='ovr', $ _7 Z3 f1 I- Z" f
break\_ties=False, / r6 ~' j) d5 R, K! G% d
random\_state=None)8 j, D$ ]% b7 L
& [2 z. n5 V$ [; l
1
' u5 e. \2 C6 Z* x. }2
; c% Q4 u* b: U/ i35 C, M4 t6 E3 Q; p
4
; ?1 o4 T) D4 f) Z% j5
# z9 \+ W! |' g6$ ~# G+ b. _) N
7
" X/ @8 W4 G2 m8
1 I4 x7 B: u; J/ t" e% v9( z8 ~  A/ V: s
10
" b+ I: i, ]5 D3 a* f7 C; N11
1 X% I$ }) T2 y" j" D8 v12
3 S8 i/ Z! T9 S. G13. i# E5 u7 [% H% Z" p3 s$ K
146 p& f  b4 F" ]8 J
15" q9 ^8 G; h0 H, z1 E) ?
16  x5 ]! Q# |# k# _3 J8 p
基于鸢尾花数据的实现及解释
" Y! u  s5 H; ?" d. K7 l% S9 w6 P7 Z; C' Y( q" W. p) |8 {: J) ?
代码如下:# n: }& o% B4 S$ L. Z# E

1 t" N" E6 N7 o; y 1 # 导入模块+ v8 B. N( }3 a! H3 b
2 import numpy as np7 S+ ~1 T2 i' v
3 import matplotlib.pyplot as plt
; t) e/ C) J  b 4 from sklearn import svm, datasets* \* H- Z2 M0 o3 |, N* X6 c
5 from sklearn.model\_selection import train\_test\_split
8 H6 d9 ]+ Y( g/ j' y0 l 6
; o0 {; D/ g/ w% c- g* } 7 # 鸢尾花数据
) M: I+ x" Y  [& Z' `0 f 8 iris = datasets.load\_iris()         #原始数据& N0 j3 f% V1 Y. t
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)2 X+ N) @+ z$ A) ~" }0 r
10 target = iris.target7 I% Z& o  X4 j+ M8 f& I
11
3 p. E% ], Z& e/ h1 P* Q12 #数组分组训练数据和测试数据
, l) [) c# I+ o1 f. P13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)
; a) k4 O" B% y( [! y3 j  f14 ' d- t# M% l: [
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2
' |$ w; Y  V) R" g" A+ J, w16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t5 R# Z5 a/ A2 I2 b4 o& s
————————————————+ f. a- K) R! q! b4 N! m
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ G) Y" D3 C# ]. P" g原文链接:https://blog.csdn.net/qq_43479892/article/details/1268117919 U) O3 K( K* ^

% i9 ], [9 S- q, H0 U- u
3 S* V5 Z* N# n$ |7 r6 V




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5