ADM-201 dump PMP dumps pdf SSCP exam materials CBAP exam sample questions

《机器学习之数学》#2 支持向量机 – 译学馆
未登录,请登录后再发表信息
最新评论 (0)
播放视频

《机器学习之数学》#2 支持向量机

Support Vector Machines - The Math of Intelligence (Week 1)

大家好 我是西拉杰
今天我们要创建一个支持向量机
来把数据分成两类
我之前录过这个视频
但是视频的声音和图像质量不好
所以现在我再重录一遍
以保证此频道中视频的质量
言归正传 大家好好听
我们要构造一个支持向量机
来将数据分成两类 对吧?
优化支持向量机这种机器学习模型时
我们使用的是梯度下降法
这就是我们要做的
屏幕上为其示意图
具体而言是这样的
假设有两类数据
其中一类我们用红点来表示
另一类则用蓝点来表示
所以如果我们在二维图像中
也就是X-Y平面上画出两类数据
那么我们可以画一条线
或者说一个决策边界
能最好的将两类数据分开
这条线称为超平面
我们的支持向量机会帮助我们画出这条线
这就是支持向量机要做的工作
从高层次来看支持向量机就是如此
接下来我会详细讲解它的工作机制
我们创建支持向量机和画图时
要用Numpy库和Matplotlib库
不会用到tensorflow之类 好吧?
我希望你和我一样感到激动
因为我们既要深入理论
也要写代码
好 我们现在开始
首先介绍下支持向量机的几种使用场景
第一种是分类 也是我们将要做的
事实上这也是SVM最主要的用途
是SVM最常用到的场景
但SVM也可用于其他类型的机器学习问题
比如回归分析 即我们有一些数据点集
根据这些数据预测数据集中的下一个点
股价预测就是一个很好的例子
这种应用也叫做时间预测序列
离群值检测也可以用SVM
比如你有一个安全系统
你要追踪这个系统的所有用户
每个用户都有一组指标 也就是一组特征
包括用户的登录时间 行为等
这些特征可以用来识别用户
这个安全系统可能会遇到异常
异常可能是有个坏蛋
要闯入你的安全系统
SVM可以帮你检测那个坏蛋是谁
SVM还可以做聚类
但这个我们就不讲了
它与偏离值监测一样
都是一种无监督学习的方法
我们要讲的是有监督的分类方法
即数据是有标签的
我们要学习数据和标签之间的映射关系
如果我们知道了这个映射 或者说函数
这个表现这些变量之间对应关系的函数
如果得到了这个函数
那机器学习模型的任务就完成了
然后我们就可以使用这个函数
给这个函数代入新的数据
它会输出预测结果
这就是机器学习的整个过程
我们来看一下
本例中我们要用简单的少量数据
因为我们主要讲的
是数学和算法
我还有另外两个例子
如果你要做点有用的东西 可以看一下
第一个例子是手写数字的识别
我们有一组手写的数字
它们都有自己的标签
我们想知道这些标签和手写数字的对应关系
而MNIST这个库就能帮我们实现
这个库非常棒
它用了Scikit-learn这个非常受欢迎的机器学习库
只用一行代码就能实现一个SVM
但我们要从头开始实现SVM
因为我们要了解SVM的工作原理
一旦你懂得了它的原理
那你就可以用像这种更简单的方法实现SVM
这是一个实际应用的例子
我再讲给大家准备的第二个例子
那就是脉搏分类
它的理念是给定一个人的一些数据
比如年龄 当然还必须要有脉搏次数
我们就能预测他们的情绪
所以它是种情绪分类
我们会用这个库里的SVM包 以及Scikit-learn
来实现我们的SVM
当你理解了支持向量机的数学背景
并弄明白了相关的代码后
可以看一下这两个库
好 现在
这就是提到的另外两个例子
这个方法和其他机器学习算法相比如何呢?
现在有很多机器学习算法
有随机森林 神经网络
实际经验表明
SVM应用在小的数据集上非常有效
这里的“小”是指一千行或者更少的数据
即一千个数据点或更少
如果我们有这种数据集
用SVM来进行分类非常适合
很多人都这么用
相比之下 其他的算法
比如随机森林 深度神经网络等
需要更多的数据
不过它们所建立的模型都具有鲁棒性
选择使用哪个分类器
取决于你的问题和你所拥有的数据
你有了这种数学直觉之后
就知道该选择那个分类器了
现在我们开始学习支持向量机
我还要引用一句话
这句话出自著名计算机科学教授Donald Knuth
我当然知道他的名字有其他读法
他说 过早优化是万恶之源
至少在编程领域大多数情况下都是
这句话什么意思呢?
意思是如果你用非常复杂的方法
比如神经网络
提高了系统性能
但是这种提升
这种性能的提升只有千分之一
那就没有必要了
程序员的时间是很宝贵的
程序员希望用最少的时间
得到想要的结果
所以如果你要用深度神经网络
解决一个支持向量机就能解决的简单问题
你就应该用支持向量机
而不是因为深度神经网络热门
或者大多数情况下比其他方法好而去用它
因为深度神经网络需要更多数据
以及更多的 呃
它需要更强的计算能力和更多数据这两样
如果你没有这些 就不要用它
就用支持向量机就好了
这些方法都充满智慧
这些智慧都是数学的智慧
有很多办法来解决这些问题
那支持向量机到底是什么呢?
这个东西既可以用来分类
这个是这类那个是那类
也可以做回归 预测序列中下一个点
如果有两类或更多类有标签的数据
记住我们用的是有监督的学习方法
支持向量机可以建立一个判别分类器
这个分类器可以辨别出不同的类别
这个属于这个 那个属于那个
顺便提一句 与辨别分类器相对的
是生成分类器 它可以用来产生新的数据
我们拿一些训练数据
使用我们的模型对它进行某种改变
得到的输出数据与训练数据非常相似
但却是新的数据
但这是后面课程的内容
我们建立这种超平面的方法
我们后面会讲“超平面”
我们创建这个超平面或者说这条线
这个数据间的判别边界的方法
是通过最大化间隔来实现的
这个间隔是这条线与两个类别之间的空间
这是什么意思呢?
我所说的这两个类别实际上
是指两类数据点 看看这张图
是这两类数据点中距离判别边界最近的点
我们称这些数据点为支持向量
称它们为支持向量
是因为它们就是向量 数据点向量
支持向量机创建超平面
需要这些向量的支持
好 我们要最大化这个间隔
为什么呢?
因为我们要画一条线
这条线要非常精确的
处于这两类数据集合的正中央
这样的话当我们画一个新的数据点
如果这个点属于某一个特定的类别
那么它会以最大可能性
落在判别边界属于它类别的那一侧
唯一能最大化这个空间的方式
能使新数据点可以落在正确的一边的方式
就是最大化数据点之间的空间
然后在这个空间正中间画上一条线
明白我的意思吗?
我看不到大家的反馈 不过我可以假设
这是很直观的 对吧?
对于窄的间隔
我们把间隔最大化
然后画一个判定边界 一条最适合的线
不是最适合 应该是分类结果最好的线
我们称这条线为超平面
那什么是超平面呢?
超平面是一个决策面
假设有n维空间
假设我们的数据是n维的
这里的n是数据所拥有特征的数量
比如长度 宽度 高度
舌头的颜色 舌头的颜色?
这是什么鬼?
舌头的颜色
肤色 或者什么东西的颜色
所以
超平面是n-1维的
比如你有一张2维的图
就比如屏幕左侧我鼠标指向的这个图
这里R字母上角标是2
表示这是一个2维的图
那超平面就会是2-1维
即n-1维 也就是1维
所以这就是一条线 对吧?
但是如果你是在3维空间里 即R^3
那么超平面就会是2维的
因为3减1为2
这样我们就有了一个平面
这样我们就可以推广到高维
比如说我们有一个400维的空间
这在机器学习里很常见
数据不是只有2个或3个特征
它可以有很多很多特征
这些特征并没法被巧妙地处理成可视化的形式
这也是降维等其他方法能够派上用场的地方
我们后面会讨论
但是现在 如果我们有400维的空间
空间里有数据点的图
那么这里的超平面就是399维的
但这些我们是看不见的 想象一下
我们人类的视觉能力并不强
事实上我们无法看到任何高于3维的东西
但是这对机器来说非常简单
也非常直观
这一点很关键
只要我们的机器可以画出
这个n-1维的判定边界
那我们有新数据后
如果把数据放到模型 放到函数中
如果我们把新数据代入到函数中
它就会有输出数据本身正确的类别
这一部分实际上是几何知识
所以我认为在机器学习中会用到一些几何
关于线性分类和非线性分类
我们只会讨论线性分类
因为
非线性分类更复杂 我们以后会讲
但是它的思路是这样的
比如说你有一些
你有一些数据集
有两个数据集 两类数据
可能对这两类数据区分最精确的那条线
并不是直线
它有可能是曲线 比如图上这个例子
我们应该怎样创建这样的超平面呢?
这比线性的更复杂
有一个巧妙的方法叫做核技巧
我们后面会讲
它用某种方式将输入空间映射到一个特征空间
在这个特征空间里可以得到线性的超平面
尽管之前不是线性的
这就是核技巧
我们后面会讲到
所以我们只讲支持向量机的线性分类方法
也就是有监督的线性分类方法
而不是无监督的方法
我们有很多种方式来考虑这个问题
我们有很多种方式来制定训练过程
以后还会出现更多方法
现在是这个领域很激动人心的时刻
我们现在开始创建支持向量机
首先 我还要多说一句
无论你选择哪个模型
随机森林 支持向量机 深度神经网络
本质上 我们是通过迭代计算来
逼近 推测我们想要得到的结果
根据学习经验推测来得到近似结果
但是我们是在逼近一个函数
我们想知道那个最优的函数是什么
这个函数表达了数据中各个变量的关系
这个函数就是一种关系 一种映射
如果我们找到了这个函数
那么我们的学习就完成了
我们就完成了从数据中的学习
所有机器学习模型从本质上讲
就是一个我们试图去逼近的函数
它的参数就是它的权重
这些参数在每次迭代中
都会通过优化方法更新
优化方法通常是梯度下降法
或者是牛顿方法 我们后面会讲
或者其他什么方法
无论它是什么 我们只是在试图逼近一个函数
这是一种思维方式
不管用的是决策森林还是什么方法
我们都是在逼近一个函数
而且只是在逼近一个函数 一个决策树
好了 我们开始创建它吧
我们首先要做的是
导入numpy库
numpy库将会帮助我们进行数学运算 矩阵计算
我们用matplotlib来画出我们的数据
所以我们首先要做的就是定义数据
我们的数据应该是这种形式
包括x y bias
这里有5个数据点 没错 5个数据点
我们有x坐标 y坐标
把bias变量放进数据中是为了后面方便
但是为了其他更重要的事
我们可以先忽略它
简单地说
我们有x y坐标
可以在图上画出这些点
每一个数据点
有一个相关的标签 一个输出标签
这些输出标签是-1或1
这个例子的前两个数据标签都是-1
后面这三个都是1
我们可以将这些点
画在2维的图像上
所以
我们将前两个用负号标记
后面三个用正号标记
把它画出来就是这个样子
我们还要做的就是
画出一个可能的超平面
这个超平面就是一条线
这只是我们简单的猜想
我们不知道它是不是最优超平面 事实上它不是
但是它就是恰好完全地分开了两类训练数据
画这条线只是为了给大家看看
只是作为一个例子
这部分就是这样
现在我们要讲一下数学
希望你准备好了
我们来看微积分
机器学习就是关于目标函数的优化
我们优化目标函数的方式是 最小化――
希望你说的是损失函数或者误差函数
这个才是正确答案
我们要最小化损失函数或者说误差函数
我们开始这一步 首先定义损失函数
在本例中 损失函数被称为hinge损失函数
hinge损失函数是支持向量机中
非常流行的一类损失函数

