一文读懂:支持向量机(SVM)非线性分类问题

点击 机器学习算法与Python学习选择加星标

精彩内容不迷路

福利时间

奖品:机器学习算法的数学解析与Python实现》x 5

参与方式:文末留言,赞数最多的5位为本次中奖者

开奖时间:2021年5月20号20点

备注:如有问题,请添加小助手微信:MLAPython,备注(姓名-单位-研究方向)

支持向量机(Support Vector Machine,SVM)模型是一款性能表现出色、知名度很高的机器学习模型,常用于解决分类问题。但支持向量机涉及较复杂的数学公式推导,容易让初学者让而却步,不敢深究其内在原理。其实,支持向量机和最简单的分类模型——Logistics回归模型——的基本原理都是一样,都是想用线性方法解决分类问题。

但是,线性方法存在明显的局限性,那就是无法解决非线性的分类问题,这个局限也就成为线性分类器的性能天花板。而支持向量机之所以成功,就是使用一系列的数学方法,就像一套配合完美的组合拳,巧妙突破了这个天花板限制。

这套组合拳大概可以分为三个部分:最大间隔、高维映射和核方法,其中高维映射是支持向量机可以用线性方法解决非线性分类问题的关键,弄明白了这个,就弄明白了支持向量机最核心的数学原理。

1.  从更高维度看“线性不可分”

用线性方法分类就是用一条“直线”——当然有时候可能是多维的“直线”也就是平面——来划分数据。这种方法实际是在正类和负类之间找到一个能插入直线的间隔,但遇到数据非线性分布,也就是真正意义上的“间不容发”的情况,这套线性分类方法就失灵了。

在很多情况下,不同类别的数据分布并不像象棋那样泾渭分明,只需要简单地找出一条分界线,而是混杂在一起,我中有你你中有我,更为形象地说,大部分的数据不像是象棋,而更像是杀得犬牙交错的围棋,无法用线性加以区分,术语很形象地称为线性不可分。

可是,线性不可分真的就是线性分类器的尽头了吗?

支持向量机创造性地引入高维映射巧妙解决了这个问题。高维映射是支持向量机最让人尖叫的部分,也是数学在机器学习算法里能够达到的巅峰。数学有一种思路,遇到新的难题,通常解决分两步。第一步,将新问题转化成已经解决的就问题;第二步,完成转化后,通过老方法加以解决。我们要解决的问题就是,怎样为线性不可分变得线性可分,然后再按老办法寻找最大间隔。

让线性不可分线性可分,这不是矛盾吗?不矛盾。线性不可分,只是在当前的维度下线性不可分,但如果增加了维度,原本不可分也就可分了。还是以刚才的围棋为例,围棋顾名思义,棋子都是黑子白字互相包围在一起的,属于线性不可分。但假设有一个武林高手暗运掌力,忽然快速往棋盘上一排,让白子黑子都垂直往上飞起,同时让黑子飞高一点,白子则相对低一些,这样,平面无法线性区分的黑白子门,在进入立体空间,多了高度这个维度之后,就体现出了区别。这时,只要往飞升的黑白子之间塞入一张薄纸,就把两种棋子分开了。二维的叫线,三维的叫面,超过三维的不另外改名字了,统一都叫超平面。

2. 高维映射

大多数介绍支持向量机的教材,说到这里也就差不多了,但这容易引来了两个让人困扰的问题:一个理论层面的质疑:为什么映射到高维就能保证正负类能够上下分开这么凑巧?一个是应用层面的问题:这个高维空间要怎么找?变成高维空间容易,增加一个维度就能达到提升空间维度,一直增加下去也就成了高维空间,可是肯定不是简单地增加维度就能分开,还得给原有数据点在新的空间里安排位置对吧,那怎么知道怎么安排才合适?

为了说清楚这个问题,首先还是让我们回到最初的地方:我们要解决什么问题?线性不可分问题,具体来说,就是正类和负类混杂在一起,你中有我我中有你,无法简单地插入一根线进行区分。

这就好办了。我们把问题形象化,为这个“你中有我我中有你”想象一个具体的样子,不如就想象一根铁丝,上面串了三枚五角星,我们的目标是用一根直线,分出中间的五角星。

显然这是个线性不可分问题。无论直线怎么摆放,中间的五角星一定都会至少和一枚侧边的五角星在一边,无法正确区分。不过,这个看似不可能的任务,只要稍微弯一下铁丝,铁丝形成一个U型。这时,中间的五角星处在了低端,而两边的五角星被抬高了,这时只要横着往中间插一根直线,就能正确区分二者。

3.  真实世界的高维映射

