热门标签 | 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机器学习之路系列:










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



推荐阅读
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • #点球小游戏fromrandomimportchoiceimporttimescore[0,0]direction[left,center,right]defkick() ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本文介绍如何使用 Python 的 Pandas 库中 Series 对象的 round() 方法,对数值进行四舍五入处理。该方法在数据预处理和分析中非常有用。 ... [详细]
  • Kubernetes 持久化存储与数据卷详解
    本文深入探讨 Kubernetes 中持久化存储的使用场景、PV/PVC/StorageClass 的基本操作及其实现原理,旨在帮助读者理解如何高效管理容器化应用的数据持久化需求。 ... [详细]
  • 本文介绍如何利用 Python 中的 NumPy 和 Matplotlib 库,从 NumPy 数组中绘制线图。通过具体的代码示例和详细解释,帮助读者理解并掌握这一技能。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • 本文详细介绍了Python中列表的创建、访问、修改、排序及遍历等基本操作,帮助初学者快速掌握列表这一重要数据结构。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
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社区 版权所有