支持向量机所使用的分类算法
是最大间隔分类算法
我们想要最大化这个间隔
也就是两类数据间的距离
这样我们就能画出分类最好的判定边界
这个边界将两类数据分开的效果最好
hinge损失函数是这个样子的
这个是hinge损失函数的表达式
我们用字母c来表示
它有三个变量
这三个变量分别是x y和f(x)
其中x是样本数据
y是真实的标签
f(x)是预测的标签
好 这样
函数表达式就是1-y*f(x)
这个下面的小加号
意味着如果这一系列运算的结果为负
我们就把它设定为0
因为我们希望结果总是一个正数
因此 我们可以把这个公式分成两部分
变成下面这种形式
就是我鼠标指的地方
可以看到 如果y*f(x)大于等于1
那1就会减一个大于1的数
结果会变成0或者负数
因为我们希望结果是正的
所以就规定结果为0
如果y*f(x)小于1
那函数值就是一个大于0的正数
以上就是损失函数
损失函数的定义就是这样
记住 这个y和f(x)
它们两个的值是标量值 单一值
是一个数字
也正因此它俩才能相乘
我们的目标函数由损失函数构成
公式后面这里看起来有点不一样
但其实是一样的
这个1-y*
和损失函数一样
只是写法上有些不同
可以看到这里有一个∑
意味着我们要求和
需要求和的项一共有n个
n是我们数据点的个数
我们共有5个数据点
用hinge损失函数计算出每个点的损失
然后把这个损失加到一起
得到的和就代表着数据的总体损失
这只是一个数
就是一个数字
有了这些后
就可以定义我们的目标函数
这里的目标函数表达式
就是这个min λ ||w||²
这个是啥呢?
我们的目标函数表达式为
损失函数加上这个正则化项
正则化项就是有min和λ的这一项
正则化项是一个调谐旋钮
它可以告诉我们
如何能更好的拟合数据
如果正则化项过大
那么我们的模型就过度拟合训练数据了
遇到新的数据点 它可能就不那么适用
因为它过度拟合了
但是如果正则化项太小
那么模型就欠拟合了
这意味着它就过于泛化了
它会有很大的训练误差
所以我们需要完美的正则化项
使得我们的模型既能尽量的泛化
同时又能很好地拟合训练数据
这是一个平衡项
正则化项也是一个标量值
给定权重 把它平方
然后我们会用到这里的λ
把平方后的权重和λ项相乘
这就是我们的目标函数
我们的目标函数包括正则化项
和损失函数
我们把它们加在一起
我们想要做的就是优化这个目标函数
为了优化这个目标函数
我们要找到最优的正则化项
同时还要最小化损失函数
我们要做这两件事来优化目标函数
我们要用的优化方法
是梯度下降法
而梯度下降法的具体实施
则要求这两项的偏导数
我们要算正则化项的偏导数
也要算损失函数的偏导数
结果就是这个样子
根据幂函数求导法则
我们所要做的就是
将幂指数乘到系数上
然后将幂指数减去1
对于另一项
我们做同样的计算
我们对损失函数做同样的计算
得到了这个结果
它会是0或者是 -y*x
会有这两种情况
这样我们就有了两种情况
一种会出现错误分类
另一种不会出现错误分类
基本上可以说
如果我们用这些偏导数
对数据进行了错误的分类
那我们可以用某种方法来更新权重
我说的某种方法是什么意思呢?
意思是我们更新权重时
可以同时用正则化项和损失函数
因为这一项不是0
它会是-y乘以x
但是如果我们可以正确地分类
那么这一项就会变成0
所以我们不需要更新损失函数
只需要调整正则化项
顺便说一下这一项是学习速率
所以权重加上学习速率乘以正则化项
顺便说一下学习速率
是另一个帮我们控制学习速度的调谐旋钮
如果模型的学习速率过高
可能就会完全错过那个最低值
然后继续寻找
如果学习速率太低 算法收敛时间会很长
事实上它压根不会收敛
所以我们要找到最优的学习速率
以上就是函数每一项的解释
所以现在
呃……
现在我给笔记本插上电源
好 现在我们开始看代码
我们已经讲了数学部分 现在来看代码
关于代码部分
我们要初始化一个支持向量机
顺便说一下我们要用随机梯度下降法
我们要用一组权重向量
来初始化支持向量机
这些权重向量是我们要逼近的模型的参数
它有三个值
我们将这三个值都初始化为0
然后设定一个学习速率为1
设定一个叫做epochs的值
这个值代表训练数据的迭代次数
注意是整个数据集合
还有一个错误列表
用来存储我们在学习中出现的错误
基本上我们可以说 接下来就是机器学习的部分了
这里是我们刚刚讨论过的数学部分
用10行代码就能这些写出来
就是把那些公式抄过来
把它们转换成代码
我们可以看到epochs的值
被设定为10万次
错误初始化为0
我们一共有5个数据点
遍历这五个数据点
这五个数据点要进行10万次迭代
然后我们就有了第一类情况
即有错误分类的情况
在有错误分类的情况下
我们来看一下
y*的值小于1
这个式子用代码表示的话就是这样
y乘以 x和w的点积是否小于1
如果它小于1
那就是有被错误分类的数据
所以我们可以用上面看到的完整公式
来更新我们的权重
在更新权重时
我们要同时用到正则化项和损失函数
因为利用我们的偏导数 它的值不是0
而是-y*x
我们的偏导数就是这里的梯度
偏导数的值就是梯度值
所以我们可以沿着一个方向更新权重
沿着这个方向更新权重
会让错误最小化
这就是偏导数的作用
这样我们就更新了权重 这样做了后
因为错误增加了一个 计数加一
然而 如果我们正确地分了类
我们就可以只用正则化项来更新权重
顺便说一下 正则化项的值是1分之epochs
我可能忘记说了
正则化项的值是1除以epochs
它们俩成反比
当epochs的数值增加时
正则化项参数会减小
所以没有错误分类的更新规则就是这样
我们在更新权重时只用正则化项
好了 理解了这个
我们就可以画出图像
我们也会把这些错误分类添加到错误列表
这样就能看到错误率是如何随时间降低的
这就是机器学习的本质
我们画图时可以看到错误随着时间减少
错误值随时间降低 这正是我们想要的
这样我们就用5个数据点
完成了对模型的训练
我们现在要做的
就是画出这个模型
我们可以画出这个模型
同时加入一些测试数据
这样会出现两种情况 一种有错误分类
一种没有错误分类
根据模型分类是否正确
我们选择不同的策略来更新权重
最终目的是让这些权重达到最优值
使得错误值变得最小
上面有我们要用的公式
我们之所以要计算偏导数
是为了更好的更新权重
以优化我们的目标函数
优化过程包括两部分
一是最小化损失函数
二是优化正则化项
这样训练数据和新数据都能得到较好的拟合
这就是它的泛化性
希望我讲的足够清楚
这就是我们刚才做的
如果你能理解80%左右的内容
祝贺你自己吧 因为你是个大佬
好了 我们都是大佬
都是机器学习大佬 言归正传
我们把这些数据画出来吧
如果样本少于两个
我们要重新画一遍 这是我们之前做过的
我们再做一遍
然后我们要加入测试样本
测试样本包括两个点
这两个点都是简单的样本点
假设我们知道这些数据点的类别信息
我们把测试样本加进去
画出由训练数据得到的超平面
希望这个超平面
能把训练数据和测试数据正确分类
这些点都能正确的落在判定边界的某一侧
也即它们被正确的分类
把这些画出来后 就是图上这样
带有正号的点都落在了线的同一侧
标有负号的数据点都在线的另一侧
通过优化目标函数
我们的训练数据和测试数据
都得到了正确的分类
优化目标函数时 我们将hinge损失函数最小化
所以我们得到了最大的间隔
也就是两类数据间最大的距离
这样我们就能画出最优的超平面
我们还使用了正则化项
把正则化项放入目标函数中
从而找到了它的最优值
也正因此 我们的模型
对训练和测试数据都能很好的分类
这就简单的解释了
支持向量机的工作原理
所以
再看一下
我看一下该讲啥
好 所以梯度是一个向量
它由导数项组成
所有的微积分都涉及导数
我们之所以求导 是因为
微积分在数学中用来研究变化速率
我们想知道事物是如何改变的
而我们研究事物变化的方法
在物理学中描述运动物体时也常用到
我们通过导数
来了解物体运动的方向
我们从中推导出运动方向
在微积分中
导数有很多种表示方法
当然其中包括导数算子
但我们也会用到梯度算子
你听到的很多术语 比如梯度
还有求导这个术语
它们其实是一样的
梯度是一个向量
它是由函数偏导数构成的
这里的函数则是任何我们想要逼近的函数
这就是梯度和导数
下周的课里
我们将会讨论雅可比矩阵
它是一个一阶偏导数的矩阵
还有海塞矩阵 一个2阶偏导数的矩阵
我们用这些词汇
这些矩阵来组织和表示函数的变化
我们之所以要表示这些变化
是为了最小化损失函数
最优化目标函数
我们可以通过迭代
去逼近 去比较靠谱的猜测
最优的函数是什么
最后得到数据点之间的映射关系
好 那么
希望我讲的足够清楚
今天的课就到这
请订阅观看更多编程视频
现在我要去发明一种新型支持向量机了
谢谢观看

发表评论

译制信息
视频概述

详细介绍了支持向量机的使用场景 数学背景以及相关程序包和代码

听录译者

收集自网络

翻译译者

想念

审核员

审核员@AI

视频来源

https://www.youtube.com/watch?v=g8D5YL6cOSE

相关推荐