也许一个点看着不够味,那我们来看看更贴近我们熟悉的数据集样本情况。再次明确一下,我们现在正在处理的是如何用线性方法处理线性不可分数据的问题,那么首先就是数据分布的情况。

既然是线性不可分,那可以推想需要区别的两类数据点处于一种你中有我或者我中有你的状态,最极端的就是一类数据被另一类“包围”,如果用红色和绿色区别这两类数据,图像就变成了“万绿丛中一点红”,在这种情况下显然不可能用任何一条直线划分二者,也就是无法使用线性方法进行分类(如下图左)。

现在我们进行高维映射。这里我们选择肉眼可见的方法,就把高维映射想象成在二维空间中倒扣上一只肚子朝上的漏斗,二维空间就变成了三维空间,我们把漏斗移动到红色类的数据上方,这时两种颜色的数据就出现了高度差,这时就可以通过插入一块平板分隔二者,也就是可以采用线性的方式进行非线性数据的区分了区分(如下图右):

总结一下,非线性数据之所以可以用线性方法区别区分,是因为给原本只有“左右”区别的五角星,增加了“上下”的维度,出现了线性可分的差别。从另一个角度看,这也是一种用映射方法来解决问题的案例。直线有直线方程,弧线有弧线方程,只需要通过一个映射,就能使得原本线性排列的数据呈弧线排列。对于机器学习用映射来解决问题我们并不陌生,回忆一下,Logistics回归里的S型函数就是这种手法。这就是增加维度来解决线性不可分的问题关键,知道当前分布是什么样子,知道想要达到的分布是什么样子,那么,只要选择合适的映射函数,也就解决了第二个问题。

作者简介:莫凡  

网名木羊同学,娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。(PS: 非B站莫烦)

《机器学习算法的数学解析与Python实现》

作者:莫凡

ISBN:978-7-111-64260-2

卖点:

  • 生动——语言生动幽默,通过分析大量生活案例,帮助读者理解机器学习的算法。

  • 简单——让很多听起来高大上的名词更实用。

  • 实用——精选了最主要的机器学习算法,如线性回归算法、Logistic回归算法、KNN算法、朴素贝叶斯算法、决策树算法、支持向量机算法、K-means聚类算法、神经网络、集成学习方法等。

  • 系统——从概念、原理、Python实现、应用场景几个方面,详细剖析机器学习中主要的算法。

推荐语:

有趣、易懂、不枯燥,看得懂、学得会的机器学习入门书。全书用白话讲解,帮你从生活案例中理解算法,发现算法的乐趣,再把算法应用到机器学习中,让你零基础掌握算法精髓,快速进入人工智能开发领域。

扫码优惠购书

福利时间

奖品:机器学习算法的数学解析与Python实现》x 5

参与方式:文末留言,赞数最多的5位为本次中奖者

开奖时间:2021年5月20号20点

备注:如有问题,请添加小助手微信:MLAPython,备注(姓名-单位-研究方向)



  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是Python中使用Scikit-learn库实现线性支持向量机和非线性支持向量机的代码示例: 线性支持向量机: ```python from sklearn import svm from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # 构造数据集 X, y = make_blobs(n_samples=50, centers=2, random_state=6) # 线性支持向量机分类器 clf = svm.SVC(kernel='linear', C=1000) clf.fit(X, y) # 绘制决策边界 plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired) ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() xx = np.linspace(xlim[0], xlim[1], 30) yy = np.linspace(ylim[0], ylim[1], 30) YY, XX = np.meshgrid(yy, xx) xy = np.vstack([XX.ravel(), YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--']) ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none') plt.show() ``` 非线性支持向量机: ```python from sklearn import svm from sklearn.datasets import make_circles import matplotlib.pyplot as plt # 构造数据集 X, y = make_circles(n_samples=100, noise=0.1, factor=0.4, random_state=6) # 非线性支持向量机分类器 clf = svm.SVC(kernel='rbf', C=1000) clf.fit(X, y) # 绘制决策边界 plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired) ax = plt.gca() xlim = ax.get_xlim() ylim = ax.get_ylim() xx = np.linspace(xlim[0], xlim[1], 30) yy = np.linspace(ylim[0], ylim[1], 30) YY, XX = np.meshgrid(yy, xx) xy = np.vstack([XX.ravel(), YY.ravel()]).T Z = clf.decision_function(xy).reshape(XX.shape) ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--']) ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none') plt.show() ``` 以上代码中,make_blobs和make_circles是Scikit-learn中自带的数据集生成函数,用于生成模拟数据集。在实际应用中,可以将数据集替换为真实数据集。SVC函数是Scikit-learn中的支持向量机分类器函数,其中参数kernel可选为'linear'、'poly'、'rbf'等核函数,参数C是正则化参数。最后使用plt绘制决策边界和数据点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值