【阿旭机器学习实战】【20】支持向量机SVM原理简介及示例演示:画出SVM二维决策边界与分离非线性坐标点

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。

本文介绍了支持向量机SVM的基本原理,并且通过2个示例介绍了SVM二维决策边界的表示方法,以及通过SVM分离非线性坐标点,并绘制轮廓曲线

目录

支持向量机SVM简介及示例演示

【关键词】支持向量,最大几何间隔,拉格朗日乘子法

1. 支持向量机的原理

支持向量机(Support Vector Machine),其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器
那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。
见下图,在一个二维环境中,其中点R,S,G点和其它靠近中间黑线的点可以看作为支持向量,它们可以决定分类器,也就是黑线的具体参数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ukr2e86-1667787571800)(attachment:1.png)]

2. 解决的问题

  • 线性分类

在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。
其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。
支持向量机是一个二类分类器。

  • 非线性分类

SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。

3. SVM解决问题的步骤

1.SVM的目的是要找到一个线性分类的最佳超平面 f(x)=xw+b=0。求 w 和 b。

2.首先通过两个分类的最近点,找到f(x)的约束条件。

3.有了约束条件,就可以通过拉格朗日乘子法和KKT条件来求解,这时,问题变成了求拉格朗日乘子αi 和 b。

4.对于异常点的情况,加入松弛变量ξ来处理。

非线性分类的问题:映射到高维度、使用核函数。

3.1 线性分类及其约束条件

SVM的解决问题的思路是找到离超平面的最近点,通过其约束条件求出最优解。

在这里插入图片描述

3.2 最大几何间隔(geometrical margin)

在这里插入图片描述
在这里插入图片描述

3.3 求解问题w,b

我们使用拉格朗日乘子法
来求w和b,一个重要原因是使用拉格朗日乘子法后,还可以解决非线性划分问题。
拉格朗日乘子法可以解决下面这个问题:

在这里插入图片描述

消除w之后变为:

在这里插入图片描述

可见使用拉格朗日乘子法后,求w,b的问题变成了求拉格朗日乘子αi和b的问题。
到后面更有趣,变成了不求w了,因为αi可以直接使用到分类器中去,并且可以使用αi支持非线性的情况.

4. 实战示例

1、示例1:画出SVM二维决策边界

import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
%matplotlib inline

随机生成一些数据

a = np.random.randn(20,2) + [2,2]
b = np.random.randn(20,2) + [-1,-3]
data = np.concatenate([a,b])
data.shape
(40, 2)
# 将数据点分为2类,一类20个点
target = [0]*20 + [1]*20
plt.scatter(data[:,0],data[:,1],c=target)
<matplotlib.collections.PathCollection at 0x1e4a3106668>
在这里插入图片描述
# 创建支持向量机分类器
svc = SVC(kernel="linear")
svc.fit(data,target)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
# 找到支持向量
sv = svc.support_vectors_
sv
array([[ 0.47403487,  1.35490312],
       [ 2.76462572, -0.35759099],
       [ 0.70116275, -2.38879174]])
# 提取斜率:svc.coef_
# mx + ny + b = 0 ==> ny = -mx - b ==> y = -(m/n)x - b/n
w = -svc.coef_[0,0]/svc.coef_[0,1]
w
-0.747621114673942
# 提取截距:svc.intercept_
b = -svc.intercept_[0]/svc.coef_[0,1]
b
-0.07777143534587211
x = np.linspace(-3,6,100)
# 直线方程
y = w*x + b
plt.scatter(data[:,0],data[:,1],c=target)
plt.scatter(sv[:,0],sv[:,1],c="r",s=300,alpha=0.5)
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x1e4a0fd2d30>]
在这里插入图片描述

上图中,红色的点表示支持向量直线表示SVM的决策边界

2、示例2:SVM分离非线性坐标点

2.1 产生非线性随机点

# 随机产生180个点
data = np.random.randn(180,2)
plt.scatter(data[:,0],data[:,1])
<matplotlib.collections.PathCollection at 0x1e4a4b0fbe0>
在这里插入图片描述
a = np.array([[1,2],[-1,2],[-1,-1],[1,-4]])
target = np.logical_xor(a[:,0]>0,a[:,1]>0)
target
array([False,  True, False,  True])
# 通过异或方式,产生非线性分类目标点
target = np.logical_xor(data[:,0]>0,data[:,1]>0)
target
array([False,  True,  True,  True, False,  True, False, False, False,
        True,  True,  True, False,  True, False,  True,  True, False,
        True,  True, False,  True, False,  True, False,  True, False,
       False, False, False, False, False,  True,  True,  True,  True,
       False, False,  True, False,  True,  True,  True, False,  True,
        True,  True, False,  True, False, False,  True, False,  True,
        True,  True, False,  True, False, False, False, False,  True,
        True, False,  True,  True, False, False, False,  True, False,
       False,  True, False,  True, False,  True,  True, False, False,
        True,  True, False,  True, False, False, False,  True, False,
       False, False, False,  True,  True, False, False,  True,  True,
       False,  True, False, False,  True, False,  True, False, False,
       False, False,  True,  True,  True,  True, False,  True,  True,
        True, False,  True,  True,  True, False,  True,  True, False,
       False,  True, False,  True,  True,  True,  True, False,  True,
        True,  True,  True, False,  True,  True,  True, False, False,
       False,  True,  True,  True, False, False, False,  True, False,
        True,  True, False,  True, False, False,  True,  True,  True,
        True,  True,  True, False,  True, False,  True, False,  True,
       False,  True,  True,  True, False,  True, False,  True, False])

np.logical_xor的作用示例
a = np.array([[1,2],[-1,2],[-1,-1],[1,-4]])
target = np.logical_xor(a[:,0]>0,a[:,1]>0)
target结果为:array([False, True, False, True])

plt.scatter(data[:,0],data[:,1],c=target)
在这里插入图片描述

2.2 构建SVM模型并训练

svc = SVC() # SVC的核函数默认为rbf,基于半径的核函数
svc
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
svc.fit(data,target)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

2.3 绘制轮廓曲线

# 确定轮廓曲线的范围
xx,yy = np.meshgrid(np.linspace(-3,3,500),np.linspace(-3,3,500))
xy = np.c_[xx.ravel(),yy.ravel()]
xy.shape
(250000, 2)
# 求测试点到分割超平面之间的距离
distances = svc.decision_function(xy)
distances.shape
(250000,)
plt.contour(xx,yy,distances.reshape(xx.shape),cmap="PuOr_r")
plt.scatter(data[:,0],data[:,1],c=target)
<matplotlib.collections.PathCollection at 0x1e4a46c2518>

在这里插入图片描述

如果内容对你有帮助,感谢记得点赞+关注哦!

更多干货内容持续更新中…

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容