热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:小白python机器学习之路——支持向量机

篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白python机器学习之路——支持向量机相关的知识,希望对你有一定的参考价值。支持

篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白python机器学习之路——支持向量机相关的知识,希望对你有一定的参考价值。



支持向量机(support vector machines, SVM)

一、类型:监督学习,分类


支持向量机可以理解为感知器的一种扩展,相比起逻辑回归,支持向量机的概念更为形象,更好理解。

如图所示,将(二维)数据用一条直线分开,可能会有很多种分法,支持向量机的优点就是可以选择其中“最好的”直线。

首先要定义一个概念,支持向量(support vector)。支持向量就是(二维)数据分割线两边离分割线最近的一个或几个点,显然,对于一个分类问题,支持向量最少有两个(一边一个);也可能有多个(每一边的所有支持向量到分割线的距离都相等而且最小)。

支持向量机就是基于支持向量工作的,它的成本函数就是图中的Margin,也就是两边的支持向量到分割线之间的距离之和。很好理解,成本函数当然越大越好啦,也就是分割线离两边的点越远越好。

当然,以上的原理图和介绍都是基于二维数据的,我们可以无脑将之推广到多维(“分割线”换成“分割面”,甚至是“分割超平面”;“点”换成“超级点”),反正一定不会错。

小白python机器学习之路(六)——支持向量机


二、原理


1、成本函数

为了更好的理解,我们依然以二维的数据为例。

如果将分割线一侧的点的标签视为1,另外一侧的点的标签为-1,而分割线处为0,我们就可以通过净输入得到下面的等式:

小白python机器学习之路(六)——支持向量机

将两等式相减,并用ω向量的长度将等式两侧“标准化”,可以得到margin的表达式:

小白python机器学习之路(六)——支持向量机

等式的左侧就是要使其最大化的margin,其实如果从二维的角度理解,就是点到直线的距离。如此的话,分类的标准也可以写成如下形式:

小白python机器学习之路(六)——支持向量机

ok,如果要最大化margin,只要优化等式右侧的权值向量相关的函数就可以了。实际使用时,往往采取最小化1/2 * ||ω||^2的办法,可以通过凸二次规划问题的解决方法去求解。这里我们不细说。


2、非线性问题与松弛变量

如果遇到样本非线性可分的情况,像感知器一样,在支持向量机中也要放宽标准。这里引入松弛变量ξ来达到“软边界”的目的。

小白python机器学习之路(六)——支持向量机

可以看到,较小的ξ可以容许一定的分错,如果ξ很大,那么分类边界可以变得非常“没有下限”。在这种情况下,成本函数就为:

小白python机器学习之路(六)——支持向量机

这里的C可以看做是正则化参数,C越大,对于分错的惩罚就越大,和逻辑回归中的超参数C刚好相反。

小白python机器学习之路(六)——支持向量机


3、非线性问题与核SVM(kernel SVM)

SVM对于非线性问题的处理是很有一套的,在处理非线性问题时,可以选择将SVM“核化”。什么意思呢?不急,我们先来构造一些非线性可分的数据。

import numpy as np
import matplotlib.pyplot as plt
#设定随机种子
np.random.seed(18)
#生成服从正态分布的200行、2列的随机数
X_xor = np.random.randn(200, 2)
#设置逻辑门分组器
y_xor = np.logical_xor(X_xor[ : , 0] > 0, X_xor[ : , 1] > 0)
#将X_xor中两列都大于零的部分的标签设置为1,其余为-1
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor == 1, 0], X_xor[y_xor == 1, 1], marker = "x", label = "1")
plt.scatter(X_xor[y_xor == -1, 0], X_xor[y_xor == -1, 1], marker = "o", label = "-1")
plt.ylim(-3, 3)
plt.legend(loc = "best")
plt.show()

小白python机器学习之路(六)——支持向量机

这个数据用一条直线怎么分都很难分得开吧。核SVM此时就会将在二维难以线性分割的数据映射到三维,之前有看过一个形象的比喻:桌上有一堆散落的苹果和梨,想要用一根棍子把他们分开,怎么都做不到,这时突然来了一个武林高手,“喝”的一声就向着桌子一掌拍了上去,苹果和梨都飞了起来;由于苹果和梨的形状不同,下落的速度也不同,武林高手用棍子在空中“刷”的一下(摆拍),完美的将苹果和梨分开了。

核SVM做的就是这样一件事情,用一个映射函数Φ(·)将低维线性不可分的数据映射到高维,分开之后再映射回去:

小白python机器学习之路(六)——支持向量机

比如说,这里的第三个维度就是x1和x2的平方和,原来2维的特征空间变成了新的3维的特征空间,那么分割起来就是这样的效果:

小白python机器学习之路(六)——支持向量机

常用的核函数就那么几种,在sklearn中使用kernel参数都可以进行设置,包括rbf、linear、poly、sigmoid。那么如何选择核函数呢?说真的,真正做数据科学比赛的时候,我都是一个一个试的,不是说搞清楚理论再去选择不重要,而是现阶段这样做更为高效。

rbf核函数可以表示两组样本之间的相似度,它是这样的:

小白python机器学习之路(六)——支持向量机

将分母提出来化简:

小白python机器学习之路(六)——支持向量机

其中的γ就是原来的分母。由于有e为底,整个结果会落到0-1之间,如果两组样本距离很远,k会趋近于0,代表两组样本相似性很小;反之亦然。这里的γ就成为了模型中的一个超参数,可以进行设置,它对于模型的影响我们可以在代码的部分更好的理解。

小白python机器学习之路(六)——支持向量机


三、python实现

sklearn.svm拥有SVM的各种实现函数,这里我们使用SVC,顾名思义就是SVM的classifier(分类器)。

首先我们测试一下rbf kernel SVC对于上面的非线性数据能够做到怎样的效果,还是利用之前的plot_decision_regions对边界进行可视化。

from matplotlib.colors import ListedColormap
from sklearn.svm import SVC
svm = SVC(kernel = "rbf", random_state = 0, gamma = 0.1, C = 10)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier = svm)
plt.legend()
plt.show()

小白python机器学习之路(六)——支持向量机

如果将γ调大一些呢?

svm = SVC(kernel = "rbf", random_state = 0, gamma = 10, C = 10)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier = svm)
plt.legend()
plt.show()

小白python机器学习之路(六)——支持向量机


可以看到边界变得更“软”了,但是这样做看起来会更容易过拟合,因此参数还是要好好的调一下的。

小白python机器学习之路(六)——支持向量机


参考文献

【1】Python Machine Learning, 2015, Sebastian Raschka




小白python机器学习之路系列:










欢迎我的关注微信公众号——生物与化学数据分析,化学狗与生物狗学习数据分析的好地方!有问题随时提出哦!



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 支持向量机训练集多少个_25道题检测你对支持向量机算法的掌握程度
    介绍在我们学习机器算法的时候,可以将机器学习算法视为包含刀枪剑戟斧钺钩叉的一个军械库。你可以使用各种各样的兵器,但你要明白这些兵器是需要在合适的时间合理 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
    1、下面是一些基本的数字电路知识问题,请简要回答之。(1)什么是Setup和Hold时间?答:SetupHoldTime用于测试芯片对输入 ... [详细]
  • 在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构; ... [详细]
  • Highcharts翻译系列之二十:曲线图例子(二)
    Highcharts翻译系列之二十:曲线图例子(二)代码 ... [详细]
author-avatar
别喷我我还小_216
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有