数学建模社区-数学中国
标题:
支持向量机分类算法
[打印本页]
作者:
杨利霞
时间:
2022-9-13 12:41
标题:
支持向量机分类算法
支持向量机分类算法
) [8 V8 Y8 B3 }7 o: Q
5 y j' x) R5 \' ?
🚀 优质资源分享 🚀
! Z4 x' R( e) q) F; U6 l1 F
学习路线指引(点击解锁) 知识定位 人群定位
6 o4 @& H4 z1 U% U/ p* }
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
! j' {( H2 g1 G& ~& n6 y& I
💛
ython量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
& R& C. ?/ T6 E2 q: n$ n
支持向量机SVM
}5 s- W% W2 L: l+ P
1 E- g3 P8 T8 _ ~9 t
支持向量机原理
; f" R; e" G: b' T( i' S! g& `
}- V5 H$ \5 U5 f" Y
1.寻求最有分类边界
* G, w6 M% E( q5 L+ Y# E! A3 J8 e
" ]9 W4 Q6 _' [" v2 }4 o
正确:对大部分样本可以正确的划分类别
! r4 i' Z& ?, z8 b. K6 M
7 N6 U8 X I9 S$ l% J4 N
泛化:最大化支持向量间距
5 C- I' X0 y; N) s5 O9 A( p5 f
& R/ E. P1 L' K0 h& H
公平:与支持向量等距
4 ]& C) q8 ]* N1 j2 a/ q
( C' B; a. c) m& x9 F4 v
简单:线性、直线或平面,分割超平面
7 o# H; _! M. |3 t
7 \( g& a+ [% n Q7 I
2.基于核函数的生维变换
5 s. ^' z8 D/ B/ c( U* A! h
! N# }$ X. a8 ^0 `/ {3 r3 B
通过名为核函数的特征变换,增加新的特征,使得低维度的线性不可分问题变为高维度空间中线性可分问题。
3 l% M' r% |5 `9 A4 D
& M6 d9 \; O( i1 x3 T( x
一、引论
! h( f( L D% y* a
% Y% k) f. m9 k; F) P! E* l
使用SVM支持向量机一般用于分类,得到低错误率的结果。SVM能够对训练集意外的数据点做出很好的分类决策。那么首先我们应该从数据层面上去看SVM到底是如何做决策的,这里来看这样一串数据集集合在二维平面坐标系上描绘的图:
2 ?$ N1 n% I" |3 u5 N( n3 M4 O
. F5 M P l9 z4 }; \+ m
; W% N) u* q5 Z8 n6 r) M# y
4 M0 i$ ?: ^8 V9 S5 w
现在我们需要考虑,是否能够画出一条直线将圆形点和星星点分开。像first第一张图片来看,圆点和星点就分的很开,很容易就可以在图中画出一条直线将两组数据分开。而看第二张图片,圆点和星点几乎都聚合在一起,要区分的话十分困难。
' R* H9 I; u* M+ r9 D- ^+ B, X
8 e) E% C' ~; h* x
我们要划线将他们区分开来的话,有有无数条可以画,但是我们难以找到一条最好区分度最高的线条将它们几乎完全区分。那么在此我们需要了解两个关于数据集的基本概念:
" m% R. @9 _" t. V
# _. X/ E* t. i1 X
二、理论铺垫
! ^3 z' `" b5 n7 {& ]9 {
6 o& K6 [& p @( N1 r
线性可分性(linear separability)
# L8 y1 m+ j. v; E& l
( O* U% P- T# v8 Y
' S8 W3 }4 @' G! L* j
& Y4 p w8 z+ d; C6 d
而对机器学习来说,涉及的多是高维空间(多维度)的数据分类,高维空间的SVM,即为超平面。机器学习的最终目的就是要找到最合适的(也即最优的)一个分类超平面(Hyper plane),从而应用这个最优分类超平面将特征数据很好地区分为两类。
7 Y5 b3 J$ }7 V) X H4 g
0 K# g6 x# B- V) t; U+ b
( D7 p. E3 y0 M2 C d7 N
* J0 j" d: ?3 D7 V7 P# ?/ G
决策边界
: w/ c" h: X( A( ~4 R. ?
! W5 V" x7 ]) y7 o
SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化。那么这个决策边界就是不同类之间的界限。
( [: m2 z5 D7 g& j1 e) p
! k- L/ P3 z/ }4 e/ G+ X; U5 g1 R
) |5 \" A O3 {* h; A
& Q: M# b% \- r5 [ x$ E, B
总而言之:在具有两个类的统计分类问题中,决策边界或决策表面是超平面,其将基础向量空间划分为两个集合,一个集合。 分类器将决策边界一侧的所有点分类为属于一个类,而将另一侧的所有点分类为属于另一个类。
6 d3 t& F8 ?! k1 t/ x# R: }. }
2 Q: T4 P3 h# a% u, ~! q
支持向量(support vector)
e9 S& N6 \% p0 n+ Q3 u" ]7 k3 ^
4 p4 d& y! P5 d7 }4 W- J& A
在了解了超平面和决策边界我们发现SVM的核心任务是找到一个超平面作为决策边界。那么满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
) \0 `9 E2 l. R( ?+ \# T- F% t
$ O% o2 q4 W' J5 s% p. a
# q6 Y6 f7 z% v: B
, n: d% v+ |% e4 R% u" M
4 {% R3 r3 G W% K2 `% K/ u
6 U. k4 t. o# @# ^) |5 @# a
核方法
5 G- i! N' o' {. e- h) L/ h7 R
' I. F8 L# [6 x2 c
; n. t5 I# u$ _+ ]) t: V' c
_* b$ r% ?. {: E1 v' A/ m7 n
$ Y% ~* ]( C) q: y- q: _
% x3 g, ?/ b ~
以回避内积的显式计算。
) R1 i5 S" F3 w# C
% O0 Y& ?, B6 w
常见的核函数:
. Y' s& u8 @" T1 R* J& z
! `9 Y) q6 T- O+ ~6 p
; F$ p4 c) ^( }$ B
6 _/ e2 G% U2 v9 O
kernel : {'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf'
& W3 E6 |4 M# n/ l
1
) R. F: ?. L3 p4 t7 ?& V
当多项式核的阶为1时,其被称为线性核,对应的非线性分类器退化为线性分类器。RBF核也被称为高斯核(Gaussian kernel),其对应的映射函数将样本空间映射至无限维空间。
3 j- T, |& B3 B8 \& ^
5 O. X: c) \$ _. K5 _5 P) \8 H
SMO序列最小优化算法
! A0 A: g9 F% [5 I9 ^. W' s8 m
- E+ s+ ?) j$ Q+ G# [! A7 ]
0 S* L1 K7 }3 u' H5 Z6 |. R7 M
! ^1 S2 a' o" s8 t/ m5 ?
+ r$ h* b4 [+ W9 k5 o5 z4 J
# W, c( j# e0 j( d. a7 T" z/ z
# X8 E- u: h* H, V+ @7 ~; U
$ n7 G0 e4 T8 ^5 ~0 v
三、Python sklearn代码实现:
* T. U' |" `: G- ~# L% z( m
8 x+ q( \: M) H: @
sklearn.svm.SVC****语法格式为:
. l+ S6 N6 h) d( N: A, b L
: b- H N u/ ~9 t( ?5 {. `* W2 i! e
class sklearn.svm.SVC( *,
P# L4 R- o% N" t, ]& d) v! ~
C=1.0,
. \; x3 H8 m2 G; C5 v& m
kernel='rbf',
; P5 G7 \ r4 e; H/ t
degree=3,
% r! k# S$ v- H6 X
gamma='scale',
* @! d$ |+ Y+ v1 _; m- P+ [
coef0=0.0,
3 o' h* j! q6 N2 r
shrinking=True,
. T+ M7 K4 C1 V7 _4 V6 T( P, E, j6 |
probability=False,
9 w8 H( u9 f6 y U2 _! X. u4 ]9 o
tol=0.001,
8 N: s% r1 a- ^; c
cache\_size=200,
& f* }8 {- r; q* y" ?
class\_weight=None,
% _& L3 U- P- E9 {1 p9 {1 K
verbose=False,
& G4 a4 e1 v5 S, f8 o
max\_iter=- 1,
0 [9 @7 W3 t s1 o7 i; Z
decision\_function\_shape='ovr',
# l1 a$ Y' ~3 l+ Z$ q% H
break\_ties=False,
2 K' y* I+ E0 m" `- ], |1 u0 k; M, t
random\_state=None)
" Z) b2 {9 z3 N2 d
6 Y: |7 h& _9 X, c) C
1
8 K. B, F' o! }. {3 \
2
, U% B0 o" B5 `% y% _5 t
3
4 a* _; [, Z3 l
4
- m) V- `3 [4 \
5
6 f* b5 r4 ~) ?1 S3 r5 c
6
2 I, i; ?+ \- g3 A
7
; ]+ `) E' c3 c$ p
8
( I$ d) }5 {% A6 p
9
" w: r6 x% C' }4 k% ?3 G0 L' v
10
{" H( Q0 _& [6 f9 [3 a3 H
11
; m3 `8 ]& e( {! w- y
12
T2 e8 T& w- C; J' c i' b5 g
13
8 l! O' a1 T% G9 _+ P {
14
5 W) ~ E' d4 q9 Y% Z- z
15
- Q/ c ^, s7 R2 @9 ~
16
. O% N7 J& z8 }/ `. t! f
基于鸢尾花数据的实现及解释
' {+ m9 f. o3 y- u
W) n* h+ c/ e8 u' K' b
代码如下:
( X0 _' r8 H( j/ @8 C, O3 R: ^
8 M" Z3 { z, r" ?
1 # 导入模块
+ \( ^& Y2 H9 _# j! T4 |
2 import numpy as np
& a+ g; Z9 |2 x5 u$ C; ?
3 import matplotlib.pyplot as plt
) U& _- U& j. @: e8 t( ~
4 from sklearn import svm, datasets
* p& m& F% p0 ^6 ?
5 from sklearn.model\_selection import train\_test\_split
6 v" M) y9 v4 G) Q p' I
6
3 q. O- q& d3 A+ p0 `; i0 S# }
7 # 鸢尾花数据
0 j2 y4 d" Z) y4 d4 F3 Z1 F
8 iris = datasets.load\_iris() #原始数据
1 K* V, \ o# Z9 C4 H9 u
9 feature = iris.data[:, :2] # 为便于绘图仅选择2个特征(根据前两列数据和结果进行分类)
0 \; R% W6 Q+ S; l3 u
10 target = iris.target
, N F5 U! J' p* [1 M5 [
11
* ~" z! o! C D. O3 d
12 #数组分组训练数据和测试数据
, P" Y- Q. v3 Z0 c
13 x\_train,x\_test,y\_train,y\_test=train\_test\_split(feature,target,test\_size=0.2,random\_state=2020)
' A. T$ B. w) T) I4 g6 G" @# `
14
) J5 V, k6 y6 L- i# L+ h
15 # 测试样本(绘制分类区域),我们数据选了两列即就是两个特征,所以这里有xlist1,xlist2
1 ~/ {0 B( f3 ~4 V
16 xlist1 = np.linspace(x\_train[:, 0].min(), x\_t
* Z) k+ l+ m e! L4 V! _5 n
————————————————
3 K% J3 r2 P, e) ^5 ?' L
版权声明:本文为CSDN博主「qq_43479892」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 M- [& O" z q; Z {) P
原文链接:https://blog.csdn.net/qq_43479892/article/details/126811791
, n9 f: ?3 A8 W% T
: ?, u4 w4 Y& Y6 _" _# s
8 C! w4 j. [3 ~' Q, ?
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5