数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-13 12:41
标题: 支持向量机分类算法
支持向量机分类算法8 a, p- g, b$ S! g) E
; _2 g$ h  @! O7 Q( F- j
🚀 优质资源分享 🚀
8 S0 _5 m! {( }" [$ J4 V1 k& @学习路线指引(点击解锁)        知识定位        人群定位6 m: x3 ?8 y3 y( n/ Y
🧡 Python实战微信订餐小程序 🧡        进阶级        本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
* `8 R6 F; s6 Q& `7 g. ?& k&#128155ython量化交易实战💛        入门级        手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
6 \* B0 W: _! `8 Q3 \* _# k支持向量机SVM, {+ ?% a. }1 |0 `0 s

! P. U% s9 h3 M# n4 L# a6 s8 z5 w支持向量机原理7 K. r/ O. ^3 ?( q& d' u) J1 k( U
; v/ D3 ~5 R& u" F& `
1.寻求最有分类边界
2 {3 d3 r$ w1 e4 D( |
) i) K# C: g6 C. X/ @" C  w8 d% ]正确:对大部分样本可以正确的划分类别
2 T5 R3 h( \, H; c0 a5 P
  n  i+ c' D7 Y0 `泛化:最大化支持向量间距$ N8 T2 s& I. A
/ a; d- n/ p/ f1 h, J# Q2 _
公平:与支持向量等距
9 H, b: l! ~/ }2 k
# b: z* p5 j: ~0 C0 D0 y简单:线性、直线或平面,分割超平面6 Y1 h* _7 U$ t9 Y# V5 S

+ s6 }8 B; n' \# o0 M+ v5 y2.基于核函数的生维变换4 V$ Q1 N1 [1 N- ^. E
2 }% i/ n. N, g5 c
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。3 z* Y! e3 g6 C) t/ |' n
2 N+ |4 i( L, J
一、引论: z5 b- ?: H# B( [+ d

+ A8 }, h9 _+ h* ~6 S# i7 o使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:( _& i5 \, u. ^2 J$ F4 g
9 M& S. h7 N) ~: u+ W' ?

6 ~& ^6 w) o, a  @/ F3 S5 i+ j
0 m% ]8 s! x- c) f现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。$ q1 w8 F2 M+ j: S, c3 Y+ p' n* ]
- c# C; X3 ~5 B& j7 P- ~2 j
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:4 S" W: W# c7 a

  v2 E/ V! f8 Q; i二、理论铺垫/ x8 F1 g+ P2 j

