机器学习基础篇(九)——支持向量机

机器学习基础篇(九)——支持向量机

一、简介

支持向量机(SVM:Support Vector Machine)是机器学习中常见的一种分类算法。在时机应用中,我们常会遇到这样的问题:
给定一些数据点,他们分别属于两个不同的类。我们现在要找到一个线性分类器吧这些数据分成A,B两类。最贱的办法是:画一条先,然后将他们分成两类。线的一侧属于A类,另一侧属于B类。SVM算法可以让我们找到这样一个最佳的线(超平面),来划分数据。相比于KNN之类的算法,SVM算法只需要计算一次,得出最佳线(超平面)即可。面对测试数据,只需要判断数据点落在线的哪一侧,就可以知道该数据点所属分类了。比起KNN每次都需要计算一遍邻居点的分类,SVM算法显得简单无比。

二、超平面

  • 当我们的数据点集是二维的时候(意味着有两个特征),我们只需要用一根线,就可以将数据分成两个部分。如图所示,我们用一根线将数据集分成了两个部分:
    在这里插入图片描述
  • 同理,当我们的数据点集是三维的时候(意味着有三个特征),我们需要一个二维的平面,才能把数据分成两个部分。如图所示,我们使用一个平面,将数据分成了两个部分:
    在这里插入图片描述
  • 同理,当我们的数据点集为N维的时候(意味着有N个特征),此时我们需要一个N-1维的超平面,才可以把数据分成两个部分。
  • n维空间中的超平面由一下方程确定:
    在这里插入图片描述
    其中,w 和 x 都是 n 维列向量,x 为平面上的点,w 为平面上的法向量,决定了超平面的方向,b 是一个实数,代表超平面到原点的距离。

三、超平面的选择

我们有无数个超平面可以将数据集分成两个部分。首先,我们考虑最简单的二维情形,如图所示:
在这里插入图片描述
我们有无数条线可以将蓝色圆圈和红色方块分成两个部分。那么我们应该怎么找到最佳的分割线呢?
如图所示:
在这里插入图片描述
在固定超平面方向且不会错误分离样本的时候,移动超平面。此时会在超平面的两侧找到两个极限位置(越过该位置就会分错数据),如上图虚线所示。
该位置由超平面的方向以及距离超平面最近的几个样本的位置所决定。而在虚线中心的绿色实线,则就是我们在保持超平面方向不变的时候,得到的最佳超平面。而这两条虚线之间的垂直距离,就代表这这个超平面的分类间隔。当我们改变超平面的方向的时候,我们会得到不同方向的最佳超平面。
那么,哪个方向所对应的最佳超平面才是真的最佳呢?
我们知道,不同方向的最佳超平面,所对应的分类间隔不同。所以,“分类间隔”最大的那个超平面,就是真正的最佳超平面。
最佳超平面为两条虚线的中轴线而该平面所对应的两侧虚线穿过的样本点,就是SVM中的支持样本点,被称为“支持向量”,这就是支持向量机算法的数学本质。

四、忽略异常值

在我们分类的过程中,有时会发现一些异常点,如图所示。
在这里插入图片描述
SVM会忽略这个异常值,并且创建一个最佳分类线。

五、核函数

以上的讨论针对的都是线性可分的数据集,
但是在实际生活中,我们会碰到很多线性不可分的数据集,如图所示:
在这里插入图片描述
那么这种非线性可分的数据是否就不能用svm算法来求解呢?答案是否定的。
事实上,对于低维平面内不可分的数据,放在一个高维空间中去就有可能变得可分。以二维平面的数据为例,我们可以找到一个映射,将二维平面的点映射到三维平面之中。
理论上任意的数据样本都能够找到一个合适的映射,使得这些在低维空间不能划分的样本到高维空间中之后能够线性可分。
例如:
在这里插入图片描述
在这里插入图片描述
常见的核函数如下:
在这里插入图片描述

六、代码展示

# 支持向量机
import numpy as np
import matplotlib.pyplot as plt
# 导入SVM算法
from sklearn import svm
# 导入乳腺癌数据集
from sklearn.datasets import load_breast_cancer
dataCancer=load_breast_cancer()
data=dataCancer.data[:,0:2]
target=dataCancer.target
# 查看数据
# print(data)
# 创建SVM模型,选择和函数为linear
# C:目标函数的惩罚系数c,用来平衡分类问题间隔margin和错分样本的,default C=1
# kernel参数选择有:RBF,Linear ,Poly,Sigmoid,默认为RBF
model=svm.SVC(kernel='linear',C=10000)
# 使用模型训练数据集
model.fit(data,target)
# 绘制数据集散点图
plt.scatter(data[:,0],data[:,1],c=target,s=30,cmap=plt.cm.prism)
# 创建坐标刻度线
axis=plt.gca()
x_limit=axis.get_xlim()
y_limit=axis.get_ylim()
x=np.linspace(x_limit[0],x_limit[1],50)
y=np.linspace(y_limit[0],y_limit[1],50)
X,Y=np.meshgrid(x,y)
xy=np.c_[X.ravel(),Y.ravel()]
# 创建最佳分割线
decision_line=model.decision_function(xy).reshape(Y.shape)
# 绘制分割线的图
axis.contour(X,Y,decision_line,colors='k',levels=[0],linestyles=['-'])
# 展示支持向量点
axis.scatter(model.support_vectors_[:,0],model.support_vectors_[:,1],s=100,linewidth=1,facecolors='none',edgecolors='k')
plt.show()

运行结果
在这里插入图片描述

七、小结

在分类问题中,SVM是一种很优秀的机器学习算法。
优点

  • 可以有效的分离高维度的数据
  • 更节省内存空间,因为只需要用向量来创建最佳超平面
  • 是针对于可分离数据集的最佳方法

缺点

  • 当数据量级较大的时候,分类效果不好
  • 针对于不可分类的数据集,效果有些不太好
    自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷,喜欢的小伙伴帮忙点个赞支持,蟹蟹呀
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值