首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python机器学习之支持向量机—SVM

支持向量分类

如果想更好地理解该算法的工作原理,可以先来研究二维空间线性分类的问题,其决策边界是一条直线,它把决策区域一分为二。我们用一个简单的训练集举个例子,它里面的数据点分属两个类别。训练集共包含11个数据点(观察到的数据),有取值范围均为0~4的两个不同属性。这些数据点的属性值存放在叫作x的NumPy数组中。数据点所属的类别用0或1表示,类别信息存储在数组y中。

把这些数据点绘制成散点图,观察它们在空间上的分布情况,该空间可以被称为决策空间。

既然定义好了训练集,我们就可以使用SVC算法进行训练了。该算法会创建一条直线(决策边界),把决策区域分成两部分,直线所处位置应该使得训练集中距离直线最近的几个数据点到直线的距离最大化。使用该条件,应该能将数据点分成两部分,每一部分中所有数据点的类别相同。

用训练集训练SVC算法之前,先用svc( )构造函数定义模型,我们使用线性内核。(内核指的是用于模式分析的一类算法。)然后调用fit( )函数,传入训练集作为参数。模型训练完成后,用decision_function( )函数绘制决策边界。绘制散点图时,注意决策空间的两部分使用不同的颜色。

由上图可见,两块决策区域各包含一个类别。可以说分类基本是比较成功的,除了有个别紫色的点被分到黄色的区域。

模型一旦训练完成,理解模型是如何进行预测的就很容易了。我们拿图来说,新观察到的数据点该分到哪一部分,取决于数据点在图中的位置。

反之,从偏程序设计的角度来说,predict( )函数将会以数值形式返回数据点所属的类别(0为用紫色表示的类,1为用黄色表示的类)。

正则化是一个与SVC算法相关的概念,用参数C来设置:C值较小,表示计算间隔时,将分界线两侧的大量甚至全部数据点都考虑在内(泛化能力强);C值较大,表示只考虑分界线附近的数据点(泛化能力弱)。若不指定C值,默认它的值为1。你可以通过support_vectors数组获取到参与计算间隔的数据点,为其添加高亮效果。

为了理解参数C对决策边界的影响,我们可以给C赋一个很小的值,比如0.1。我们来看一下计算的结果。

我们可以看到边界的界限明显有很大区别了,所使用的数据点增加了不少,分界线(决策边界)的位置也随着改变。但是现在有两个数据点处于错误的决策区域。

非线性SVC

至此,我们已经见识过了SVC线性算法,它旨在定义一条把数据分为两类的分界线。还有一些更为复杂的SVC算法,它们能够建立曲线(2D)或曲面(3D),所依据的原则依然是最大化离表面最近的数据点之间的距离。下面我们将会接触一个使用多项式内核的系统。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190422A0HXKH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券