- k5 A% V1 E$ O( H. I. l% T) c线性可分性(linear separability)9 A% ^0 W! U% K" ]" |# u
7 z9 L8 L: r. s2 k) y8 I( c. D

! I4 c* H5 C3 U. G1 y, U  j' L4 t9 U# g. s! F+ N9 J# A
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。0 q& D, G! h  x( y  B+ M

4 N" d+ z; O  ]; A- x0 f) n  K: n8 s, k

( u6 ?0 J: x3 h3 P& W- u决策边界+ i4 D7 L9 N& z8 `( n4 K

: Q- M9 J4 C, z7 @' j9 USVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。+ r7 H3 x; H$ Z% Q6 F
/ _5 I4 D* ]! Z

/ `* F7 @/ M( L4 `& }6 t. `# Z4 x6 v. T: \) h; }
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
1 I! A9 G1 H' G6 J+ D: Y. E4 s3 D$ Q7 f7 ]( y. j1 _2 \3 r
支持向量(support vector)
( a2 U4 G5 M! ?. q
" Q# E! r. @2 v6 R7 p在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
* \0 U! ]0 w" c
% P' y9 {/ r8 }# K3 z3 W5 \1 o: V# `2 j3 J+ O
# _, }& j$ L6 g  l% U
8 V% y* t4 z* T6 V- ?9 Z# e: x
9 @3 L: X. K* O5 i& i) L& e
核方法6 F: c) d- H7 T7 B
! R* e* K! M2 I8 q
' H4 l1 A$ G) J! s0 Z5 @

' c3 _8 m1 ^  ]- Z$ H: m  y& c; }6 J7 k( ~+ U9 O& u& g
) J6 b% p( ?: H/ [. n% N
以回避内积的显式计算。2 B) u4 i& F2 o/ E% A8 O- y1 ?
2 T( }# i, H* h9 e8 r0 z) m, U
常见的核函数:
" _8 Y5 I" @: e& I2 m# W* a  J& C

: ]& e" [8 w5 G  {6 `* W& e0 a; [9 T+ s5 N, H
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf': S3 n" ?4 m9 V2 N4 o' P
1) e/ |% g5 d7 @: S+ h- N3 R% Z% i
当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
6 V, X& h& H0 s  l. @4 c# \9 N8 I; Q& }
SMO序列最小优化算法7 i4 U) `. s* [$ j! Q$ @
9 w+ V3 g% ^* a3 k1 s

/ L6 K: m+ I1 X+ n  K4 b' D. D0 H7 Z+ f
+ z' h2 P) d$ H; M9 v8 [; m# N/ r6 g
+ x) e! O1 B- [* y" R0 F
% M, q) E8 @0 I! K
2 V. [) L3 ^" O" E
三、Python sklearn代码实现:
+ b9 L8 \4 h" o" u2 _& w  o# A" x* n/ n/ Y
sklearn.svm.SVC****语法格式为:2 p! W6 k  i$ e4 L) Y) j4 Y- V, H
* N6 Q, i) O" Z! C; e
class sklearn.svm.SVC(  *, ; \$ E; w7 q6 R2 ?( `9 W. ^$ v
C=1.0, , ^, e' I+ w) Z4 a: e7 H2 _8 b
kernel='rbf',+ r7 H5 I3 Q) n+ n$ s
degree=3,
/ L4 }3 E& b8 _2 R* ~ gamma='scale', " r1 D. Y$ w; m* Y! P
coef0=0.0,
% k8 r) T+ x, K9 {- t( A; N& Y8 H shrinking=True, 3 G% B1 Q% U7 m8 ^# t
probability=False, ( i3 {& H; s) W9 p
tol=0.001,
+ e: V( `2 l7 ^4 T3 y cache\_size=200, / _/ P/ V1 R2 T7 k* j% ]2 q- K
class\_weight=None,
! s9 I7 q: D: [ verbose=False,
( S- s. b# a! Y9 h max\_iter=- 1,
4 _. Q' K9 T4 Y decision\_function\_shape='ovr', 2 t0 h, |$ W4 P) }$ P8 R, d
break\_ties=False,
+ s% m2 U' e, C# g* E random\_state=None)- _$ A4 y" P. ^* v
% O% G. x; h0 z- ~0 P; k
1$ m; S* s$ o+ v. y5 E- a9 b  s+ U
2
/ G$ e2 V  ^+ z* ?% a. P3
1 D. g& d0 P3 a5 H$ h4
- x5 q9 F1 K$ k$ n" c& E5! h; r( y  w  r: R
6
* n6 L) v: ~; |5 I7/ c! L# \# p6 o& r6 G
8
' @3 q1 j6 H/ Z! d9' Q: z  [2 K. Q, p
10
! k' m# R4 @. d) E) |" @11
) v; M8 A( e+ C9 J8 k( x12: \) W5 c  I0 S6 Z' K; y
13
# w) p" z9 v8 [! y14
( Q1 A7 X) x  }" r9 r15
8 z/ j7 w! H% c3 p16, y. i+ m/ |" d1 P; Y
基于鸢尾花数据的实现及解释, C; f! W7 d0 k6 {

. t6 ~$ v7 F5 G: n: v. q- e代码如下:
2 h; K. j+ z' @1 i# Q) [3 {7 |! t) R2 C& z5 W4 l& j
1 # 导入模块
+ M" k; h* y# P5 k 2 import numpy as np
* @+ P/ f9 C  D! N 3 import matplotlib.pyplot as plt
4 {4 r/ j# D. I/ a 4 from sklearn import svm, datasets2 E9 V. S6 v9 l/ _" k
5 from sklearn.model\_selection import train\_test\_split
! E/ v+ P+ N2 z- F! l 6 ) U2 x6 T4 j; ~8 S' D/ p
7 # 鸢尾花数据- ^6 j! x2 L' p. r! j" U
8 iris = datasets.load\_iris()         #原始数据$ N0 k, h4 [1 a$ m3 ^+ M
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)0 P' [# R4 y9 H2 Q$ v6 S
10 target = iris.target
6 B) F8 K# Z8 c8 S, q11
1 Y; r: P9 j$ m( Z' F+ y% v12 #数组分组训练数据和测试数据* |& B- \( z( Y+ P
13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)' D3 q- W- C* D* p
14 + |  V' r  G" f9 ^# @# ]
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist21 ~' X/ b% `- U! L, t- E
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
. t" F1 R9 y: w- m2 k8 r4 [————————————————
1 X6 Y) w* `4 Y  M$ z$ C  k# s版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& z* Q0 J! x; a( m6 H. a. T  l
原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791
8 C$ D/ R. k8 `' h! T; P: q# b2 P4 J
, k0 v# g5 c2 Q6 i& T
# g, n1 C# }9 s* f9 W




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