数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-13 12:41
标题: 支持向量机分类算法
支持向量机分类算法, y0 \" Y- ^" d7 k
0 `# _1 C: ]" Y% n
🚀 优质资源分享 🚀  R5 F/ {+ m8 f8 c/ a  }
学习路线指引(点击解锁)        知识定位        人群定位( P2 L! @* V3 x9 j/ F
🧡 Python实战微信订餐小程序 🧡        进阶级        本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。* F5 z* g- Z& L6 N* X/ ^
&#128155ython量化交易实战💛        入门级        手把手带你打造一个易扩展、更安全、效率更高的量化交易系统2 [% a8 f& j# S
支持向量机SVM5 O' L/ X1 y9 g

3 ]: m# z3 b' S( v/ K$ o4 \) ^+ b  i支持向量机原理( j0 x3 j8 x% P& V

6 s2 Q8 p& p$ o3 z3 ]: w1.寻求最有分类边界
9 F, D  R9 c" G/ T( x+ a2 X
$ f& u8 R: C$ v正确:对大部分样本可以正确的划分类别
# x4 x, z9 M9 h- \/ S# |+ |! `7 a; P9 C2 P* ]
泛化:最大化支持向量间距/ A: c) l6 S5 O) @/ A: f8 ^
+ ~2 m( N% z3 G4 p, Z* G
公平:与支持向量等距4 H" c0 d6 `/ d* l7 a# A
4 u( ?) J3 g1 c+ j& p
简单:线性、直线或平面,分割超平面
' L8 l) s) u$ J. c  W$ Z; u  J4 G% y
2.基于核函数的生维变换# W1 N6 K  V4 B" C$ ]" |5 B. m

: ]. q+ g  x: v$ s5 r& j. g; d通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。" c, t" u. [4 q" w; H1 L4 J9 V
" V. g1 n; D- Z; M" d1 S4 c
一、引论
5 \" L8 o$ ^/ U2 V
( x- }. p/ L) f使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:' P: f0 ~' Z' O1 w& C  \

