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

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

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


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


1. 支持向量机的原理


支持向量机(Support Vector Machine),其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。

那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。

见下图,在一个二维环境中,其中点R,S,G点和其它靠近中间黑线的点可以看作为支持向量,它们可以决定分类器,也就是黑线的具体参数。


583dd31adf4a4147899026a4b7ac007d.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的解决问题的思路是找到离超平面的最近点,通过其约束条件求出最优解。

782cca8502a34cc7bb834bcd7bd64db0.png


3.2 最大几何间隔(geometrical margin)

0c167a07d2c54faa969b32145afcb152.png

71fdd9c892104c2386e45914b7ecd423.png


3.3 求解问题w,b


我们使用拉格朗日乘子法


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

拉格朗日乘子法可以解决下面这个问题:


2889de32975d45ed9c9a28546bcdb5b0.png

消除w之后变为:

65d36313854a498eb50aa33ade7b7ffa.png


可见使用拉格朗日乘子法后,求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)
• 1
# 将数据点分为2类,一类20个点
target = [0]*20 + [1]*20
plt.scatter(data[:,0],data[:,1],c=target)
• 1
<matplotlib.collections.PathCollection at 0x1e4a3106668>

732e1085dfc94a4dbf18eae104828d9a.png

# 创建支持向量机分类器
svc = SVC(kernel="linear")
• 1
• 2
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>]

d909f993238c4de0909150e804477065.png


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


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


2.1 产生非线性随机点


# 随机产生180个点
data = np.random.randn(180,2)
plt.scatter(data[:,0],data[:,1])
<matplotlib.collections.PathCollection at 0x1e4a4b0fbe0>

4723006b5a4247d8b3fb6bf67eb11375.png

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)

96b545f5d4994c06b30c277087283c75.png

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()]
• 1
xy.shape
• 1
(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>

7c5438f64b2d4895be43525bd7fe442b.png


相关文章
|
3月前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
242 1
|
6月前
|
机器学习/深度学习 算法
【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
支持向量机(SVM)的介绍,包括其基本概念、与逻辑回归(LR)和决策树(DT)的直观和理论对比,如何选择这些算法,SVM为何采用间隔最大化,求解SVM时为何转换为对偶问题,核函数的引入原因,以及SVM对缺失数据的敏感性。
109 3
|
6月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
261 2
|
6月前
|
机器学习/深度学习 算法
【机器学习】支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择(面试回答)?
文章对支持向量机(SVM)、逻辑回归(LR)和决策树(DT)进行了直观和理论上的对比,并提供了在选择这些算法时的考虑因素,包括模型复杂度、损失函数、数据量需求、对缺失值的敏感度等。
89 1
|
7月前
|
机器学习/深度学习 算法 数据可视化
Fisher模型在统计学和机器学习领域通常指的是Fisher线性判别分析(Fisher's Linear Discriminant Analysis,简称LDA)
Fisher模型在统计学和机器学习领域通常指的是Fisher线性判别分析(Fisher's Linear Discriminant Analysis,简称LDA)
|
8月前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
8月前
|
机器学习/深度学习 搜索推荐
解决冷启动问题的机器学习方法和一个简化的代码示例
解决冷启动问题的机器学习方法和一个简化的代码示例
|
8月前
|
机器学习/深度学习 算法 数据格式
机器学习线性回归——概念梳理及非线性拟合
机器学习线性回归——概念梳理及非线性拟合
129 0
|
8月前
|
机器学习/深度学习 算法 Windows
【阿旭机器学习实战】【34】使用SVM检测蘑菇是否有毒--支持向量机
【阿旭机器学习实战】【34】使用SVM检测蘑菇是否有毒--支持向量机
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
187 4