当前位置: 首页 > news >正文

机器学习-04-分类算法-04-支持向量机SVM

总结

本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与SVM算法部分。

本门课程的目标

完成一个特定行业的算法应用全过程:

懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合
+算法评估+持续调优+工程化接口实现

参考

图解机器学习 | 支持向量机模型详解

支持向量机通俗导论(理解SVM的三层境界)

支持向量机(SVM)

机器学习中的算法(2)-支持向量机(SVM)基础

看了这篇文章你还不懂SVM你就来打我https://tangshusen.me/2018/10/27/SVM/

斯坦福CS229 | 机器学习-吴恩达主讲(2018·完整版)

https://www.bilibili.com/video/BV1hT4y1r73X/

机器学习定义

关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用:
对于某类任务T性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习
在这里插入图片描述

SVM算法

SVM算法简介与分类

支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
在这里插入图片描述

在这里插入图片描述

目标:找到最好点到决策边界最大
SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但 SVM 在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。

在这里插入图片描述x到面的距离就是画一个垂线,面上有两个点x’ 和 x" ,则点x’ 和 x" 是满足平面方程的,假设平面方程为
y = W x + b y=Wx+b y=Wx+b,把x’ 和 x"代入
W T x ′ + b = 0 和 W T x " + b = 0 W^Tx'+b=0 和 W^Tx"+b=0 WTx+b=0WTx"+b=0
我们计算x到点x’ 和 x" 的距离,因为点到点的距离相比点到面的距离好算些。
法向量W是垂直于平面的,在对这个x到点x’ 或者 x到点x"的距离按照法向量W进行投影,就得到了点x到平面的距离

在这里插入图片描述
法向量是没有方向的,用 W T W^T WT 处于自身的模 ∣ ∣ W ∣ ∣ ||W|| ∣∣W∣∣就得到了单位方向向量
∣ W T ∣ ∣ W ∣ ∣ ( X − X ′ ) ∣ |\frac{W^T} {||W||}(X-X')| ∣∣W∣∣WT(XX)
就是在单位方向的投影,对其展开,由于 W T X ′ = − b W^TX'= -b WTX=b
∣ 1 ∣ ∣ W ∣ ∣ ∣ ( W T X + b ) ∣ |\frac{1} {||W||}|(W^TX+b)| ∣∣W∣∣1(WTX+b)

在这里插入图片描述

在这里插入图片描述
因为 ∣ ( W T X + b ) ∣ |(W^TX+b)| (WTX+b)有绝对值,但 y i ∗ y ( x i ) > 0 y_i*y(x_i)>0 yiy(xi)>0就可以实现把绝对值符号去掉

在这里插入图片描述
此时的优化目标函数就等价于 :与该分割线最近点距离最大
放缩变换从>0变为>1的目的是为了便于计算,因为1*任何数都为自身
最终就得到了目标函数 a r g m a x w , b 1 ∣ ∣ W ∣ ∣ argmax_{w,b}\frac{1}{||W||} argmaxw,b∣∣W∣∣1

在这里插入图片描述
把最大值转换为求最小值, W 2 W^2 W2表示一个向量,添加 1 2 \frac{1}{2} 21不影响求最小值
这里我们需要在约束条件下,求极值

在这里插入图片描述
在拉格朗日法中,包含不等式和等式的约束条件,在此约束条件下求方程的最小值。
如本体中,我们求W和b,不好求,但可以求一个 α \alpha α α \alpha α和W和b有关系
在这里插入图片描述

在这里插入图片描述
KKT条件

在这里插入图片描述
这一步求出了最小距离的点

再求最小距离最大的点在这里插入图片描述
依然把最大值转换为最小值,最大值的整数,加上负号 就是 求最小值了

在这里插入图片描述
这里的约束条件就是如下的约束条件
在这里插入图片描述

代入的
代入X1 ,X2,X3的值为:在这里插入图片描述
这里的 18 α 2 18\alpha^2 18α2是当i=1并且j=1时,把 x 1 x_1 x1为(3,3)点代入,把 y 1 y_1 y1为+1代入后的结果在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

支持向量机学习方法,针对不同的情况,有由简至繁的不同模型:

线性可分支持向量机(linear support vector machine in linearly separable case):训练数据线性可分的情况下,通过硬间隔最大化(hard margin maximization),学习一个线性的分类器,即线性可分支持向量机(亦称作硬间隔支持向量机)。
线性支持向量机(linear support vector machine):训练数据近似线性可分的情况下,通过软间隔最大化(soft margin maximization),学习一个线性的分类器,称作线性支持向量机(又叫软间隔支持向量机)。
非线性支持向量机(non-linear support vector machine):训练数据线性不可分的情况下,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性分类器,称作非线性支持向量机。
在这里插入图片描述

支持向量机可以借助核技巧完成复杂场景下的非线性分类,当输入空间为欧式空间或离散集合、特征空间为希尔贝特空间时,核函数(kernel function)表示将输入从输入空间映射到特征空间得到的特征向量之间的内积。
通过使用核函数可以学习非线性支持向量机,等价于隐式地在高维的特征空间中学习线性支持向量机。这样的方法称为核技巧。
在这里插入图片描述

最大间隔分类器

分类问题的数学理解是空间划分(或者寻找不同类别的决策边界),如图所示是一个简单的线性分类器(这部分更详细的讲解参考ShowMeAI文章 图解机器学习| 机器学习基础知识 和 图解机器学习 | 逻辑回归算法详解)。
在这里插入图片描述

不同的模型在解决分类问题时,会有不同的处理方式,直观上看,我们会使用不同的决策边界对样本进行划分,完成该分类任务的决策边界有无数个。SVM 模型,要求更高一些,它不仅仅希望把两类样本点区分开,还希望找到鲁棒性最高、稳定性最好的决策边界(对应图中的黑色直线)。
在这里插入图片描述
这个决策边界与两侧「最近」的数据点有着「最大」的距离,这意味着决策边界具有最强的容错性,不容易受到噪声数据的干扰。直观的理解就是,如果决策边界抖动,最不容易「撞上」样本点或者进而导致误判。

支持向量机详解

1)线性可分 SVM 与硬间隔最大化
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