+ {# q* u. y  c% a  Q  u
  K% m1 Z, H: E! Y3 z5 N% J! E
1 [6 K9 a0 S1 B  T; }现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。
* S' c6 U/ R+ l4 l. y. X9 R
% Q" \/ I2 v$ m& L我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:
4 v& L' [- o8 M# a3 N" E
( t4 a/ n. X! S; |4 ?二、理论铺垫
8 j& w8 W3 g! G( G
- M0 \% p0 S) A; W线性可分性(linear separability)3 j. s9 R! A. z+ U

6 _- M% i7 m' I4 P
" O( a2 H' U1 `, l; S7 \8 e- |0 y3 S" }; I% [) R% I, [9 G
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
* ?! f+ N9 n" D* q) m- Y4 r  r2 x* r$ ~

* R; c% T" @, ~  s+ ]. @6 s& x+ ~8 ^7 L
决策边界
/ E6 _, ~0 G. |
* _* g/ f& R* V' K9 i) R! ^" ~SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。- \! z7 Z5 C9 x

- Z4 v6 D- j8 \) Z$ [8 C6 e- W4 Z$ \  z0 N
  D- T+ L$ }0 s7 F7 R
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
4 q/ W) N' T/ q. C
6 N% N5 M) K: p" ?9 G4 Q支持向量(support vector)
2 [8 N6 ~9 e& z& U& `9 H* @# B1 G2 K9 I7 A/ S9 @
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:: T% Z7 o7 [& f0 ^! W) J& f- X
( }5 j' _9 T4 U- ?
6 ?4 k2 o3 P+ j5 z
4 e9 b4 a' m" P

+ ^; \% f1 v0 r+ N( G! X* V# {
: F/ S% H3 N- l- Z! n核方法
% E& [0 G, y, ]! o8 |
$ ^/ Z/ j( _+ H" B5 w
' I; R5 _2 E- j$ @& n! W0 u2 T1 |; G! r+ Z/ D' v

  \5 Q4 h% h' C* g# J7 a
: E6 F) Z; r! C( |0 F- a5 C& y以回避内积的显式计算。$ v! H7 e8 X# _( ~! n5 ~- W" l
6 u1 S. g4 |  ~# w9 _4 D
常见的核函数:
  G) K- X1 O9 g% s% O6 {/ W+ g! X5 H$ e% I& b5 n. ~6 h/ E
: ~* e0 o. [" T5 D0 W# u
$ P4 i- |/ D- e2 [. e9 |
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
/ w/ Q) K* y, l8 ^& h5 N; R3 ?& d1
' s# @" i/ z# n% D" ]; y0 y当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。' N- ~9 W0 a" G: R

% c" ?2 F1 x# a! ~3 p# N8 j4 @SMO序列最小优化算法8 U: Z% G5 }# U! k9 C. K" a
+ M3 Y5 `9 [8 X) |" H
  N' E/ {& ^' e! L# E6 i8 a
" A2 l- n/ C# G" y" p: _2 p, u

0 p* r3 B" L9 p" M: r% f( q+ U) v# t; X, ]

  a% q9 w% L( e1 b4 o& z9 D
! |" @! }' Z& ~; Q: A8 g三、Python sklearn代码实现:
7 o0 m* B$ Q1 H/ R
- Z' W0 i( N! m0 F4 z0 W$ S' Vsklearn.svm.SVC****语法格式为:
9 \7 `$ k/ w& i7 ^3 {+ X% ^$ \& P! K/ n! u5 H
class sklearn.svm.SVC(  *,
1 F3 F+ z" m: Q C=1.0,
3 s, n) T6 o2 {$ D) q( D& o kernel='rbf',
1 v; |4 E! I, ]- U  R; ~ degree=3,
+ c- [0 ]' R  [* o gamma='scale',   S4 d! b% {3 }# Q9 l" }
coef0=0.0,
/ G; z) g" q; i& e5 L! U- L" I shrinking=True, / P) u  q- b# h3 ]
probability=False,
/ g: {$ {  ^2 ~9 I% Z$ z  u tol=0.001,
/ D5 k* i% \  p1 T cache\_size=200,
! b6 e( `& e% a- l class\_weight=None, * i2 M+ ?9 h' _4 x# \
verbose=False,
1 R( p/ H; y; u# A: R max\_iter=- 1,
* }7 U) l* c+ ~4 p$ U# q decision\_function\_shape='ovr', ! U3 I$ b' l3 @- P6 ~
break\_ties=False, 8 S% S5 h5 T; o
random\_state=None)0 ?6 M# b1 }3 o% \3 Z
! T+ e/ ^$ h7 q: O$ X
1  V0 r& O* A. d3 t* q
2
7 p  a$ e6 M' A39 N: y) ]( x: ^5 v" O
45 D- S3 @/ l) {4 ?; e* C9 M0 i1 d  P
5: {& _/ i4 s) C- v3 F
69 Q# J9 _$ u* I" A' o5 C2 S
7
0 p0 T9 e* I* x) Z+ W6 S81 H6 Q8 A& F6 u; P9 l  g
9
  h! e6 v7 T( X0 P10
) d8 v1 \( \/ ^1 g2 p! `11
0 x7 \7 @4 K* @$ X7 `% n6 Q7 y123 H" k8 b# [! E' F  ^
13
7 {; d& h  u- M) ^+ A4 p14
1 l+ M. t" ~3 w! E1 ~15( ~, |! t5 t: u: T. |, r
16
5 b- z4 e! x# d/ ?0 P3 }9 W7 [0 W9 ?基于鸢尾花数据的实现及解释% p; }7 f$ p' V& I5 ^% ]/ _* w
( J0 A' K! F/ r9 W
代码如下:
' i! I+ A; d. h: J2 U& ]% U& J" a, Y1 u
1 # 导入模块
$ T- Y0 t5 n2 P3 i- C& d* X7 Y* n! _ 2 import numpy as np
9 R- ?) ?  f8 n# V+ r 3 import matplotlib.pyplot as plt1 d1 v6 e/ A6 }! m8 Y
4 from sklearn import svm, datasets- ~1 A! z% Q( ]0 ?+ o
5 from sklearn.model\_selection import train\_test\_split
$ z5 U$ a8 @% u7 W0 d 6
, n- s% e! q9 A* p; v3 Z" Q 7 # 鸢尾花数据* I% I6 o4 f& N5 V
8 iris = datasets.load\_iris()         #原始数据
- g" e# k3 A9 H. ]8 I" i; p  [& Q, i 9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)
* m4 ~7 W2 P+ P* x5 u10 target = iris.target/ w/ |& b$ [9 \, Y4 ^
11 # \. W' L/ u. D8 h3 O8 ]7 g
12 #数组分组训练数据和测试数据
+ n& `- @2 Z* m13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)9 Z, f- X9 n, s: k
14 . r4 P9 r3 v: Z+ z8 A" w  }8 [
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2' Q- F- A9 B( {% V- `+ o$ I3 p
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
8 _9 s7 M* Z2 s% M6 J5 e5 m————————————————* L( `  V3 }1 Q* t: J
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
; Q' g. [" V; o原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791! j5 z/ o" ]4 X  R

$ w/ C1 `2 i+ H& K& G. T# r% f7 A9 o# s6 Z1 l3 A" Y* W





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