SVM 总结

1)模型总结

支持向量机(Support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,他的学习策略就是间隔最大化,同时该方法可以形式化为一个求解图二次规划。
在这里插入图片描述
2)模型优缺点
(1)SVM模型优点
在这里插入图片描述

在这里插入图片描述

基于Python的 SVM 代码实践

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()
X = iris.data[:, :2]  #只取前两维特征,方便可视化
y = iris.target
svc = svm.SVC(kernel='linear', C=1).fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.subplot(1, 1, 1)
Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()

输出为:
在这里插入图片描述

在这里插入图片描述

使用多项式核函数
初始化 SVM 对象的代码替换为下面这行

# svc = svm.SVC(kernel='linear', C=1).fit(X, y)
svc = svm.SVC(kernel='poly', degree=3).fit(X, y)

输出为:
在这里插入图片描述

使用rbf核函数(高斯核函数)
初始化 SVM 对象的代码替换为下面这行

# svc = svm.SVC(kernel='linear', C=1).fit(X, y)
# svc = svm.SVC(kernel='poly', degree=3).fit(X, y)
svc = svm.SVC(kernel='rbf', C=1).fit(X, y)**

输出为:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

确定方向过程

针对完全没有基础的同学们
1.确定机器学习的应用领域有哪些
2.查找机器学习的算法应用有哪些
3.确定想要研究的领域极其对应的算法
4.通过招聘网站和论文等确定具体的技术
5.了解业务流程,查找数据
6.复现经典算法
7.持续优化,并尝试与对应企业人员沟通心得
8.企业给出反馈

相关文章:

  • JNDI注入原理及利用IDEA漏洞复现
  • 小巧玲珑的SQLite
  • Java中的类与对象
  • 笔试总结01
  • 深度学习基础知识概述
  • 【算法】差分、前缀和(重新排序)
  • 外包干了3天,技术明显进步。。。。。
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 前端结合 react axios 获取真实下载、上传进度
  • Vue3学习日记 Day4 —— pnpm,Eslint
  • 【C++】vector容器初步模拟
  • python初始化二维数据
  • 实体框架EF(Entity Framework)简介
  • linux之shell脚本基础
  • DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection
  • Angular2开发踩坑系列-生产环境编译
  • C++11: atomic 头文件
  • canvas绘制圆角头像
  • es6(二):字符串的扩展
  • Java精华积累:初学者都应该搞懂的问题
  • js作用域和this的理解
  • leetcode98. Validate Binary Search Tree
  • Mac转Windows的拯救指南
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • python学习笔记 - ThreadLocal
  • RxJS: 简单入门
  • select2 取值 遍历 设置默认值
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 测试如何在敏捷团队中工作?
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 爬虫模拟登陆 SegmentFault
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 实现菜单下拉伸展折叠效果demo
  • 算法-图和图算法
  • 微信开源mars源码分析1—上层samples分析
  • 温故知新之javascript面向对象
  • 数据可视化之下发图实践
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • (3)STL算法之搜索
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (分类)KNN算法- 参数调优
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (转)甲方乙方——赵民谈找工作
  • ./和../以及/和~之间的区别
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 依赖注入和配置系统
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .sys文件乱码_python vscode输出乱码
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?