吴恩达机器学习笔记(6-10周)


title: 吴恩达机器学习笔记(6-10周)
date: 2019-12-04 15:49:29
categories: 人工智能
tags:

  • nlp
    cover: https://www.github.com/OneJane/blog/raw/master/小书匠/4f4d553f0840517762a9237a83cb946e_hd.jpg

吴恩达机器学习笔记

文章目录

    • 应用机器学习的建议(Advice for Applying Machine Learning)
      • 决定下一步做什么
      • 评估一个假设
      • 模型选择和交叉验证集
      • 诊断偏差和方差
      • 正则化和偏差/方差
      • 学习曲线
      • 决定下一步做什么
    • 机器学习系统的设计(Machine Learning System Design)
      • 首先要做什么
      • 误差分析
      • 类偏斜的误差度量
      • 查准率和查全率之间的权衡
      • 机器学习的数据
    • 支持向量机(Support Vector Machines)
      • 优化目标
      • 大边界的直观理解
      • 大边界分类背后的数学(选修)
      • 核函数1
      • 核函数2
      • 使用支持向量机
    • 聚类(Clustering)
      • 无监督学习:简介
      • K-均值算法
      • 优化目标
      • 随机初始化
      • 选择聚类数
    • 降维(Dimensionality Reduction)
      • 动机一:数据压缩
      • 动机二:数据可视化
      • 主成分分析问题
      • 主成分分析算法
      • 选择主成分的数量
      • 重建的压缩表示
      • 主成分分析法的应用建议
    • 异常检测(Anomaly Detection)
      • 问题的动机
      • 高斯分布
      • 算法
      • 开发和评价一个异常检测系统
      • 异常检测与监督学习对比
      • 选择特征
      • 多元高斯分布(选修)
      • 使用多元高斯分布进行异常检测(可选)
    • 推荐系统(Recommender Systems)
      • 问题形式化
      • 基于内容的推荐系统
      • 协同过滤
      • 协同过滤算法
      • 向量化:低秩矩阵分解
      • 推行工作上的细节:均值归一化
    • 大规模机器学习(Large Scale Machine Learning)
      • 大型数据集的学习
      • 随机梯度下降法
      • 小批量梯度下降
      • 随机梯度下降收敛
      • 在线学习
      • 映射化简和数据并行
    • 应用实例:图片文字识别(Application Example: Photo OCR)
      • 问题描述和流程图
      • 滑动窗口
      • 获取大量数据和人工数据
      • 上限分析:哪部分管道的接下去做

应用机器学习的建议(Advice for Applying Machine Learning)

决定下一步做什么

参考视频: 10 - 1 - Deciding What to Try Next (6 min).mkv

到目前为止,我们已经介绍了许多不同的学习算法,如果你一直跟着这些视频的进度学习,你会发现自己已经不知不觉地成为一个了解许多先进机器学习技术的专家了。

然而,在懂机器学习的人当中依然存在着很大的差距,一部分人确实掌握了怎样高效有力地运用这些学习算法。而另一些人他们可能对我马上要讲的东西,就不是那么熟悉了。他们可能没有完全理解怎样运用这些算法。因此总是把时间浪费在毫无意义的尝试上。我想做的是确保你在设计机器学习的系统时,你能够明白怎样选择一条最合适、最正确的道路。因此,在这节视频和之后的几段视频中,我将向你介绍一些实用的建议和指导,帮助你明白怎样进行选择。具体来讲,我将重点关注的问题是假如你在开发一个机器学习系统,或者想试着改进一个机器学习系统的性能,你应如何决定接下来应该选择哪条道路?为了解释这一问题,我想仍然使用预测房价的学习例子,假如你已经完成了正则化线性回归,也就是最小化代价函数$J$的值,假如,在你得到你的学习参数以后,如果你要将你的假设函数放到一组新的房屋样本上进行测试,假如说你发现在预测房价时产生了巨大的误差,现在你的问题是要想改进这个算法,接下来应该怎么办?

实际上你可以想出很多种方法来改进这个算法的性能,其中一种办法是使用更多的训练样本。具体来讲,也许你能想到通过电话调查或上门调查来获取更多的不同的房屋出售数据。遗憾的是,我看到好多人花费了好多时间想收集更多的训练样本。他们总认为,要是我有两倍甚至十倍数量的训练数据,那就一定会解决问题的是吧?但有时候获得更多的训练数据实际上并没有作用。在接下来的几段视频中,我们将解释原因。

我们也将知道怎样避免把过多的时间浪费在收集更多的训练数据上,这实际上是于事无补的。另一个方法,你也许能想到的是尝试选用更少的特征集。因此如果你有一系列特征比如$x_1,x_2,x_3$等等。也许有很多特征,也许你可以花一点时间从这些特征中仔细挑选一小部分来防止过拟合。或者也许你需要用更多的特征,也许目前的特征集,对你来讲并不是很有帮助。你希望从获取更多特征的角度来收集更多的数据,同样地,你可以把这个问题扩展为一个很大的项目,比如使用电话调查来得到更多的房屋案例,或者再进行土地测量来获得更多有关,这块土地的信息等等,因此这是一个复杂的问题。同样的道理,我们非常希望在花费大量时间完成这些工作之前,我们就能知道其效果如何。我们也可以尝试增加多项式特征的方法,比如$x_1$的平方,$x_2$的平方,$x_1,x_2$的乘积,我们可以花很多时间来考虑这一方法,我们也可以考虑其他方法减小或增大正则化参数$\lambda$的值。我们列出的这个单子,上面的很多方法都可以扩展开来扩展成一个六个月或更长时间的项目。遗憾的是,大多数人用来选择这些方法的标准是凭感觉的,也就是说,大多数人的选择方法是随便从这些方法中选择一种,比如他们会说“噢,我们来多找点数据吧”,然后花上六个月的时间收集了一大堆数据,然后也许另一个人说:“好吧,让我们来从这些房子的数据中多找点特征吧”。我很遗憾不止一次地看到很多人花了至少六个月时间来完成他们随便选择的一种方法,而在六个月或者更长时间后,他们很遗憾地发现自己选择的是一条不归路。幸运的是,有一系列简单的方法能让你事半功倍,排除掉单子上的至少一半的方法,留下那些确实有前途的方法,同时也有一种很简单的方法,只要你使用,就能很轻松地排除掉很多选择,从而为你节省大量不必要花费的时间。最终达到改进机器学习系统性能的目的假设我们需要用一个线性回归模型来预测房价,当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么?
  1. 获得更多的训练样本——通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。

  2. 尝试减少特征的数量

  3. 尝试获得更多的特征

  4. 尝试增加多项式特征

  5. 尝试减少正则化程度 λ \lambda λ

  6. 尝试增加正则化程度 λ \lambda λ

    我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的。
    

    在接下来的两段视频中,我首先介绍怎样评估机器学习算法的性能,然后在之后的几段视频中,我将开始讨论这些方法,它们也被称为"机器学习诊断法"。“诊断法”的意思是:这是一种测试法,你通过执行这种测试,能够深入了解某种算法到底是否有用。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试,才是有意义的。在这一系列的视频中我们将介绍具体的诊断法,但我要提前说明一点的是,这些诊断法的执行和实现,是需要花些时间的,有时候确实需要花很多时间来理解和实现,但这样做的确是把时间用在了刀刃上,因为这些方法让你在开发学习算法时,节省了几个月的时间,因此,在接下来几节课中,我将先来介绍如何评价你的学习算法。在此之后,我将介绍一些诊断法,希望能让你更清楚。在接下来的尝试中,如何选择更有意义的方法。

评估一个假设

参考视频: 10 - 2 - Evaluating a Hypothesis (8 min).mkv

在本节视频中我想介绍一下怎样用你学过的算法来评估假设函数。在之后的课程中,我们将以此为基础来讨论如何避免过拟合和欠拟合的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ycgFySW8-1575448595910)(https://www.github.com/OneJane/blog/raw/master/小书匠/f49730be98810b869951bbe38b6319ba.png)]

当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化,有人认为得到一个非常小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差,并不能说明它就一定是一个好的假设函数。而且我们也学习了过拟合假设函数的例子,所以这推广到新的训练集上是不适用的。

那么,你该如何判断一个假设函数是过拟合的呢?对于这个简单的例子,我们可以对假设函数$h(x)$进行画图,然后观察图形趋势,但对于特征变量不止一个的这种一般情况,还有像有很多特征变量的问题,想要通过画出假设函数来进行观察,就会变得很难甚至是不可能实现。

因此,我们需要另一种方法来评估我们的假设函数过拟合检验。

为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAiiQAHo-1575448595911)(https://www.github.com/OneJane/blog/raw/master/小书匠/9c769fd59c8a9c9f92200f538d1ab29c.png)]

测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
  1. 对于线性回归模型,我们利用测试集数据计算代价函数 J J J

  2. 对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:

KaTeX parse error: Expected group after '_' at position 48: …{m}_{test}}\sum_̲\limits{i=1}^{m…

误分类的比率,对于每一个测试集样本,计算:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkEwwuJB-1575448595911)(https://www.github.com/OneJane/blog/raw/master/小书匠/751e868bebf4c0bf139db173d25e8ec4.png)]

然后对计算结果求平均。

模型选择和交叉验证集

参考视频: 10 - 3 - Model Selection and Train_Validation_Test Sets (12 min).mkv

假设我们要在10个不同次数的二项式模型之间进行选择:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJcS9NdI-1575448595913)(https://www.github.com/OneJane/blog/raw/master/小书匠/1b908480ad78ee54ba7129945015f87f.jpg)]

显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况,我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。

即:使用60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用20%的数据作为测试集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blhs8x9U-1575448595913)(https://www.github.com/OneJane/blog/raw/master/小书匠/7cf1cd9c123a72ca4137ca515871689d.png)]
模型选择的方法为:

  1. 使用训练集训练出10个模型

  2. 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)

  3. 选取代价函数值最小的模型

  4. 用步骤3中选出的模型对测试集计算得出推广误差(代价函数的值)

    Train/validation/test error

    Training error:

KaTeX parse error: Expected group after '_' at position 37: …frac{1}{2m}\sum_̲\limits{i=1}^{m…

Cross Validation error:

KaTeX parse error: Expected group after '_' at position 39: …1}{2m_{cv}}\sum_̲\limits{i=1}^{m…

Test error:

KaTeX parse error: Expected group after '_' at position 41: …{2m_{test}}\sum_̲\limits{i=1}^{m…

诊断偏差和方差

参考视频: 10 - 4 - Diagnosing Bias vs. Variance (8 min).mkv

当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。那么这两种情况,哪个和偏差有关,哪个和方差有关,或者是不是和两个都有关?搞清楚这一点非常重要,因为能判断出现的情况是这两种情况中的哪一种。其实是一个很有效的指示器,指引着可以改进算法的最有效的方法和途径。在这段视频中,我想更深入地探讨一下有关偏差和方差的问题,希望你能对它们有一个更深入的理解,并且也能弄清楚怎样评价一个学习算法,能够判断一个算法是偏差还是方差有问题,因为这个问题对于弄清如何改进学习算法的效果非常重要,高偏差和高方差的问题基本上来说是欠拟合和过拟合的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKcmOzm8-1575448595914)(https://www.github.com/OneJane/blog/raw/master/小书匠/20c6b0ba8375ca496b7557def6c00324.jpg)]

我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图表上来帮助分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ds2hss2N-1575448595915)(https://www.github.com/OneJane/blog/raw/master/小书匠/bca6906add60245bbc24d71e22f8b836.png)]

Bias/variance

Training error: KaTeX parse error: Expected group after '_' at position 37: …frac{1}{2m}\sum_̲\limits{i=1}^{m…

Cross Validation error: KaTeX parse error: Expected group after '_' at position 39: …1}{2m_{cv}}\sum_̲\limits{i=1}^{m…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3p5FxWv5-1575448595916)(https://www.github.com/OneJane/blog/raw/master/小书匠/64ad47693447761bd005243ae7db0cca.png)]

对于训练集,当 $d$ 较小时,模型拟合程度更低,误差较大;随着 $d$ 的增长,拟合程度提高,误差减小。

对于交叉验证集,当 $d$ 较小时,模型拟合程度低,误差较大;但是随着 $d$ 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。

如果我们的交叉验证集误差较大,我们如何判断是方差还是偏差呢?根据上面的图表,我们知道:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zdyZtdB8-1575448595916)(https://www.github.com/OneJane/blog/raw/master/小书匠/25597f0f88208a7e74a3ca028e971852.png)]

训练集误差和交叉验证集误差近似时:偏差/欠拟合

交叉验证集误差远大于训练集误差时:方差/过拟合

正则化和偏差/方差

参考视频: 10 - 5 - Regularization and Bias_Variance (11 min).mkv

在我们在训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是我们可能会正则化的程度太高或太小了,即我们在选择λ的值时也需要思考与刚才选择多项式模型次数类似的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Qdp0zUg-1575448595917)(https://www.github.com/OneJane/blog/raw/master/小书匠/2ba317c326547f5b5313489a3f0d66ce.png)]

我们选择一系列的想要测试的 λ 值,通常是 0-10之间的呈现2倍关系的值(如:$0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10$共12个)。 我们同样把数据分为训练集、交叉验证集和测试集。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cNm2h55K-1575448595918)(https://www.github.com/OneJane/blog/raw/master/小书匠/8f557105250853e1602a78c99b2ef95b.png)]

选择 λ \lambda λ的方法为:

  1. 使用训练集训练出12个不同程度正则化的模型
  2. 用12个模型分别对交叉验证集计算的出交叉验证误差
  3. 选择得出交叉验证误差最小的模型
  4. 运用步骤3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GvQC678i-1575448595918)(https://www.github.com/OneJane/blog/raw/master/小书匠/38eed7de718f44f6bb23727c5a88bf5d.png)]

• 当 λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大

• 随着 λ的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加

学习曲线

参考视频: 10 - 6 - Learning Curves (12 min).mkv

学习曲线就是一种很好的工具,我经常使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的**合理检验**(**sanity check**)。学习曲线是将训练集误差和交叉验证集误差作为训练集样本数量($m$)的函数绘制的图表。

即,如果我们有100行数据,我们从1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OWKBB4Y-1575448595919)(https://www.github.com/OneJane/blog/raw/master/小书匠/969281bc9b07e92a0052b17288fb2c52.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymhYQjJA-1575448595919)(https://www.github.com/OneJane/blog/raw/master/小书匠/973216c7b01c910cfa1454da936391c6.png)]

如何利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azGmjIOG-1575448595921)(https://www.github.com/OneJane/blog/raw/master/小书匠/4a5099b9f4b6aac5785cb0ad05289335.jpg)]

也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。

如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VuBIfpLK-1575448595921)(https://www.github.com/OneJane/blog/raw/master/小书匠/2977243994d8d28d5ff300680988ec34.jpg)]

也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。

决定下一步做什么

参考视频: 10 - 7 - Deciding What to Do Next Revisited (7 min).mkv

我们已经介绍了怎样评价一个学习算法,我们讨论了模型选择问题,偏差和方差的问题。那么这些诊断法则怎样帮助我们判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的呢?

让我们再次回到最开始的例子,在那里寻找答案,这就是我们之前的例子。回顾 1.1 中提出的六种可选的下一步,让我们来看一看我们在什么情况下应该怎样选择:
  1. 获得更多的训练样本——解决高方差

  2. 尝试减少特征的数量——解决高方差

  3. 尝试获得更多的特征——解决高偏差

  4. 尝试增加多项式特征——解决高偏差

  5. 尝试减少正则化程度λ——解决高偏差

  6. 尝试增加正则化程度λ——解决高方差

神经网络的方差和偏差:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Khr0Adni-1575448595922)(https://www.github.com/OneJane/blog/raw/master/小书匠/c5cd6fa2eb9aea9c581b2d78f2f4ea57.png)]

使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。

通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。

对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络,

然后选择交叉验证集代价最小的神经网络。

好的,以上就是我们介绍的偏差和方差问题,以及诊断该问题的学习曲线方法。在改进学习算法的表现时,你可以充分运用以上这些内容来判断哪些途径可能是有帮助的。而哪些方法可能是无意义的。如果你理解了以上几节视频中介绍的内容,并且懂得如何运用。那么你已经可以使用机器学习方法有效的解决实际问题了。你也能像硅谷的大部分机器学习从业者一样,他们每天的工作就是使用这些学习算法来解决众多实际问题。我希望这几节中提到的一些技巧,关于方差、偏差,以及学习曲线为代表的诊断法能够真正帮助你更有效率地应用机器学习,让它们高效地工作。

机器学习系统的设计(Machine Learning System Design)

首先要做什么

参考视频: 11 - 1 - Prioritizing What to Work On (10 min).mkv

在接下来的视频中,我将谈到机器学习系统的设计。这些视频将谈及在设计复杂的机器学习系统时,你将遇到的主要问题。同时我们会试着给出一些关于如何巧妙构建一个复杂的机器学习系统的建议。下面的课程的的数学性可能不是那么强,但是我认为我们将要讲到的这些东西是非常有用的,可能在构建大型的机器学习系统时,节省大量的时间。

本周以一个垃圾邮件分类器算法为例进行讨论。

为了解决这样一个问题,我们首先要做的决定是如何选择并表达特征向量$x$。我们可以选择一个由100个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0),尺寸为100×1。

为了构建这个分类器算法,我们可以做很多事,例如:

  1. 收集更多的数据,让我们有更多的垃圾邮件和非垃圾邮件的样本

  2. 基于邮件的路由信息开发一系列复杂的特征

  3. 基于邮件的正文信息开发一系列复杂的特征,包括考虑截词的处理

  4. 为探测刻意的拼写错误(把watch 写成w4tch)开发复杂的算法

    在上面这些选项中,非常难决定应该在哪一项上花费时间和精力,作出明智的选择,比随着感觉走要更好。当我们使用机器学习时,总是可以“头脑风暴”一下,想出一堆方法来试试。实际上,当你需要通过头脑风暴来想出不同方法来尝试去提高精度的时候,你可能已经超越了很多人了。大部分人并不尝试着列出可能的方法,他们做的只是某天早上醒来,因为某些原因有了一个突发奇想:"让我们来试试用**Honey Pot**项目收集大量的数据吧。"
    
    我们将在随后的课程中讲误差分析,我会告诉你怎样用一个更加系统性的方法,从一堆不同的方法中,选取合适的那一个。因此,你更有可能选择一个真正的好方法,能让你花上几天几周,甚至是几个月去进行深入的研究。
    

误差分析

参考视频: 11 - 2 - Error Analysis (13 min).mkv

在本次课程中,我们将会讲到误差分析(**Error Analysis**)的概念。这会帮助你更系统地做出决定。如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量;而是构建一个简单的算法,这样你可以很快地实现它。

每当我研究机器学习的问题时,我最多只会花一天的时间,就是字面意义上的24小时,来试图很快的把结果搞出来,即便效果不好。坦白的说,就是根本没有用复杂的系统,但是只是很快的得到的结果。即便运行得不完美,但是也把它运行一遍,最后通过交叉验证来检验数据。一旦做完,你可以画出学习曲线,通过画出学习曲线,以及检验误差,来找出你的算法是否有高偏差和高方差的问题,或者别的问题。在这样分析之后,再来决定用更多的数据训练,或者加入更多的特征变量是否有用。这么做的原因是:这在你刚接触机器学习问题时是一个很好的方法,你并不能提前知道你是否需要复杂的特征变量,或者你是否需要更多的数据,还是别的什么。提前知道你应该做什么,是非常难的,因为你缺少证据,缺少学习曲线。因此,你很难知道你应该把时间花在什么地方来提高算法的表现。但是当你实践一个非常简单即便不完美的方法时,你可以通过画出学习曲线来做出进一步的选择。你可以用这种方式来避免一种电脑编程里的过早优化问题,这种理念是:我们必须用证据来领导我们的决策,怎样分配自己的时间来优化算法,而不是仅仅凭直觉,凭直觉得出的东西一般总是错误的。除了画出学习曲线之外,一件非常有用的事是误差分析,我的意思是说:当我们在构造垃圾邮件分类器时,我会看一看我的交叉验证数据集,然后亲自看一看哪些邮件被算法错误地分类。因此,通过这些被算法错误分类的垃圾邮件与非垃圾邮件,你可以发现某些系统性的规律:什么类型的邮件总是被错误分类。经常地这样做之后,这个过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它。

构建一个学习算法的推荐方法为:

1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法

2.绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择

3.进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的样本,看看这些样本是否有某种系统化的趋势

以我们的垃圾邮件过滤器为例,误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看:是否能将这些邮件按照类分组。例如医药品垃圾邮件,仿冒品垃圾邮件或者密码窃取邮件等。然后看分类器对哪一组邮件的预测误差最大,并着手优化。

思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。

例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。

误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。

在我们的垃圾邮件分类器例子中,对于“我们是否应该将**discount/discounts/discounted/discounting**处理成同一个词?”如果这样做可以改善我们算法,我们会采用一些截词软件。误差分析不能帮助我们做出这类判断,我们只能尝试采用和不采用截词软件这两种不同方案,然后根据数值检验的结果来判断哪一种更好。

因此,当你在构造学习算法的时候,你总是会去尝试很多新的想法,实现出很多版本的学习算法,如果每一次你实践新想法的时候,你都要手动地检测这些例子,去看看是表现差还是表现好,那么这很难让你做出决定。到底是否使用词干提取,是否区分大小写。但是通过一个量化的数值评估,你可以看看这个数字,误差是变大还是变小了。你可以通过它更快地实践你的新想法,它基本上非常直观地告诉你:你的想法是提高了算法表现,还是让它变得更坏,这会大大提高你实践算法时的速度。所以我强烈推荐在交叉验证集上来实施误差分析,而不是在测试集上。但是,还是有一些人会在测试集上来做误差分析。即使这从数学上讲是不合适的。所以我还是推荐你在交叉验证向量上来做误差分析。

总结一下,当你在研究一个新的机器学习问题时,我总是推荐你实现一个较为简单快速、即便不是那么完美的算法。我几乎从未见过人们这样做。大家经常干的事情是:花费大量的时间在构造算法上,构造他们以为的简单的方法。因此,不要担心你的算法太简单,或者太不完美,而是尽可能快地实现你的算法。当你有了初始的实现之后,它会变成一个非常有力的工具,来帮助你决定下一步的做法。因为我们可以先看看算法造成的错误,通过误差分析,来看看他犯了什么错,然后来决定优化的方式。另一件事是:假设你有了一个快速而不完美的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么误差分析可以帮助我们系统化地选择该做什么。

类偏斜的误差度量

参考视频: 11 - 3 - Error Metrics for Skewed Classes (12 min).mkv

在前面的课程中,我提到了误差分析,以及设定误差度量值的重要性。那就是,设定某个实数来评估你的学习算法,并衡量它的表现,有了算法的评估和误差度量值。有一件重要的事情要注意,就是使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。类偏斜情况表现为我们的训练集中有非常多的同一种类的样本,只有很少或没有其他类的样本。

例如我们希望用算法来预测癌症是否是恶性的,在我们的训练集中,只有0.5%的实例是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有0.5%。然而我们通过训练而得到的神经网络算法却有1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。

**查准率**(**Precision**)和**查全率**(**Recall**) 我们将算法预测的结果分成四种情况:

1. **正确肯定**(**True Positive,TP**):预测为真,实际为真

2.**正确否定**(**True Negative,TN**):预测为假,实际为假

3.**错误肯定**(**False Positive,FP**):预测为真,实际为假

4.**错误否定**(**False Negative,FN**):预测为假,实际为真

则:查准率=**TP/(TP+FP)**。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。

查全率=**TP/(TP+FN)**。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。

这样,对于我们刚才那个总是预测病人肿瘤为良性的算法,其查全率是0。
预测值
Positive Negtive
实际值 Positive TP FN
Negtive FP TN

查准率和查全率之间的权衡

参考视频: 11 - 4 - Trading Off Precision and Recall (14 min).mkv

在之前的课程中,我们谈到查准率和召回率,作为遇到偏斜类问题的评估度量值。在很多应用中,我们希望能够保证查准率和召回率的相对平衡。

在这节课中,我将告诉你应该怎么做,同时也向你展示一些查准率和召回率作为算法评估度量值的更有效的方式。继续沿用刚才预测肿瘤性质的例子。假使,我们的算法输出的结果在0-1 之间,我们使用阀值0.5 来预测真和假。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jw5V3DIz-1575448595923)(https://www.github.com/OneJane/blog/raw/master/小书匠/ad00c2043ab31f32deb2a1eb456b7246.png)]

查准率**(Precision)=TP/(TP+FP)**

例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。

查全率**(Recall)=TP/(TP+FN)**例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。

如果我们希望只在非常确信的情况下预测为真(肿瘤为恶性),即我们希望更高的查准率,我们可以使用比0.5更大的阀值,如0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。

如果我们希望提高查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比0.5更小的阀值,如0.3。

我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4eJwO6A4-1575448595924)(https://www.github.com/OneJane/blog/raw/master/小书匠/84067e23f2ab0423679379afc6ed6caf.png)]

我们希望有一个帮助我们选择这个阀值的方法。一种方法是计算**F1 值**(**F1 Score**),其计算公式为:

F 1 S c o r e : 2 P R P + R {{F}_{1}}Score:2\frac{PR}{P+R} F1Score:2P+RPR

我们选择使得F1值最高的阀值。

机器学习的数据

参考视频: 11 - 5 - Data For Machine Learning (11 min).mkv

在之前的视频中,我们讨论了评价指标。在这个视频中,我要稍微转换一下,讨论一下机器学习系统设计中另一个重要的方面,这往往涉及到用来训练的数据有多少。在之前的一些视频中,我曾告诫大家不要盲目地开始,而是花大量的时间来收集大量的数据,因为数据有时是唯一能实际起到作用的。但事实证明,在一定条件下,我会在这个视频里讲到这些条件是什么。得到大量的数据并在某种类型的学习算法中进行训练,可以是一种有效的方法来获得一个具有良好性能的学习算法。而这种情况往往出现在这些条件对于你的问题都成立。

并且你能够得到大量数据的情况下。这可以是一个很好的方式来获得非常高性能的学习算法。因此,在这段视频中,让我们一起讨论一下这个问题。

很多很多年前,我认识的两位研究人员**Michele Banko** 和**Eric Brill**进行了一项有趣的研究,他们尝试通过机器学习算法来区分常见的易混淆的单词,他们尝试了许多种不同的算法,并发现数据量非常大时,这些不同类型的算法效果都很好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cjomHXeP-1575448595925)(https://www.github.com/OneJane/blog/raw/master/小书匠/1a7c575dc1b606b8e6e4de71a14dc005.png)]

比如,在这样的句子中:早餐我吃了__个鸡蛋(**to**,**two**,**too**),在这个例子中,“早餐我吃了2个鸡蛋”,这是一个易混淆的单词的例子。于是他们把诸如这样的机器学习问题,当做一类监督学习问题,并尝试将其分类,什么样的词,在一个英文句子特定的位置,才是合适的。他们用了几种不同的学习算法,这些算法都是在他们2001年进行研究的时候,都已经被公认是比较领先的。因此他们使用了一个方差,用于逻辑回归上的一个方差,被称作"感知器"(**perceptron**)。他们也采取了一些过去常用,但是现在比较少用的算法,比如 **Winnow**算法,很类似于回归问题,但在一些方面又有所不同,过去用得比较多,但现在用得不太多。还有一种基于内存的学习算法,现在也用得比较少了,但是我稍后会讨论一点,而且他们用了一个朴素算法。这些具体算法的细节不那么重要,我们下面希望探讨,什么时候我们会希望获得更多数据,而非修改算法。他们所做的就是改变了训练数据集的大小,并尝试将这些学习算法用于不同大小的训练数据集中,这就是他们得到的结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeO9dmFK-1575448595926)(https://www.github.com/OneJane/blog/raw/master/小书匠/befe860fd4b1aef2f6eebf617baf5877.jpg)]

这些趋势非常明显,首先大部分算法,都具有相似的性能,其次,随着训练数据集的增大,在横轴上代表以百万为单位的训练集大小,从0.1个百万到1000百万,也就是到了10亿规模的训练集的样本,这些算法的性能也都对应地增强了。

事实上,如果你选择任意一个算法,可能是选择了一个"劣等的"算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会其他算法更好,甚至会比"优等算法"更好。由于这项原始的研究非常具有影响力,因此已经有一系列许多不同的研究显示了类似的结果。这些结果表明,许多不同的学习算法有时倾向于表现出非常相似的表现,这还取决于一些细节,但是真正能提高性能的,是你能够给一个算法大量的训练数据。像这样的结果,引起了一种在机器学习中的普遍共识:"取得成功的人不是拥有最好算法的人,而是拥有最多数据的人"。

那么这种说法在什么时候是真,什么时候是假呢?因为如果我们有一个学习算法,并且如果这种说法是真的,那么得到大量的数据通常是保证我们具有一个高性能算法的最佳方式,而不是去争辩应该用什么样的算法。

假如有这样一些假设,在这些假设下有大量我们认为有用的训练集,我们假设在我们的机器学习问题中,特征值$x$包含了足够的信息,这些信息可以帮助我们用来准确地预测$y$,例如,如果我们采用了一些容易混淆的词,如:**two**、**to**、**too**,假如说它能够描述$x$,捕捉到需要填写的空白处周围的词语,那么特征捕捉到之后,我们就希望有对于“早饭我吃了__鸡蛋”,那么这就有大量的信息来告诉我中间我需要填的词是“两个”(**two**),而不是单词 **to** 或**too**,因此特征捕捉,哪怕是周围词语中的一个词,就能够给我足够的信息来确定出标签 $y$是什么。换句话说,从这三组易混淆的词中,我应该选什么词来填空。

那么让我们来看一看,大量的数据是有帮助的情况。假设特征值有足够的信息来预测$y$值,假设我们使用一种需要大量参数的学习算法,比如有很多特征的逻辑回归或线性回归,或者用带有许多隐藏单元的神经网络,那又是另外一种带有很多参数的学习算法,这些都是非常强大的学习算法,它们有很多参数,这些参数可以拟合非常复杂的函数,因此我要调用这些,我将把这些算法想象成低偏差算法,因为我们能够拟合非常复杂的函数,而且因为我们有非常强大的学习算法,这些学习算法能够拟合非常复杂的函数。很有可能,如果我们用这些数据运行这些算法,这种算法能很好地拟合训练集,因此,训练误差就会很低了。

现在假设我们使用了非常非常大的训练集,在这种情况下,尽管我们希望有很多参数,但是如果训练集比参数的数量还大,甚至是更多,那么这些算法就不太可能会过度拟合。也就是说训练误差有希望接近测试误差。

另一种考虑这个问题的角度是为了有一个高性能的学习算法,我们希望它不要有高的偏差和方差。

因此偏差问题,我么将通过确保有一个具有很多参数的学习算法来解决,以便我们能够得到一个较低偏差的算法,并且通过用非常大的训练集来保证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9NgC9fs5-1575448595926)(https://www.github.com/OneJane/blog/raw/master/小书匠/05a3c884505e08028d37a04472d0964a.png)]

我们在此没有方差问题,我们的算法将没有方差,并且通过将这两个值放在一起,我们最终可以得到一个低误差和低方差的学习算法。这使得我们能够很好地测试测试数据集。从根本上来说,这是一个关键的假设:特征值有足够的信息量,且我们有一类很好的函数,这是为什么能保证低误差的关键所在。它有大量的训练数据集,这能保证得到更多的方差值,因此这给我们提出了一些可能的条件,如果你有大量的数据,而且你训练了一种带有很多参数的学习算法,那么这将会是一个很好的方式,来提供一个高性能的学习算法。

我觉得关键的测试:首先,一个人类专家看到了特征值 $x$,能很有信心的预测出$y$值吗?因为这可以证明 $ y$ 可以根据特征值$x$被准确地预测出来。其次,我们实际上能得到一组庞大的训练集,并且在这个训练集中训练一个有很多参数的学习算法吗?如果你不能做到这两者,那么更多时候,你会得到一个性能很好的学习算法。

支持向量机(Support Vector Machines)

优化目标

参考视频: 12 - 1 - Optimization Objective (15 min).mkv

到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的水平。比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。因此,在接下来的视频中,我会探讨这一算法。在稍后的课程中,我也会对监督学习算法进行简要的总结。当然,仅仅是作简要描述。但对于支持向量机,鉴于该算法的强大和受欢迎度,在本课中,我会花许多时间来讲解它。它也是我们所介绍的最后一个监督学习算法。

正如我们之前开发的学习算法,我们从优化目标开始。那么,我们开始学习这个算法。为了描述支持向量机,事实上,我将会从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rpf3IVoW-1575448595927)(https://www.github.com/OneJane/blog/raw/master/小书匠/3d12b07f13a976e916d0c707fd03153c.png)]
那么,在逻辑回归中我们已经熟悉了这里的假设函数形式,和右边的S型激励函数。然而,为了解释一些数学知识.我将用 z z z 表示 θ T x \theta^Tx θTx

现在考虑下我们想要逻辑回归做什么:如果有一个 y = 1 y=1 y=1的样本,我的意思是不管是在训练集中或是在测试集中,又或者在交叉验证集中,总之是 y = 1 y=1 y=1,现在我们希望 h θ ( x ) {{h}_{\theta }}\left( x \right) hθ(x) 趋近1。因为我们想要正确地将此样本分类,这就意味着当 h θ ( x ) {{h}_{\theta }}\left( x \right) hθ(x)趋近于1时, θ T x \theta^Tx θTx 应当远大于0,这里的 > > >> >>意思是远远大于0。这是因为由于 z z z 表示 θ T x \theta^Tx θTx,当 z z z远大于0时,即到了该图的右边,你不难发现此时逻辑回归的输出将趋近于1。相反地,如果我们有另一个样本,即 y = 0 y=0 y=0。我们希望假设函数的输出值将趋近于0,这对应于 θ T x \theta^Tx θTx,或者就是 z z z 会远小于0,因为对应的假设函数的输出值趋近0。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bPjsPKot-1575448595928)(https://www.github.com/OneJane/blog/raw/master/小书匠/66facb7fa8eddc3a860e420588c981d5.png)]
如果你进一步观察逻辑回归的代价函数,你会发现每个样本 ( x , y ) (x,y) (x,y)都会为总代价函数,增加这里的一项,因此,对于总代价函数通常会有对所有的训练样本求和,并且这里还有一个 1 / m 1/m 1/m项,但是,在逻辑回归中,这里的这一项就是表示一个训练样本所对应的表达式。现在,如果我将完整定义的假设函数代入这里。那么,我们就会得到每一个训练样本都影响这一项。

现在,先忽略 1 / m 1/m 1/m 这一项,但是这一项是影响整个总代价函数中的这一项的。

现在,一起来考虑两种情况:

一种是 y y y等于1的情况;另一种是 y y y 等于0的情况。

在第一种情况中,假设 y = 1 y=1 y=1 ,此时在目标函数中只需有第一项起作用,因为 y = 1 y=1 y=1时, ( 1 − y ) (1-y) (1y)项将等于0。因此,当在 y = 1 y=1 y=1 的样本中时,即在 $(x, y) $中 ,我们得到 y = 1 y=1 y=1 − log ⁡ ( 1 − 1 1 + e − z ) -\log(1-\frac{1}{1+e^{-z}}) log(11+ez1)这样一项,这里同上一张幻灯片一致。

我用 z z z 表示 θ T x \theta^Tx θTx,即: z = θ T x z= \theta^Tx z=θTx。当然,在代价函数中, y y y 前面有负号。我们只是这样表示,如果 y = 1 y=1 y=1 代价函数中,这一项也等于1。这样做是为了简化此处的表达式。如果画出关于 z z z 的函数,你会看到左下角的这条曲线,我们同样可以看到,当 z z z 增大时,也就是相当于 θ T x \theta^Tx θTx增大时, z z z 对应的值会变的非常小。对整个代价函数而言,影响也非常小。这也就解释了,为什么逻辑回归在观察到正样本 y = 1 y=1 y=1时,试图将 θ T x \theta^Tx θTx设置得非常大。因为,在代价函数中的这一项会变的非常小。

现在开始建立支持向量机,我们从这里开始:

我们会从这个代价函数开始,也就是 − log ⁡ ( 1 − 1 1 + e − z ) -\log(1-\frac{1}{1+e^{-z}}) log(11+ez1)一点一点修改,让我取这里的 z = 1 z=1 z=1 点,我先画出将要用的代价函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-243GMwAq-1575448595928)(https://www.github.com/OneJane/blog/raw/master/小书匠/b4b43ee98bff9f5e73d841af1fa316bf.png)]
新的代价函数将会水平的从这里到右边(图外),然后我再画一条同逻辑回归非常相似的直线,但是,在这里是一条直线,也就是我用紫红色画的曲线,就是这条紫红色的曲线。那么,到了这里已经非常接近逻辑回归中使用的代价函数了。只是这里是由两条线段组成,即位于右边的水平部分和位于左边的直线部分,先别过多的考虑左边直线部分的斜率,这并不是很重要。但是,这里我们将使用的新的代价函数,是在 y = 1 y=1 y=1的前提下的。你也许能想到,这应该能做同逻辑回归中类似的事情,但事实上,在之后的优化问题中,这会变得更坚定,并且为支持向量机,带来计算上的优势。例如,更容易计算股票交易的问题等等。

目前,我们只是讨论了 y = 1 y=1 y=1的情况,另外一种情况是当 y = 0 y=0 y=0时,此时如果你仔细观察代价函数只留下了第二项,因为第一项被消除了。如果当 y = 0 y=0 y=0时,那么这一项也就是0了。所以上述表达式只留下了第二项。因此,这个样本的代价或是代价函数的贡献。将会由这一项表示。并且,如果你将这一项作为 z z z的函数,那么,这里就会得到横轴 z z z。现在,你完成了支持向量机中的部分内容,同样地,我们要替代这一条蓝色的线,用相似的方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNrPATgQ-1575448595929)(https://www.github.com/OneJane/blog/raw/master/小书匠/ab372c9161375a4f7b6f0bd4a69560e9.png)]
如果我们用一个新的代价函数来代替,即这条从0点开始的水平直线,然后是一条斜线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),同时,右边函数我称它为 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z)。这里的下标是指在代价函数中,对应的 y = 1 y=1 y=1 y = 0 y=0 y=0 的情况,拥有了这些定义后,现在,我们就开始构建支持向量机。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D2oTvtLj-1575448595929)(https://www.github.com/OneJane/blog/raw/master/小书匠/59541ab1fda4f92d6f1b508c8e29ab1c.png)]
这是我们在逻辑回归中使用代价函数 J ( θ ) J(\theta) J(θ)。也许这个方程看起来不是非常熟悉。这是因为之前有个负号在方程外面,但是,这里我所做的是,将负号移到了表达式的里面,这样做使得方程看起来有些不同。对于支持向量机而言,实质上我们要将这替换为 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),也就是 cos ⁡ t 1 ( θ T x ) {\cos}t_1{(\theta^Tx)} cost1(θTx),同样地,我也将这一项替换为 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),也就是代价 cos ⁡ t 0 ( θ T x ) {\cos}t_0{(\theta^Tx)} cost0(θTx)。这里的代价函数 cos ⁡ t 1 {\cos}t_1 cost1,就是之前所提到的那条线。此外,代价函数 cos ⁡ t 0 {\cos}t_0 cost0,也是上面所介绍过的那条线。因此,对于支持向量机,我们得到了这里的最小化问题,即:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Pe1tj9t-1575448595930)(https://www.github.com/OneJane/blog/raw/master/小书匠/4ac1ca54cb0f2c465ab81339baaf9186.png)]
然后,再加上正则化参数。现在,按照支持向量机的惯例,事实上,我们的书写会稍微有些不同,代价函数的参数表示也会稍微有些不同。

首先,我们要除去 1 / m 1/m 1/m这一项,当然,这仅仅是由于人们使用支持向量机时,对比于逻辑回归而言,不同的习惯所致,但这里我所说的意思是:你知道,我将要做的是仅仅除去 1 / m 1/m 1/m这一项,但是,这也会得出同样的 θ {{\theta }} θ 最优值,好的,因为 1 / m 1/m 1/m 仅是个常量,因此,你知道在这个最小化问题中,无论前面是否有 1 / m 1/m 1/m 这一项,最终我所得到的最优值 θ {{\theta }} θ都是一样的。这里我的意思是,先给你举一个样本,假定有一最小化问题:即要求当 ( u − 5 ) 2 + 1 (u-5)^2+1 (u5)2+1取得最小值时的 u u u值,这时最小值为:当 u = 5 u=5 u=5时取得最小值。

现在,如果我们想要将这个目标函数乘上常数10,这里我的最小化问题就变成了:求使得 10 × ( u − 5 ) 2 + 10 10×(u-5)^2+10 10×(u5)2+10最小的值 u u u,然而,使得这里最小的 u u u值仍为5。因此将一些常数乘以你的最小化项,这并不会改变最小化该方程时得到 u u u值。因此,这里我所做的是删去常量 m m m。也相同的,我将目标函数乘上一个常量 m m m,并不会改变取得最小值时的 θ {{\theta }} θ值。

第二点概念上的变化,我们只是指在使用支持向量机时,一些如下的标准惯例,而不是逻辑回归。因此,对于逻辑回归,在目标函数中,我们有两项:第一个是训练样本的代价,第二个是我们的正则化项,我们不得不去用这一项来平衡。这就相当于我们想要最小化 A A A加上正则化参数 λ \lambda λ,然后乘以其他项 B B B对吧?这里的 A A A表示这里的第一项,同时我用B表示第二项,但不包括 λ \lambda λ,我们不是优化这里的 A + λ × B A+\lambda\times B A+λ×B。我们所做的是通过设置不同正则参数 λ \lambda λ达到优化目的。这样,我们就能够权衡对应的项,是使得训练样本拟合的更好。即最小化 A A A。还是保证正则参数足够小,也即是对于B项而言,但对于支持向量机,按照惯例,我们将使用一个不同的参数替换这里使用的 λ \lambda λ来权衡这两项。你知道,就是第一项和第二项我们依照惯例使用一个不同的参数称为 C C C,同时改为优化目标, C × A + B C×A+B C×A+B
因此,在逻辑回归中,如果给定 λ \lambda λ,一个非常大的值,意味着给予 B B B更大的权重。而这里,就对应于将 C C C 设定为非常小的值,那么,相应的将会给 B B B比给 A A A更大的权重。因此,这只是一种不同的方式来控制这种权衡或者一种不同的方法,即用参数来决定是更关心第一项的优化,还是更关心第二项的优化。当然你也可以把这里的参数 C C C 考虑成 1 / λ 1/\lambda 1/λ,同 1 / λ 1/\lambda 1/λ所扮演的角色相同,并且这两个方程或这两个表达式并不相同,因为 C = 1 / λ C=1/\lambda C=1/λ,但是也并不全是这样,如果当 C = 1 / λ C=1/\lambda C=1/λ时,这两个优化目标应当得到相同的值,相同的最优值 θ {{\theta }} θ。因此,就用它们来代替。那么,我现在删掉这里的 λ \lambda λ,并且用常数 C C C来代替。因此,这就得到了在支持向量机中我们的整个优化目标函数。然后最小化这个目标函数,得到SVM 学习到的参数 C C C

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWZ8EXCd-1575448595931)(https://www.github.com/OneJane/blog/raw/master/小书匠/5a63e35db410fdb57c76de97ea888278.png)]
最后有别于逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数 θ {{\theta }} θ时,支持向量机所做的是它来直接预测 y y y的值等于1,还是等于0。因此,这个假设函数会预测1。当 θ T x \theta^Tx θTx大于或者等于0时,或者等于0时,所以学习参数 θ {{\theta }} θ就是支持向量机假设函数的形式。那么,这就是支持向量机数学上的定义。

在接下来的视频中,让我们再回去从直观的角度看看优化目标,实际上是在做什么,以及SVM的假设函数将会学习什么,同时也会谈谈如何做些许修改,学习更加复杂、非线性的函数。

大边界的直观理解

参考视频: 12 - 2 - Large Margin Intuition (11 min).mkv

人们有时将支持向量机看作是大间距分类器。在这一部分,我将介绍其中的含义,这有助于我们直观理解SVM模型的假设是什么样的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKObbmP2-1575448595932)(https://www.github.com/OneJane/blog/raw/master/小书匠/cc66af7cbd88183efc07c8ddf09cbc73.png)]
这是我的支持向量机模型的代价函数,在左边这里我画出了关于 z z z的代价函数 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z),此函数用于正样本,而在右边这里我画出了关于 z z z的代价函数 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),横轴表示 z z z,现在让我们考虑一下,最小化这些代价函数的必要条件是什么。如果你有一个正样本, y = 1 y=1 y=1,则只有在 z > = 1 z>=1 z>=1时,代价函数 cos ⁡ t 1 ( z ) {\cos}t_1{(z)} cost1(z)才等于0。

换句话说,如果你有一个正样本,我们会希望 θ T x > = 1 \theta^Tx>=1 θTx>=1,反之,如果 y = 0 y=0 y=0,我们观察一下,函数 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z),它只有在 z < = − 1 z<=-1 z<=1的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本 y = 1 y=1 y=1,则其实我们仅仅要求 θ T x \theta^Tx θTx大于等于0,就能将该样本恰当分出,这是因为如果 θ T x \theta^Tx θTx>0大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要 θ T x \theta^Tx θTx<=0就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 θ T x \theta^Tx θTx>0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。

当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。具体而言,我接下来会考虑一个特例。我们将这个常数 C C C设置成一个非常大的值。比如我们假设 C C C的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tbhEOMuA-1575448595933)(https://www.github.com/OneJane/blog/raw/master/小书匠/12ebd5973230e8fdf279ae09e187f437.png)]
如果 C C C非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为0的最优解。因此,让我们尝试在代价项的第一项为0的情形下理解该优化问题。比如我们可以把 C C C设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。

KaTeX parse error: Expected group after '_' at position 5: \min_̲\limits{\theta}…

我们已经看到输入一个训练样本标签为 y = 1 y=1 y=1,你想令第一项为0,你需要做的是找到一个 θ {{\theta }} θ,使得 θ T x > = 1 \theta^Tx>=1 θTx>=1,类似地,对于一个训练样本,标签为 y = 0 y=0 y=0,为了使 cos ⁡ t 0 ( z ) {\cos}t_0{(z)} cost0(z) 函数的值为0,我们需要 θ T x < = − 1 \theta^Tx<=-1 θTx<=1。因此,现在考虑我们的优化问题。选择参数,使得第一项等于0,就会导致下面的优化问题,因为我们将选择参数使第一项为0,因此这个函数的第一项为0,因此是 C C C乘以0加上二分之一乘以第二项。这里第一项是 C C C乘以0,因此可以将其删去,因为我知道它是0。

这将遵从以下的约束: θ T x ( i ) > = 1 \theta^Tx^{(i)}>=1 θTx(i)>=1,如果 y ( i ) y^{(i)} y(i)是等于1 的, θ T x ( i ) < = − 1 \theta^Tx^{(i)}<=-1 θTx(i)<=1,如果样本 i i i是一个负样本,这样当你求解这个优化问题的时候,当你最小化这个关于变量 θ {{\theta }} θ的函数的时候,你会得到一个非常有趣的决策边界。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Co1z2bxy-1575448595933)(https://www.github.com/OneJane/blog/raw/master/小书匠/b1f670fddd9529727aa16a559d49d151.png)]
具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MhGJtniF-1575448595934)(https://www.github.com/OneJane/blog/raw/master/小书匠/01105c3afd1315acf0577f8493137dcc.png)]
比如,这就是一个决策边界可以把正样本和负样本分开。但是多多少少这个看起来并不是非常自然是么?

或者我们可以画一条更差的决策界,这是另一条决策边界,可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccT2MUTh-1575448595935)(https://www.github.com/OneJane/blog/raw/master/小书匠/e68e6ca3275f433330a7981971eb4f16.png)]
当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,而这其实是求解上一页幻灯片上优化问题的结果。

我知道你也许想知道求解上一页幻灯片中的优化问题为什么会产生这个结果?它是如何产生这个大间距分类器的呢?我知道我还没有解释这一点。

我将会从直观上略述为什么这个优化问题会产生大间距分类器。总之这个图示有助于你理解支持向量机模型的做法,即努力将正样本和负样本用最大的间距分开。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YynKw0Sf-1575448595937)(https://www.github.com/OneJane/blog/raw/master/小书匠/dd6239efad3d3ee7a89a28574d7795b3.png)]
在本节课中关于大间距分类器,我想讲最后一点:我们将这个大间距分类器中的正则化因子常数 C C C设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。那么在让代价函数最小化的过程中,我们希望找出在 y = 1 y=1 y=1 y = 0 y=0 y=0两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRchoY1t-1575448595938)(https://www.github.com/OneJane/blog/raw/master/小书匠/f4b6dee99cfb4352b3cac5287002e8de.png)]
事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-huOf3DH5-1575448595939)(https://www.github.com/OneJane/blog/raw/master/小书匠/b8fbe2f6ac48897cf40497a2d034c691.png)]
在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数 C C C,设置的非常大,这事实上正是支持向量机将会做的。它将决策界,从黑线变到了粉线,但是如果 C C C 设置的小一点,如果你将C设置的不要太大,则你最终会得到这条黑线, 当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数 C C C非常大的情形,同时,要提醒你 C C C的作用类似于 1 / λ 1/\lambda 1/λ λ \lambda λ是我们之前使用过的正则化参数。这只是 C C C非常大的情形,或者等价地 λ \lambda λ 非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候, C C C不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。 甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。

回顾 C = 1 / λ C=1/\lambda C=1/λ,因此:

C C C 较大时,相当于 λ \lambda λ 较小,可能会导致过拟合,高方差。

C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差。

我们稍后会介绍支持向量机的偏差和方差,希望在那时候关于如何处理参数的这种平衡会变得更加清晰。我希望,这节课给出了一些关于为什么支持向量机被看做大间距分类器的直观理解。它用最大间距将样本区分开,尽管从技术上讲,这只有当参数 C C C是非常大的时候是真的,但是它对于理解支持向量机是有益的。

本节课中我们略去了一步,那就是我们在幻灯片中给出的优化问题。为什么会是这样的?它是如何得出大间距分类器的?我在本节中没有讲解,在下一节课中,我将略述这些问题背后的数学原理,来解释这个优化问题是如何得到一个大间距分类器的。

大边界分类背后的数学(选修)

参考视频: 12 - 3 - Mathematics Behind Large Margin Classification (Optional) (20 min).mkv

在本节课中,我将介绍一些大间隔分类背后的数学原理。本节为选修部分,你完全可以跳过它,但是听听这节课可能让你对支持向量机中的优化问题,以及如何得到大间距分类器,产生更好的直观理解。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wywi8eq5-1575448595940)(https://www.github.com/OneJane/blog/raw/master/小书匠/55e05845c636c8c99c03e6e29337d8c4.png)]
首先,让我来给大家复习一下关于向量内积的知识。假设我有两个向量, u u u v v v,我将它们写在这里。两个都是二维向量,我们看一下, u T v u^T v uTv的结果。 u T v u^T v uTv也叫做向量 u u u v v v之间的内积。由于是二维向量,我可以将它们画在这个图上。我们说,这就是向量 u u u即在横轴上,取值为某个 u 1 {{u}_{1}} u1,而在纵轴上,高度是某个 u 2 {{u}_{2}} u2作为 u u u的第二个分量。现在,很容易计算的一个量就是向量 u u u的范数。 ∥ u ∥ \left\| u \right\| u表示 u u u的范数,即 u u u的长度,即向量 u u u的欧几里得长度。根据毕达哥拉斯定理, ∥ u ∥ = u 1 2 + u 2 2 \left\| u \right\|=\sqrt{u_{1}^{2}+u_{2}^{2}} u=u12+u22 ,这是向量 u u u的长度,它是一个实数。现在你知道了这个的长度是多少了。我刚刚画的这个向量的长度就知道了。

现在让我们回头来看向量 v v v ,因为我们想计算内积。 v v v是另一个向量,它的两个分量 v 1 {{v}_{1}} v1 v 2 {{v}_{2}} v2是已知的。向量 v v v可以画在这里,现在让我们来看看如何计算 u u u v v v之间的内积。这就是具体做法,我们将向量 v v v投影到向量 u u u上,我们做一个直角投影,或者说一个90度投影将其投影到 u u u上,接下来我度量这条红线的长度。我称这条红线的长度为 p p p,因此 p p p就是长度,或者说是向量 v v v投影到向量 u u u上的量,我将它写下来, p p p v v v投影到向量 u u u上的长度,因此可以将 u T v = p ⋅ ∥ u ∥ {{u}^{T}}v=p\centerdot \left\| u \right\| uTv=pu,或者说 u u u的长度。这是计算内积的一种方法。如果你从几何上画出 p p p的值,同时画出 u u u的范数,你也会同样地计算出内积,答案是一样的。另一个计算公式是: u T v u^T v uTv就是 [ u 1   u 2 ] \left[ {{u}_{1}}\text{ }{{u}_{2}} \right] [u1 u2] 这个一行两列的矩阵乘以 v v v。因此可以得到 u 1 × v 1 + u 2 × v 2 {{u}_{1}}\times {{v}_{1}}+{{u}_{2}}\times {{v}_{2}} u1×v1+u2×v2。根据线性代数的知识,这两个公式会给出同样的结果。顺便说一句, u T v = v T u u^Tv=v^Tu uTv=vTu。因此如果你将 u u u v v v交换位置,将 u u u投影到 v v v上,而不是将 v v v投影到 u u u上,然后做同样地计算,只是把 u u u v v v的位置交换一下,你事实上可以得到同样的结果。申明一点,在这个等式中 u u u的范数是一个实数, p p p也是一个实数,因此 u T v u^T v uTv就是两个实数正常相乘。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6MAdoss-1575448595941)(https://www.github.com/OneJane/blog/raw/master/小书匠/44ad37bce4b7e03835095dccbd2a7b7a.png)]
最后一点,需要注意的就是 p p p值, p p p事实上是有符号的,即它可能是正值,也可能是负值。我的意思是说,如果 u u u是一个类似这样的向量, v v v是一个类似这样的向量, u u u v v v之间的夹角大于90度,则如果将 v v v投影到 u u u上,会得到这样的一个投影,这是 p p p的长度,在这个情形下我们仍然有 u T v {{u}^{T}}v uTv是等于 p p p乘以 u u u的范数。唯一一点不同的是 p p p在这里是负的。在内积计算中,如果 u u u v v v之间的夹角小于90度,那么那条红线的长度 p p p是正值。然而如果这个夹角大于90度,则 p p p将会是负的。就是这个小线段的长度是负的。如果它们之间的夹角大于90度,两个向量之间的内积也是负的。这就是关于向量内积的知识。我们接下来将会使用这些关于向量内积的性质试图来理解支持向量机中的目标函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBgteXSM-1575448595942)(https://www.github.com/OneJane/blog/raw/master/小书匠/03bd4b3ff69e327f7949c3d2a73eed8a.png)]
这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化,仅仅是为了让目标函数更容易被分析。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJLRt3bg-1575448595943)(https://www.github.com/OneJane/blog/raw/master/小书匠/3cc61c6e5fe85c2a7bf8170f5bbfd8c3.png)]
我接下来忽略掉截距,令 θ 0 = 0 {{\theta }_{0}}=0 θ0=0,这样更容易画示意图。我将特征数 n n n置为2,因此我们仅有两个特征 x 1 , x 2 {{x}_{1}},{{x}_{2}} x1,x2,现在我们来看一下目标函数,支持向量机的优化目标函数。当我们仅有两个特征,即 n = 2 n=2 n=2时,这个式子可以写作: 1 2 ( θ 1 2 + θ 2 2 ) = 1 2 ( θ 1 2 + θ 2 2 ) 2 \frac{1}{2}\left({\theta_1^2+\theta_2^2}\right)=\frac{1}{2}\left(\sqrt{\theta_1^2+\theta_2^2}\right)^2 21(θ12+θ22)=21(θ12+θ22 )2,我们只有两个参数 θ 1 , θ 2 {{\theta }_{1}},{{\theta }_{2}} θ1,θ2。你可能注意到括号里面的这一项是向量 θ {{\theta }} θ的范数,或者说是向量 θ {{\theta }} θ的长度。我的意思是如果我们将向量 θ {{\theta }} θ写出来,那么我刚刚画红线的这一项就是向量 θ {{\theta }} θ的长度或范数。这里我们用的是之前学过的向量范数的定义,事实上这就等于向量 θ {{\theta }} θ的长度。

当然你可以将其写作 θ 0 , θ 1 , θ 2 {{\theta }_{0}}\text{,}{{\theta }_{1}},{{\theta }_{2}} θ0,θ1,θ2,如果 θ 0 = 0 {{\theta }_{0}}=0 θ0=0,那就是 θ 1 , θ 2 {{\theta }_{1}},{{\theta }_{2}} θ1,θ2的长度。在这里我将忽略 θ 0 {{\theta }_{0}} θ0,这样来写 θ \theta θ的范数,它仅仅和 θ 1 , θ 2 {{\theta }_{1}},{{\theta }_{2}} θ1,θ2有关。但是,数学上不管你是否包含,其实并没有差别,因此在我们接下来的推导中去掉 θ 0 {{\theta }_{0}} θ0不会有影响这意味着我们的目标函数是等于 1 2 ∥ θ ∥ 2 \frac{1}{2}\left\| \theta \right\|^2 21θ2。因此支持向量机做的全部事情,就是极小化参数向量 θ {{\theta }} θ范数的平方,或者说长度的平方

现在我将要看看这些项: θ T x \theta^{T}x θTx更深入地理解它们的含义。给定参数向量$\theta 给 定 一 个 样 本 给定一个样本 x , 这 等 于 什 么 呢 ? 在 前 一 页 幻 灯 片 上 , 我 们 画 出 了 在 不 同 情 形 下 , ,这等于什么呢?在前一页幻灯片上,我们画出了在不同情形下, ?u^Tv 的 示 意 图 , 我 们 将 会 使 用 这 些 概 念 , 的示意图,我们将会使用这些概念, 使\theta 和 和 x^{(i)} 就 类 似 于 就类似于 u 和 和 v$ 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Rz5BQ79-1575448595943)(https://www.github.com/OneJane/blog/raw/master/小书匠/4510b8fbc90ba2b233bb6996529f2df1.png)]
让我们看一下示意图:我们考察一个单一的训练样本,我有一个正样本在这里,用一个叉来表示这个样本 x ( i ) x^{(i)} x(i),意思是在水平轴上取值为 x 1 ( i ) x_1^{(i)} x1(i),在竖直轴上取值为 x 2 ( i ) x_2^{(i)} x2(i)。这就是我画出的训练样本。尽管我没有将其真的看做向量。它事实上就是一个始于原点,终点位置在这个训练样本点的向量。现在,我们有一个参数向量我会将它也画成向量。我将 θ 1 θ_1 θ1画在横轴这里,将 θ 2 θ_2 θ2 画在纵轴这里,那么内积 θ T x ( i ) θ^T x^{(i)} θTx(i) 将会是什么呢?

使用我们之前的方法,我们计算的方式就是我将训练样本投影到参数向量 θ {{\theta }} θ,然后我来看一看这个线段的长度,我将它画成红色。我将它称为 p ( i ) p^{(i)} p(i)用来表示这是第 i i i个训练样本在参数向量 θ {{\theta }} θ上的投影。根据我们之前幻灯片的内容,我们知道的是 θ T x ( i ) θ^Tx^{(i)} θTx(i)将会等于 p p p 乘以向量 θ θ θ 的长度或范数。这就等于 θ 1 ⋅ x 1 ( i ) + θ 2 ⋅ x 2 ( i ) \theta_1\cdot{x_1^{(i)}}+\theta_2\cdot{x_2^{(i)}} θ1x1(i)+θ2x2(i)。这两种方式是等价的,都可以用来计算 θ θ θ x ( i ) x^{(i)} x(i)之间的内积。

这告诉了我们什么呢?这里表达的意思是:这个 θ T x ( i ) > = 1 θ^Tx^{(i)}>=1 θTx(i)>=1 或者 θ T x ( i ) < − 1 θ^Tx^{(i)}<-1 θTx(i)<1的,约束是可以被 p ( i ) ⋅ x > = 1 p^{(i)}\cdot{x}>=1 p(i)x>=1这个约束所代替的。因为 θ T x ( i ) = p ( i ) ⋅ ∥ θ ∥ θ^Tx^{(i)}=p^{(i)}\cdot{\left\| \theta \right\|} θTx(i)=p(i)θ ,将其写入我们的优化目标。我们将会得到没有了约束, θ T x ( i ) θ^Tx^{(i)} θTx(i)而变成了 p ( i ) ⋅ ∥ θ ∥ p^{(i)}\cdot{\left\| \theta \right\|} p(i)θ

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uO0ocF7q-1575448595944)(https://www.github.com/OneJane/blog/raw/master/小书匠/912cb43058cee46ddf51598b7538968c.png)]
需要提醒一点,我们之前曾讲过这个优化目标函数可以被写成等于 1 2 ∥ θ ∥ 2 \frac{1}{2}\left\| \theta \right\|^2 21θ2

现在让我们考虑下面这里的训练样本。现在,继续使用之前的简化,即 θ 0 = 0 {{\theta }_{0}}=0 θ0=0,我们来看一下支持向量机会选择什么样的决策界。这是一种选择,我们假设支持向量机会选择这个决策边界。这不是一个非常好的选择,因为它的间距很小。这个决策界离训练样本的距离很近。我们来看一下为什么支持向量机不会选择它。

对于这样选择的参数 θ {{\theta }} θ,可以看到参数向量 θ {{\theta }} θ事实上是和决策界是90度正交的,因此这个绿色的决策界对应着一个参数向量 θ {{\theta }} θ这个方向,顺便提一句 θ 0 = 0 {{\theta }_{0}}=0 θ0=0的简化仅仅意味着决策界必须通过原点 ( 0 , 0 ) (0,0) (0,0)。现在让我们看一下这对于优化目标函数意味着什么。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VNISRLBj-1575448595944)(https://www.github.com/OneJane/blog/raw/master/小书匠/20725ba601c1c90d1024e50fc24c579b.png)]
比如这个样本,我们假设它是我的第一个样本 x ( 1 ) x^{(1)} x(1),如果我考察这个样本到参数 θ {{\theta }} θ的投影,投影是这个短的红线段,就等于 p ( 1 ) p^{(1)} p(1),它非常短。类似地,这个样本如果它恰好是 x ( 2 ) x^{(2)} x(2),我的第二个训练样本,则它到 θ {{\theta }} θ的投影在这里。我将它画成粉色,这个短的粉色线段是 p ( 2 ) p^{(2)} p(2),即第二个样本到我的参数向量 θ {{\theta }} θ的投影。因此,这个投影非常短。 p ( 2 ) p^{(2)} p(2)事实上是一个负值, p ( 2 ) p^{(2)} p(2)是在相反的方向,这个向量和参数向量 θ {{\theta }} θ的夹角大于90度, p ( 2 ) p^{(2)} p(2)的值小于0。

我们会发现这些 p ( i ) p^{(i)} p(i)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要 p ( i ) ⋅ ∥ θ ∥ > = 1 p^{(i)}\cdot{\left\| \theta \right\|}>=1 p(i)θ>=1,但是如果 p ( i ) p^{(i)} p(i)在这里非常小,那就意味着我们需要 θ {{\theta }} θ的范数非常大.因为如果 p ( 1 ) p^{(1)} p(1) 很小,而我们希望 p ( 1 ) ⋅ ∥ θ ∥ > = 1 p^{(1)}\cdot{\left\| \theta \right\|}>=1 p(1)θ>=1,令其实现的唯一的办法就是这两个数较大。如果 p ( 1 ) p^{(1)} p(1) 小,我们就希望 θ {{\theta }} θ的范数大。类似地,对于负样本而言我们需要 p ( 2 ) ⋅ ∥ θ ∥ < = − 1 p^{(2)}\cdot{\left\|\theta \right\|}<=-1 p(2)θ<=1。我们已经在这个样本中看到 p ( 2 ) p^{(2)} p(2)会是一个非常小的数,因此唯一的办法就是 θ {{\theta }} θ的范数变大。但是我们的目标函数是希望找到一个参数 θ {{\theta }} θ,它的范数是小的。因此,这看起来不像是一个好的参数向量 θ {{\theta }} θ的选择。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QboZK1A-1575448595945)(https://www.github.com/OneJane/blog/raw/master/小书匠/5eab58ad9cb54b3b6fda8f6c96efff24.png)]
相反的,来看一个不同的决策边界。比如说,支持向量机选择了这个决策界,现在状况会有很大不同。如果这是决策界,这就是相对应的参数 θ {{\theta }} θ的方向,因此,在这个决策界之下,垂直线是决策界。使用线性代数的知识,可以说明,这个绿色的决策界有一个垂直于它的向量 θ {{\theta }} θ。现在如果你考察你的数据在横轴 x x x上的投影,比如这个我之前提到的样本,我的样本 x ( 1 ) x^{(1)} x(1),当我将它投影到横轴 x x x上,或说投影到 θ {{\theta }} θ上,就会得到这样 p ( 1 ) p^{(1)} p(1)。它的长度是 p ( 1 ) p^{(1)} p(1),另一个样本,那个样本是 x ( 2 ) x^{(2)} x(2)。我做同样的投影,我会发现, p ( 2 ) p^{(2)} p(2)的长度是负值。你会注意到现在 p ( 1 ) p^{(1)} p(1) p ( 2 ) p^{(2)} p(2)这些投影长度是长多了。如果我们仍然要满足这些约束, P ( i ) ⋅ ∥ θ ∥ P^{(i)}\cdot{\left\| \theta \right\|} P(i)θ>1,则因为 p ( 1 ) p^{(1)} p(1)变大了, θ {{\theta }} θ的范数就可以变小了。因此这意味着通过选择右边的决策界,而不是左边的那个,支持向量机可以使参数 θ {{\theta }} θ的范数变小很多。因此,如果我们想令 θ {{\theta }} θ的范数变小,从而令 θ {{\theta }} θ范数的平方变小,就能让支持向量机选择右边的决策界。这就是支持向量机如何能有效地产生大间距分类的原因。

看这条绿线,这个绿色的决策界。我们希望正样本和负样本投影到 θ \theta θ的值大。要做到这一点的唯一方式就是选择这条绿线做决策界。这是大间距决策界来区分开正样本和负样本这个间距的值。这个间距的值就是 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值。通过让间距变大,即通过这些 p ( 1 ) , p ( 2 ) , p ( 3 ) p^{(1)},p^{(2)},p^{(3)} p(1),p(2),p(3)等等的值,支持向量机最终可以找到一个较小的 θ {{\theta }} θ范数。这正是支持向量机中最小化目标函数的目的。

以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些 p ( i ) p^{(i)} p(i)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设,就是参数 θ 0 = 0 θ_0=0 θ0=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWKzE5qt-1575448595946)(https://www.github.com/OneJane/blog/raw/master/小书匠/65198a1748fdbe16da34afab9f33d801.png)]
就像我之前提到的。这个的作用是: θ 0 = 0 θ_0=0 θ0=0的意思是我们让决策界通过原点。如果你令 θ 0 θ_0 θ0不是0的话,含义就是你希望决策界不通过原点。我将不会做全部的推导。实际上,支持向量机产生大间距分类器的结论,会被证明同样成立,证明方式是非常类似的,是我们刚刚做的证明的推广。

之前视频中说过,即便 θ 0 θ_0 θ0不等于0,支持向量机要做的事情都是优化这个目标函数对应着 C C C值非常大的情况,但是可以说明的是,即便 θ 0 θ_0 θ0不等于0,支持向量机仍然会找到正样本和负样本之间的大间距分隔。

总之,我们解释了为什么支持向量机是一个大间距分类器。在下一节我们,将开始讨论如何利用支持向量机的原理,应用它们建立一个复杂的非线性分类器。

核函数1

参考视频: 12 - 4 - Kernels I (16 min).mkv

回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mC5i0pQO-1575448595947)(https://www.github.com/OneJane/blog/raw/master/小书匠/529b6dbc07c9f39f5266bd0b3f628545.png)]
为了获得上图所示的判定边界,我们的模型可能是${{\theta }{0}}+{{\theta }{1}}{{x}{1}}+{{\theta }{2}}{{x}{2}}+{{\theta }{3}}{{x}{1}}{{x}{2}}+{{\theta }{4}}x{1}^{2}+{{\theta }{5}}x{2}^{2}+\cdots $的形式。

我们可以用一系列的新的特征 f f f来替换模型中的每一项。例如令:
f 1 = x 1 , f 2 = x 2 , f 3 = x 1 x 2 , f 4 = x 1 2 , f 5 = x 2 2 {{f}_{1}}={{x}_{1}},{{f}_{2}}={{x}_{2}},{{f}_{3}}={{x}_{1}}{{x}_{2}},{{f}_{4}}=x_{1}^{2},{{f}_{5}}=x_{2}^{2} f1=x1,f2=x2,f3=x1x2,f4=x12,f5=x22

…得到 h θ ( x ) = θ 1 f 1 + θ 2 f 2 + . . . + θ n f n h_θ(x)={{\theta }_{1}}f_1+{{\theta }_{2}}f_2+...+{{\theta }_{n}}f_n hθ(x)=θ1f1+θ2f2+...+θnfn。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3?我们可以利用核函数来计算出新的特征。

给定一个训练样本 x x x,我们利用 x x x的各个特征与我们预先选定的地标(landmarks) l ( 1 ) , l ( 2 ) , l ( 3 ) l^{(1)},l^{(2)},l^{(3)} l(1),l(2),l(3)的近似程度来选取新的特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D66tquqv-1575448595947)(https://www.github.com/OneJane/blog/raw/master/小书匠/2516821097bda5dfaf0b94e55de851e0.png)]
例如: f 1 = s i m i l a r i t y ( x , l ( 1 ) ) = e ( − ∥ x − l ( 1 ) ∥ 2 2 σ 2 ) {{f}_{1}}=similarity(x,{{l}^{(1)}})=e(-\frac{{{\left\| x-{{l}^{(1)}} \right\|}^{2}}}{2{{\sigma }^{2}}}) f1=similarity(x,l(1))=e(2σ2xl(1)2)

其中: ∥ x − l ( 1 ) ∥ 2 = ∑ j = 1 n ( x j − l j ( 1 ) ) 2 {{\left\| x-{{l}^{(1)}} \right\|}^{2}}=\sum{_{j=1}^{n}}{{({{x}_{j}}-l_{j}^{(1)})}^{2}} xl(1)2=j=1n(xjlj(1))2,为实例 x x x中所有特征与地标 l ( 1 ) l^{(1)} l(1)之间的距离的和。上例中的 s i m i l a r i t y ( x , l ( 1 ) ) similarity(x,{{l}^{(1)}}) similarity(x,l(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。

这些地标的作用是什么?如果一个训练样本 x x x与地标 l l l之间的距离近似于0,则新特征 f f f近似于 e − 0 = 1 e^{-0}=1 e0=1,如果训练样本 x x x与地标 l l l之间距离较远,则 f f f近似于 e − ( 一 个 较 大 的 数 ) = 0 e^{-(一个较大的数)}=0 e()=0

假设我们的训练样本含有两个特征[ x 1 x_{1} x1 x 2 x{_2} x2],给定地标 l ( 1 ) l^{(1)} l(1)与不同的 σ \sigma σ值,见下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-axmhp9vw-1575448595948)(https://www.github.com/OneJane/blog/raw/master/小书匠/b9acfc507a54f5ca13a3d50379972535.jpg)]
图中水平面的坐标为 x 1 x_{1} x1 x 2 x_{2} x2而垂直坐标轴代表 f f f。可以看出,只有当 x x x l ( 1 ) l^{(1)} l(1)重合时 f f f才具有最大值。随着 x x x的改变 f f f值改变的速率受到 σ 2 \sigma^2 σ2的控制。

在下图中,当样本处于洋红色的点位置处,因为其离 l ( 1 ) l^{(1)} l(1)更近,但是离 l ( 2 ) l^{(2)} l(2) l ( 3 ) l^{(3)} l(3)较远,因此 f 1 f_1 f1接近1,而 f 2 f_2 f2, f 3 f_3 f3接近0。因此 h θ ( x ) = θ 0 + θ 1 f 1 + θ 2 f 2 + θ 1 f 3 > 0 h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0 hθ(x)=θ0+θ1f1+θ2f2+θ1f3>0,因此预测 y = 1 y=1 y=1。同理可以求出,对于离 l ( 2 ) l^{(2)} l(2)较近的绿色点,也预测 y = 1 y=1 y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测 y = 0 y=0 y=0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHNRinGd-1575448595949)(https://www.github.com/OneJane/blog/raw/master/小书匠/3d8959d0d12fe9914dc827d5a074b564.jpg)]
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征 f 1 , f 2 , f 3 f_1,f_2,f_3 f1,f2,f3

核函数2

参考视频: 12 - 5 - Kernels II (16 min).mkv

在上一节视频里,我们讨论了核函数这个想法,以及怎样利用它去实现支持向量机的一些新特性。在这一节视频中,我将补充一些缺失的细节,并简单的介绍一下怎么在实际中使用应用这些想法。

如何选择地标?

我们通常是根据训练集的数量选择地标的数量,即如果训练集中有 m m m个样本,则我们选取 m m m个地标,并且令: l ( 1 ) = x ( 1 ) , l ( 2 ) = x ( 2 ) , . . . . . , l ( m ) = x ( m ) l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)} l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yR6fCDm-1575448595949)(https://www.github.com/OneJane/blog/raw/master/小书匠/eca2571849cc36748c26c68708a7a5bd.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjtonkd5-1575448595950)(https://www.github.com/OneJane/blog/raw/master/小书匠/ea31af620b0a0132fe494ebb4a362465.png)]
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:

• 给定 x x x,计算新特征 f f f,当 θ T f > = 0 θ^Tf>=0 θTf>=0 时,预测 y = 1 y=1 y=1,否则反之。

相应地修改代价函数为:$\sum{_{j=1}^{n=m}}\theta _{j}{2}={{\theta}{T}}\theta $,

m i n C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T f ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T f ( i ) ) ] + 1 2 ∑ j = 1 n = m θ j 2 min C\sum\limits_{i=1}^{m}{[{{y}^{(i)}}cos {{t}_{1}}}( {{\theta }^{T}}{{f}^{(i)}})+(1-{{y}^{(i)}})cos {{t}_{0}}( {{\theta }^{T}}{{f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}} minCi=1m[y(i)cost1(θTf(i))+(1y(i))cost0(θTf(i))]+21j=1n=mθj2
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算$\sum{_{j=1}^{n=m}}\theta _{j}{2}={{\theta}{T}}\theta 时 , 我 们 用 时,我们用 θTMθ$代替$θ , 其 中 ,其中 M$是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。

理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M M M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。

在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如liblinear,libsvm等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。

另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。

下面是支持向量机的两个参数 C C C σ \sigma σ的影响:

C = 1 / λ C=1/\lambda C=1/λ

C C C 较大时,相当于 λ \lambda λ较小,可能会导致过拟合,高方差;

C C C 较小时,相当于 λ \lambda λ较大,可能会导致低拟合,高偏差;

σ \sigma σ较大时,可能会导致低方差,高偏差;

σ \sigma σ较小时,可能会导致低偏差,高方差。

如果你看了本周的编程作业,你就能亲自实现这些想法,并亲眼看到这些效果。这就是利用核函数的支持向量机算法,希望这些关于偏差和方差的讨论,能给你一些对于算法结果预期的直观印象。

使用支持向量机

参考视频: 12 - 6 - Using An SVM (21 min).mkv

目前为止,我们已经讨论了SVM比较抽象的层面,在这个视频中我将要讨论到为了运行或者运用SVM。你实际上所需要的一些东西:支持向量机算法,提出了一个特别优化的问题。但是就如在之前的视频中我简单提到的,我真的不建议你自己写软件来求解参数 θ {{\theta }} θ,因此由于今天我们中的很少人,或者其实没有人考虑过自己写代码来转换矩阵,或求一个数的平方根等我们只是知道如何去调用库函数来实现这些功能。同样的,用以解决SVM最优化问题的软件很复杂,且已经有研究者做了很多年数值优化了。因此你提出好的软件库和好的软件包来做这样一些事儿。然后强烈建议使用高优化软件库中的一个,而不是尝试自己落实一些数据。有许多好的软件库,我正好用得最多的两个是liblinearlibsvm,但是真的有很多软件库可以用来做这件事儿。你可以连接许多你可能会用来编写学习算法的主要编程语言。

在高斯核函数之外我们还有其他一些选择,如:

多项式核函数(Polynomial Kernel)

字符串核函数(String kernel

卡方核函数( chi-square kernel

直方图交集核函数(histogram intersection kernel

等等…

这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer’s定理,才能被支持向量机的优化软件正确处理。

多类分类问题

假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有 k k k个类,则我们需要 k k k个模型,以及 k k k个参数向量 θ {{\theta }} θ。我们同样也可以训练 k k k个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。

尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事:

1、是提出参数 C C C的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。

2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)。

从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?

下面是一些普遍使用的准则:

n n n为特征数, m m m为训练样本数。

(1)如果相较于 m m m而言, n n n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。

(2)如果 n n n较小,而且 m m m大小中等,例如 n n n在 1-1000 之间,而 m m m在10-10000之间,使用高斯核函数的支持向量机。

(3)如果 n n n较小,而 m m m较大,例如 n n n在1-1000之间,而 m m m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。

今天的SVM包会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集,且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。如果你看到这个幻灯片,看到了逻辑回归,或者不带核函数的支持向量机。在这个两个地方,我把它们放在一起是有原因的。原因是:逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核函数的SVM,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的SVM另一个也很有可能很有效。但是随着SVM的复杂度增加,当你使用不同的内核函数来学习复杂的非线性函数时,这个体系,你知道的,当你有多达1万(10,000)的样本时,也可能是5万(50,000),你的特征变量的数量这是相当大的。那是一个非常常见的体系,也许在这个体系里,不带核函数的支持向量机就会表现得相当突出。你可以做比这困难得多需要逻辑回归的事情。

最后,神经网络使用于什么时候呢? 对于所有的这些问题,对于所有的这些不同体系一个设计得很好的神经网络也很有可能会非常有效。有一个缺点是,或者说是有时可能不会使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果你有一个非常好的SVM实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此之前没有展示,但是事实证明,SVM具有的优化问题,是一种凸优化问题。因此,好的SVM优化软件包总是会找到全局最小值,或者接近它的值。对于SVM你不需要担心局部最优。在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用SVM的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比SVM慢,尤其是在这样一个体系中,至于这里给出的参考,看上去有些模糊,如果你在考虑一些问题,这些参考会有一些模糊,但是我仍然不能完全确定,我是该用这个算法还是改用那个算法,这个没有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是就如在之前的视频中看到的算法确实很重要。但是通常更加重要的是:你有多少数据,你有多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是SVM这方面更加重要。但是,已经说过了,SVM仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含了什么时候一个有效的方法去学习复杂的非线性函数。因此,实际上与逻辑回归、神经网络、SVM一起使用这些方法来提高学习算法,我认为你会很好地建立很有技术的状态。(编者注:当时GPU计算比较慢,神经网络还不流行。)

机器学习系统对于一个宽泛的应用领域来说,这是另一个在你军械库里非常强大的工具,你可以把它应用到很多地方,如硅谷、在工业、学术等领域建立许多高性能的机器学习系统。

聚类(Clustering)

无监督学习:简介

参考视频: 13 - 1 - Unsupervised Learning_ Introduction (3 min).mkv

在这个视频中,我将开始介绍聚类算法。这将是一个激动人心的时刻,因为这是我们学习的第一个非监督学习算法。我们将要让计算机学习无标签数据,而不是此前的标签数据。

那么,什么是非监督学习呢?在课程的一开始,我曾简单的介绍过非监督学习,然而,我们还是有必要将其与监督学习做一下比较。

在一个典型的监督学习中,我们有一个有标签的训练集,我们的目标是找到能够区分正样本和负样本的决策边界,在这里的监督学习中,我们有一系列标签,我们需要据此拟合一个假设函数。与此不同的是,在非监督学习中,我们的数据没有附带任何标签,我们拿到的数据就是这样的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p8j2Cgo1-1575448595951)(https://www.github.com/OneJane/blog/raw/master/小书匠/6709f5ca3cd2240d4e95dcc3d3e808d5.png)]
在这里我们有一系列点,却没有标签。因此,我们的训练集可以写成只有 x ( 1 ) x^{(1)} x(1), x ( 2 ) x^{(2)} x(2)……一直到 x ( m ) x^{(m)} x(m)。我们没有任何标签 y y y。因此,图上画的这些点没有标签信息。也就是说,在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据。我们可能需要某种算法帮助我们寻找一种结构。图上的数据看起来可以分成两个分开的点集(称为簇),一个能够找到我圈出的这些点集的算法,就被称为聚类算法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NvDXaKwx-1575448595952)(https://www.github.com/OneJane/blog/raw/master/小书匠/6709f5ca3cd2240d4e95dcc3d3e808d5.png)]
这将是我们介绍的第一个非监督学习算法。当然,此后我们还将提到其他类型的非监督学习算法,它们可以为我们找到其他类型的结构或者其他的一些模式,而不只是簇。

我们将先介绍聚类算法。此后,我们将陆续介绍其他算法。那么聚类算法一般用来做什么呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZjqsKr3K-1575448595953)(https://www.github.com/OneJane/blog/raw/master/小书匠/ff180f091e9bad9ac185248721437526.png)]
在这门课程的早些时候,我曾经列举过一些应用:比如市场分割。也许你在数据库中存储了许多客户的信息,而你希望将他们分成不同的客户群,这样你可以对不同类型的客户分别销售产品或者分别提供更适合的服务。社交网络分析:事实上有许多研究人员正在研究这样一些内容,他们关注一群人,关注社交网络,例如FacebookGoogle+,或者是其他的一些信息,比如说:你经常跟哪些人联系,而这些人又经常给哪些人发邮件,由此找到关系密切的人群。因此,这可能需要另一个聚类算法,你希望用它发现社交网络中关系密切的朋友。我有一个朋友正在研究这个问题,他希望使用聚类算法来更好的组织计算机集群,或者更好的管理数据中心。因为如果你知道数据中心中,那些计算机经常协作工作。那么,你可以重新分配资源,重新布局网络。由此优化数据中心,优化数据通信。

最后,我实际上还在研究如何利用聚类算法了解星系的形成。然后用这个知识,了解一些天文学上的细节问题。好的,这就是聚类算法。这将是我们介绍的第一个非监督学习算法。在下一个视频中,我们将开始介绍一个具体的聚类算法。

K-均值算法

参考视频: 13 - 2 - K-Means Algorithm (13 min).mkv

K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。

K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:

首先选择 K K K个随机的点,称为聚类中心cluster centroids);

对于数据集中的每一个数据,按照距离 K K K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。

计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。

重复步骤2-4直至中心点不再变化。

下面是一个聚类示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrtHsGjq-1575448595954)(https://www.github.com/OneJane/blog/raw/master/小书匠/ff1db77ec2e83b592bbe1c4153586120.jpg)]
迭代 1 次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMwuqsL7-1575448595954)(https://www.github.com/OneJane/blog/raw/master/小书匠/acdb3ac44f1fe61ff3b5a77d5a4895a1.jpg)]
迭代 3 次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3zwp748-1575448595955)(https://www.github.com/OneJane/blog/raw/master/小书匠/fe6dd7acf1a1eddcd09da362ecdf976f.jpg)]
迭代 10 次

μ 1 μ^1 μ1, μ 2 μ^2 μ2,…, μ k μ^k μk 来表示聚类中心,用 c ( 1 ) c^{(1)} c(1), c ( 2 ) c^{(2)} c(2),…, c ( m ) c^{(m)} c(m)来存储与第 i i i个实例数据最近的聚类中心的索引,K-均值算法的伪代码如下:

Repeat {

for i = 1 to m

c(i) := index (form 1 to K) of cluster centroid closest to x(i)

for k = 1 to K

μk := average (mean) of points assigned to cluster k

}

算法分为两个步骤,第一个for循环是赋值步骤,即:对于每一个样例 i i i,计算其应该属于的类。第二个for循环是聚类中心的移动,即:对于每一个类 K K K,重新计算该类的质心。

K-均值算法也可以很便利地用于将数据分为许多不同组,即使在没有非常明显区分的组群的情况下也可以。下图所示的数据集包含身高和体重两项特征构成的,利用K-均值算法将数据分为三类,用于帮助确定将要生产的T-恤衫的三种尺寸。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s94CgU4h-1575448595956)(https://www.github.com/OneJane/blog/raw/master/小书匠/fed50a4e482cf3aae38afeb368141a97.png)]

优化目标

参考视频: 13 - 3 - Optimization Objective (7 min).mkv

K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此
K-均值的代价函数(又称畸变函数 Distortion function)为:

J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ X ( i ) − μ c ( i ) ∥ 2 J(c^{(1)},...,c^{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}_{i=1}\left\| X^{\left( i\right) }-\mu_{c^{(i)}}\right\| ^{2} J(c(1),...,c(m),μ1,...,μK)=m1i=1mX(i)μc(i)2

其中 μ c ( i ) {{\mu }_{{{c}^{(i)}}}} μc(i)代表与 x ( i ) {{x}^{(i)}} x(i)最近的聚类中心点。
我们的的优化目标便是找出使得代价函数最小的 c ( 1 ) c^{(1)} c(1), c ( 2 ) c^{(2)} c(2),…, c ( m ) c^{(m)} c(m) μ 1 μ^1 μ1, μ 2 μ^2 μ2,…, μ k μ^k μk

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfvtIMJH-1575448595957)(https://www.github.com/OneJane/blog/raw/master/小书匠/8605f0826623078a156d30a7782dfc3c.png)]

回顾刚才给出的:
K-均值迭代算法,我们知道,第一个循环是用于减小 c ( i ) c^{(i)} c(i)引起的代价,而第二个循环则是用于减小 μ i {{\mu }_{i}} μi引起的代价。迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。

随机初始化

参考视频: 13 - 4 - Random Initialization (8 min).mkv

在运行K-均值算法的之前,我们首先要随机初始化所有的聚类中心点,下面介绍怎样做:

  1. 我们应该选择 K < m KK<m,即聚类中心点的个数要小于所有训练集实例的数量

  2. 随机选择 K K K个训练实例,然后令 K K K个聚类中心分别与这 K K K个训练实例相等

K-均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2mzK3Bfm-1575448595957)(https://www.github.com/OneJane/blog/raw/master/小书匠/d4d2c3edbdd8915f4e9d254d2a47d9c7.png)]
为了解决这个问题,我们通常需要多次运行K-均值算法,每一次都重新进行随机初始化,最后再比较多次运行K-均值的结果,选择代价函数最小的结果。这种方法在 K K K较小的时候(2–10)还是可行的,但是如果 K K K较大,这么做也可能不会有明显地改善。

选择聚类数

参考视频: 13 - 5 - Choosing the Number of Clusters (8 min).mkv

没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。选择的时候思考我们运用K-均值算法聚类的动机是什么,然后选择能最好服务于该目的标聚类数。

当人们在讨论,选择聚类数目的方法时,有一个可能会谈及的方法叫作“肘部法则”。关于“肘部法则”,我们所需要做的是改变 K K K值,也就是聚类类别数目的总数。我们用一个聚类来运行K均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算成本函数或者计算畸变函数 J J J K K K代表聚类数字。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzJVyW8T-1575448595958)(https://www.github.com/OneJane/blog/raw/master/小书匠/f3ddc6d751cab7aba7a6f8f44794e975.png)]
我们可能会得到一条类似于这样的曲线。像一个人的肘部。这就是“肘部法则”所做的,让我们来看这样一个图,看起来就好像有一个很清楚的肘在那儿。好像人的手臂,如果你伸出你的胳膊,那么这就是你的肩关节、肘关节、手。这就是“肘部法则”。你会发现这种模式,它的畸变值会迅速下降,从1到2,从2到3之后,你会在3的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用3个聚类来进行聚类是正确的,这是因为那个点是曲线的肘点,畸变值下降得很快, K = 3 K=3 K=3之后就下降得很慢,那么我们就选 K = 3 K=3 K=3。当你应用“肘部法则”的时候,如果你得到了一个像上面这样的图,那么这将是一种用来选择聚类个数的合理方法。

例如,我们的 T-恤制造例子中,我们要将用户按照身材聚类,我们可以分成3个尺寸: S , M , L S,M,L S,M,L,也可以分成5个尺寸 X S , S , M , L , X L XS,S,M,L,XL XS,S,M,L,XL,这样的选择是建立在回答“聚类后我们制造的T-恤是否能较好地适合我们的客户”这个问题的基础上作出的。

聚类参考资料:

1.相似度/距离计算方法总结

(1). 闵可夫斯基距离Minkowski/(其中欧式距离: p = 2 p=2 p=2)

d i s t ( X , Y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p dist(X,Y)={{\left( {{\sum\limits_{i=1}^{n}{\left| {{x}_{i}}-{{y}_{i}} \right|}}^{p}} \right)}^{\frac{1}{p}}} dist(X,Y)=(i=1nxiyip)p1

(2). 杰卡德相似系数(Jaccard):

J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{\left| A\cap B \right|}{\left|A\cup B \right|} J(A,B)=ABAB

(3). 余弦相似度(cosine similarity):

n n n维向量 x x x y y y的夹角记做 θ \theta θ,根据余弦定理,其余弦值为:

c o s ( θ ) = x T y ∣ x ∣ ⋅ ∣ y ∣ = ∑ i = 1 n x i y i ∑ i = 1 n x i 2 ∑ i = 1 n y i 2 cos (\theta )=\frac{{{x}^{T}}y}{\left|x \right|\cdot \left| y \right|}=\frac{\sum\limits_{i=1}^{n}{{{x}_{i}}{{y}_{i}}}}{\sqrt{\sum\limits_{i=1}^{n}{{{x}_{i}}^{2}}}\sqrt{\sum\limits_{i=1}^{n}{{{y}_{i}}^{2}}}} cos(θ)=xyxTy=i=1nxi2 i=1nyi2 i=1nxiyi
(4). Pearson皮尔逊相关系数:
ρ X Y = cov ⁡ ( X , Y ) σ X σ Y = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y = ∑ i = 1 n ( x − μ X ) ( y − μ Y ) ∑ i = 1 n ( x − μ X ) 2 ∑ i = 1 n ( y − μ Y ) 2 {{\rho }_{XY}}=\frac{\operatorname{cov}(X,Y)}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{E[(X-{{\mu }_{X}})(Y-{{\mu }_{Y}})]}{{{\sigma }_{X}}{{\sigma }_{Y}}}=\frac{\sum\limits_{i=1}^{n}{(x-{{\mu }_{X}})(y-{{\mu }_{Y}})}}{\sqrt{\sum\limits_{i=1}^{n}{{{(x-{{\mu }_{X}})}^{2}}}}\sqrt{\sum\limits_{i=1}^{n}{{{(y-{{\mu }_{Y}})}^{2}}}}} ρXY=σXσYcov(X,Y)=σXσYE[(XμX)(YμY)]=i=1n(xμX)2 i=1n(yμY)2 i=1n(xμX)(yμY)

Pearson相关系数即将 x x x y y y坐标向量各自平移到原点后的夹角余弦。

2.聚类的衡量指标

(1). 均一性: p p p

类似于精确率,一个簇中只包含一个类别的样本,则满足均一性。其实也可以认为就是正确率(每个 聚簇中正确分类的样本数占该聚簇总样本数的比例和)

(2). 完整性: r r r

类似于召回率,同类别样本被归类到相同簇中,则满足完整性;每个聚簇中正确分类的样本数占该
类型的总样本数比例的和

(3). V-measure:

均一性和完整性的加权平均

V = ( 1 + β 2 ) ∗ p r β 2 ∗ p + r V = \frac{(1+\beta^2)*pr}{\beta^2*p+r} V=β2p+r(1+β2)pr

(4). 轮廓系数

样本 i i i的轮廓系数: s ( i ) s(i) s(i)

簇内不相似度:计算样本 i i i到同簇其它样本的平均距离为 a ( i ) a(i) a(i),应尽可能小。

簇间不相似度:计算样本 i i i到其它簇 C j C_j Cj的所有样本的平均距离 b i j b_{ij} bij,应尽可能大。

轮廓系数: s ( i ) s(i) s(i)值越接近1表示样本 i i i聚类越合理,越接近-1,表示样本 i i i应该分类到 另外的簇中,近似为0,表示样本 i i i应该在边界上;所有样本的 s ( i ) s(i) s(i)的均值被成为聚类结果的轮廓系数。

s ( i ) = b ( i ) − a ( i ) m a x { a ( i ) , b ( i ) } s(i) = \frac{b(i)-a(i)}{max\{a(i),b(i)\}} s(i)=max{a(i),b(i)}b(i)a(i)

(5). ARI

数据集 S S S共有 N N N个元素, 两个聚类结果分别是:

X = { X 1 , X 2 , . . . , X r } , Y = { Y 1 , Y 2 , . . . , Y s } X=\{{{X}_{1}},{{X}_{2}},...,{{X}_{r}}\},Y=\{{{Y}_{1}},{{Y}_{2}},...,{{Y}_{s}}\} X={X1,X2,...,Xr},Y={Y1,Y2,...,Ys}

X X X Y Y Y的元素个数为:

a = { a 1 , a 2 , . . . , a r } , b = { b 1 , b 2 , . . . , b s } a=\{{{a}_{1}},{{a}_{2}},...,{{a}_{r}}\},b=\{{{b}_{1}},{{b}_{2}},...,{{b}_{s}}\} a={a1,a2,...,ar},b={b1,b2,...,bs}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDioCWC5-1575448595959)(/Ari11.png)]

记: n i j = ∣ X i ∩ Y i ∣ {{n}_{ij}}=\left| {{X}_{i}}\cap {{Y}_{i}} \right| nij=XiYi

A R I = ∑ i , j C n i j 2 − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 1 2 [ ( ∑ i C a i 2 ) + ( ∑ i C b i 2 ) ] − [ ( ∑ i C a i 2 ) ⋅ ( ∑ i C b i 2 ) ] / C n 2 ARI=\frac{\sum\limits_{i,j}{C_{{{n}_{ij}}}^{2}}-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}}{\frac{1}{2}\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)+\left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]-\left[ \left( \sum\limits_{i}{C_{{{a}_{i}}}^{2}} \right)\cdot \left( \sum\limits_{i}{C_{{{b}_{i}}}^{2}} \right) \right]/C_{n}^{2}} ARI=21[(iCai2)+(iCbi2)][(iCai2)(iCbi2)]/Cn2i,jCnij2[(iCai2)(iCbi2)]/Cn2

降维(Dimensionality Reduction)

动机一:数据压缩

参考视频: 14 - 1 - Motivation I_ Data Compression (10 min).mkv

这个视频,我想开始谈论第二种类型的无监督学习问题,称为降维。有几个不同的的原因使你可能想要做降维。一是数据压缩,后面我们会看了一些视频后,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快我们的学习算法。

但首先,让我们谈论降维是什么。作为一种生动的例子,我们收集的数据集,有许多,许多特征,我绘制两个在这里。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nu9YZqs8-1575448595960)(https://www.github.com/OneJane/blog/raw/master/小书匠/2373072a74d97a9f606981ffaf1dd53b.png)]
假设我们未知两个的特征: x 1 x_1 x1:长度:用厘米表示; x 2 x_2 x2:是用英寸表示同一物体的长度。

所以,这给了我们高度冗余表示,也许不是两个分开的特征 x 1 x_1 x1 x 2 x_2 x2,这两个基本的长度度量,也许我们想要做的是减少数据到一维,只有一个数测量这个长度。这个例子似乎有点做作,这里厘米英寸的例子实际上不是那么不切实际的,两者并没有什么不同。

将数据从二维降至一维:
假使我们要采用两种不同的仪器来测量一些东西的尺寸,其中一个仪器测量结果的单位是英寸,另一个仪器测量的结果是厘米,我们希望将测量的结果作为我们机器学习的特征。现在的问题的是,两种仪器对同一个东西测量的结果不完全相等(由于误差、精度等),而将两者都作为特征有些重复,因而,我们希望将这个二维的数据降至一维。

从这件事情我看到的东西发生在工业上的事。如果你有几百个或成千上万的特征,它是它这往往容易失去你需要的特征。有时可能有几个不同的工程团队,也许一个工程队给你二百个特征,第二工程队给你另外三百个的特征,第三工程队给你五百个特征,一千多个特征都在一起,它实际上会变得非常困难,去跟踪你知道的那些特征,你从那些工程队得到的。其实不想有高度冗余的特征一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6OZmLmq-1575448595961)(https://www.github.com/OneJane/blog/raw/master/小书匠/2c95b316a3c61cf076ef132d3d50b51c.png)]
多年我一直在研究直升飞机自动驾驶。诸如此类。如果你想测量——如果你想做,你知道,做一个调查或做这些不同飞行员的测试——你可能有一个特征: x 1 x_1 x1,这也许是他们的技能(直升机飞行员),也许 x 2 x_2 x2可能是飞行员的爱好。这是表示他们是否喜欢飞行,也许这两个特征将高度相关。你真正关心的可能是这条红线的方向,不同的特征,决定飞行员的能力。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mba2o9de-1575448595961)(https://www.github.com/OneJane/blog/raw/master/小书匠/8274f0c29314742e9b4f15071ea7624a.png)]
将数据从三维降至二维:
这个例子中我们要将一个三维的特征向量降至一个二维的特征向量。过程是与上面类似的,我们将三维向量投射到一个二维的平面上,强迫使得所有的数据都在同一个平面上,降至二维的特征向量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPlxBxn9-1575448595962)(https://www.github.com/OneJane/blog/raw/master/小书匠/8274f0c29314742e9b4f15071ea7624a.png)]
这样的处理过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000维的特征降至100维。

正如我们所看到的,最后,这将使我们能够使我们的一些学习算法运行也较晚,但我们会在以后的视频提到它。

动机二:数据可视化

参考视频: 14 - 2 - Motivation II_ Visualization (6 min).mkv

在许多及其学习问题中,如果我们能将数据可视化,我们便能寻找到一个更好的解决方案,降维可以帮助我们。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUFFxoCv-1575448595963)(https://www.github.com/OneJane/blog/raw/master/小书匠/789d90327121d3391735087b9276db2a.png)]
假使我们有有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP,人均GDP,平均寿命等)。如果要将这个50维的数据可视化是不可能的。使用降维的方法将其降至2维,我们便可以将其可视化了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyMmsKAy-1575448595964)(https://www.github.com/OneJane/blog/raw/master/小书匠/789d90327121d3391735087b9276db2a.png)]
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。

主成分分析问题

参考视频: 14 - 3 - Principal Component Analysis Problem Formulation (9 min). mkv

主成分分析(PCA)是最常见的降维算法。

PCA中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IPYWGJNs-1575448595964)(https://www.github.com/OneJane/blog/raw/master/小书匠/a93213474b35ce393320428996aeecd9.jpg)]
下面给出主成分分析问题的描述:

问题是要将 n n n维数据降至 k k k维,目标是找到向量 u ( 1 ) u^{(1)} u(1), u ( 2 ) u^{(2)} u(2),…, u ( k ) u^{(k)} u(k)使得总的投射误差最小。主成分分析与线性回顾的比较:

主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtG8ysCE-1575448595965)(https://www.github.com/OneJane/blog/raw/master/小书匠/7e1389918ab9358d1432d20ed20f8142.png)]
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。

PCA n n n个特征降维到 k k k个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的KL变换使用PCA做图像压缩。但PCA 要保证降维后,还要保证数据的特性损失最小。

PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。

PCA技术的一个很大的优点是,它是完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。

但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。

主成分分析算法

参考视频: 14 - 4 - Principal Component Analysis Algorithm (15 min).mkv

PCA 减少 n n n维到 k k k维:

第一步是均值归一化。我们需要计算出所有特征的均值,然后令 x j = x j − μ j x_j= x_j-μ_j xj=xjμj。如果特征是在不同的数量级上,我们还需要将其除以标准差 σ 2 σ^2 σ2

第二步是计算协方差矩阵covariance matrix Σ Σ Σ
∑ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} =m1i=1n(x(i))(x(i))T

第三步是计算协方差矩阵 Σ Σ Σ特征向量eigenvectors):

Octave 里我们可以利用奇异值分解singular value decomposition)来求解,[U, S, V]= svd(sigma)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ixxNS9P-1575448595966)(https://www.github.com/OneJane/blog/raw/master/小书匠/0918b38594709705723ed34bb74928ba.png)]
S i g m a = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T} Sigma=m1i=1n(x(i))(x(i))T

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjTsHcAn-1575448595967)(https://www.github.com/OneJane/blog/raw/master/小书匠/01e1c4a2f29a626b5980a27fc7d6a693.png)]
对于一个 n × n n×n n×n维度的矩阵,上式中的 U U U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从 n n n维降至 k k k维,我们只需要从 U U U中选取前 k k k个向量,获得一个 n × k n×k n×k维度的矩阵,我们用 U r e d u c e U_{reduce} Ureduce表示,然后通过如下计算获得要求的新特征向量 z ( i ) z^{(i)} z(i):
z ( i ) = U r e d u c e T ∗ x ( i ) z^{(i)}=U^{T}_{reduce}*x^{(i)} z(i)=UreduceTx(i)

其中 x x x n × 1 n×1 n×1维的,因此结果为 k × 1 k×1 k×1维度。注,我们不对方差特征进行处理。

选择主成分的数量

参考视频: 14 - 5 - Choosing The Number Of Principal Components (13 min).mkv

主要成分分析是减少投射的平均均方误差:

训练集的方差为: 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 \dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }\right\| ^{2} m1i=1mx(i)2

我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的 k k k值。

如果我们希望这个比例小于1%,就意味着原本数据的偏差有99%都保留下来了,如果我们选择保留95%的偏差,便能非常显著地降低模型中特征的维度了。

我们可以先令 k = 1 k=1 k=1,然后进行主要成分分析,获得 U r e d u c e U_{reduce} Ureduce z z z,然后计算比例是否小于1%。如果不是的话再令 k = 2 k=2 k=2,如此类推,直到找到可以使得比例小于1%的最小 k k k 值(原因是各个特征之间通常情况存在某种相关性)。

还有一些更好的方式来选择 k k k,当我们在Octave中调用“svd”函数的时候,我们获得三个参数:[U, S, V] = svd(sigma)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xmjxRw6-1575448595967)(https://www.github.com/OneJane/blog/raw/master/小书匠/a4477d787f876ae4e72cb416a2cb0b8a.jpg)]
其中的 S S S是一个 n × n n×n n×n的矩阵,只有对角线上有值,而其它单元都是0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
1 m ∑ i = 1 m ∥ x ( i ) − x a p p r o x ( i ) ∥ 2 1 m ∑ i = 1 m ∥ x ( i ) ∥ 2 = 1 − Σ i = 1 k S i i Σ i = 1 m S i i ≤ 1 % \dfrac {\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{\left( i\right) }-x^{\left( i\right) }_{approx}\right\| ^{2}}{\dfrac {1}{m}\sum^{m}_{i=1}\left\| x^{(i)}\right\| ^{2}}=1-\dfrac {\Sigma^{k}_{i=1}S_{ii}}{\Sigma^{m}_{i=1}S_{ii}}\leq 1\% m1i=1mx(i)2m1i=1mx(i)xapprox(i)2=1Σi=1mSiiΣi=1kSii1%

也就是: Σ i = 1 k s i i Σ i = 1 n s i i ≥ 0.99 \frac {\Sigma^{k}_{i=1}s_{ii}}{\Sigma^{n}_{i=1}s_{ii}}\geq0.99 Σi=1nsiiΣi=1ksii0.99

在压缩过数据后,我们可以采用如下方法来近似地获得原有的特征: x a p p r o x ( i ) = U r e d u c e z ( i ) x^{\left( i\right) }_{approx}=U_{reduce}z^{(i)} xapprox(i)=Ureducez(i)

重建的压缩表示

参考视频: 14 - 6 - Reconstruction from Compressed Representation (4 min).mkv

在以前的视频中,我谈论PCA作为压缩算法。在那里你可能需要把1000维的数据压缩100维特征,或具有三维数据压缩到一二维表示。所以,如果这是一个压缩算法,应该能回到这个压缩表示,回到你原有的高维数据的一种近似。

所以,给定的 z ( i ) z^{(i)} z(i),这可能100维,怎么回到你原来的表示 x ( i ) x^{(i)} x(i),这可能是1000维的数组?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtEcbyq1-1575448595968)(https://www.github.com/OneJane/blog/raw/master/小书匠/0a4edcb9c0d0a3812a50b3e95ef3912a.png)]
PCA算法,我们可能有一个这样的样本。如图中样本 x ( 1 ) x^{(1)} x(1), x ( 2 ) x^{(2)} x(2)。我们做的是,我们把这些样本投射到图中这个一维平面。然后现在我们需要只使用一个实数,比如 z ( 1 ) z^{(1)} z(1),指定这些点的位置后他们被投射到这一个三维曲面。给定一个点 z ( 1 ) z^{(1)} z(1),我们怎么能回去这个原始的二维空间呢? x x x为2维, z z z为1维, z = U r e d u c e T x z=U^{T}_{reduce}x z=UreduceTx,相反的方程为: x a p p o x = U r e d u c e ⋅ z x_{appox}=U_{reduce}\cdot z xappox=Ureducez, x a p p o x ≈ x x_{appox}\approx x xappoxx。如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6g2Tzzn-1575448595969)(https://www.github.com/OneJane/blog/raw/master/小书匠/66544d8fa1c1639d80948006f7f4a8ff.png)]
如你所知,这是一个漂亮的与原始数据相当相似。所以,这就是你从低维表示 z z z回到未压缩的表示。我们得到的数据的一个之间你的原始数据 x x x,我们也把这个过程称为重建原始数据。

当我们认为试图重建从压缩表示 x x x 的初始值。所以,给定未标记的数据集,您现在知道如何应用PCA,你的带高维特征 x x x和映射到这的低维表示 z z z。这个视频,希望你现在也知道如何采取这些低维表示 z z z,映射到备份到一个近似你原有的高维数据。

现在你知道如何实施应用PCA,我们将要做的事是谈论一些技术在实际使用PCA很好,特别是,在接下来的视频中,我想谈一谈关于如何选择 k k k

主成分分析法的应用建议

参考视频: 14 - 7 - Advice for Applying PCA (13 min).mkv

假使我们正在针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000 个特征。

  1. 第一步是运用主要成分分析将数据压缩至1000个特征

  2. 然后对训练集运行学习算法

     3. 在预测时,采用之前学习而来的$U_{reduce}$将输入的特征$x$转换成特征向量$z$,然后再进行预测

注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的 U r e d u c e U_{reduce} Ureduce

错误的主要成分分析情况:一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。

另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。

异常检测(Anomaly Detection)

问题的动机

参考文档: 15 - 1 - Problem Motivation (8 min).mkv

在接下来的一系列视频中,我将向大家介绍异常检测(Anomaly detection)问题。这是机器学习算法的一个常见应用。这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。

什么是异常检测呢?为了解释这个概念,让我举一个例子吧:

假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HYhAsZ0V-1575448595970)(https://www.github.com/OneJane/blog/raw/master/小书匠/93d6dfe7e5cb8a46923c178171889747.png)]
这样一来,你就有了一个数据集,从 x ( 1 ) x^{(1)} x(1) x ( m ) x^{(m)} x(m),如果你生产了 m m m个引擎的话,你将这些数据绘制成图表,看起来就是这个样子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jbxx1zIr-1575448595971)(https://www.github.com/OneJane/blog/raw/master/小书匠/fe4472adbf6ddd9d9b51d698cc750b68.png)]
这里的每个点、每个叉,都是你的无标签数据。这样,异常检测问题可以定义如下:我们假设后来有一天,你有一个新的飞机引擎从生产线上流出,而你的新飞机引擎有特征变量 x t e s t x_{test} xtest。所谓的异常检测问题就是:我们希望知道这个新的飞机引擎是否有某种异常,或者说,我们希望判断这个引擎是否需要进一步测试。因为,如果它看起来像一个正常的引擎,那么我们可以直接将它运送到客户那里,而不需要进一步的测试。

给定数据集 x ( 1 ) , x ( 2 ) , . . , x ( m ) x^{(1)},x^{(2)},..,x^{(m)} x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据 x t e s t x_{test} xtest 是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性 p ( x ) p(x) p(x)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmIP0k9X-1575448595972)(https://www.github.com/OneJane/blog/raw/master/小书匠/65afdea865d50cba12d4f7674d599de5.png)]
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。

这种方法称为密度估计,表达如下:

$$
if \quad p(x)
\begin{cases}
< \varepsilon & anomaly \

=\varepsilon & normal
\end{cases}
$$

欺诈检测:

x ( i ) = 用 户 的 第 i 个 活 动 特 征 x^{(i)} = {用户的第i个活动特征} x(i)=i

模型 p ( x ) p(x) p(x) 为我们其属于一组数据的可能性,通过 p ( x ) < ε p(x) < \varepsilon p(x)<ε检测非正常用户。

异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。

再一个例子是检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量,CPU的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。

高斯分布

参考视频: 15 - 2 - Gaussian Distribution (10 min).mkv

在这个视频中,我将介绍高斯分布,也称为正态分布。回顾高斯分布的基本知识。

通常如果我们认为变量 x x x 符合高斯分布 x ∼ N ( μ , σ 2 ) x \sim N(\mu, \sigma^2) xN(μ,σ2)则其概率密度函数为:
p ( x , μ , σ 2 ) = 1 2 π σ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) p(x,\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) p(x,μ,σ2)=2π σ1exp(2σ2(xμ)2)
我们可以利用已有的数据来预测总体中的 μ μ μ σ 2 σ^2 σ2的计算方法如下:
μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum\limits_{i=1}^{m}x^{(i)} μ=m1i=1mx(i)

σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 \sigma^2=\frac{1}{m}\sum\limits_{i=1}^{m}(x^{(i)}-\mu)^2 σ2=m1i=1m(x(i)μ)2

高斯分布样例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbV16trL-1575448595972)(https://www.github.com/OneJane/blog/raw/master/小书匠/fcb35433507a56631dde2b4e543743ee.png)]
注:机器学习中对于方差我们通常只除以 m m m而非统计学中的 ( m − 1 ) (m-1) (m1)。这里顺便提一下,在实际使用中,到底是选择使用 1 / m 1/m 1/m还是 1 / ( m − 1 ) 1/(m-1) 1/(m1)其实区别很小,只要你有一个还算大的训练集,在机器学习领域大部分人更习惯使用 1 / m 1/m 1/m这个版本的公式。这两个版本的公式在理论特性和数学特性上稍有不同,但是在实际使用中,他们的区别甚小,几乎可以忽略不计。

算法

参考视频: 15 - 3 - Algorithm (12 min).mkv

在本节视频中,我将应用高斯分布开发异常检测算法。

异常检测算法:

对于给定的数据集 x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)},x^{(2)},...,x^{(m)} x(1),x(2),...,x(m),我们要针对每一个特征计算 μ \mu μ σ 2 \sigma^2 σ2 的估计值。

μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac{1}{m}\sum\limits_{i=1}^{m}x_j^{(i)} μj=m1i=1mxj(i)

σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 \sigma_j^2=\frac{1}{m}\sum\limits_{i=1}^m(x_j^{(i)}-\mu_j)^2 σj2=m1i=1m(xj(i)μj)2

一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p ( x ) p(x) p(x)

p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = ∏ j = 1 1 1 2 π σ j e x p ( − ( x j − μ j ) 2 2 σ j 2 ) p(x)=\prod\limits_{j=1}^np(x_j;\mu_j,\sigma_j^2)=\prod\limits_{j=1}^1\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}) p(x)=j=1np(xj;μj,σj2)=j=112π σj1exp(2σj2(xjμj)2)

p ( x ) < ε p(x) < \varepsilon p(x)<ε时,为异常。

下图是一个由两个特征的训练集,以及特征的分布情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEpJPxfL-1575448595973)(https://www.github.com/OneJane/blog/raw/master/小书匠/ba47767a11ba39a23898b9f1a5a57cc5.png)]
下面的三维图表表示的是密度估计函数, z z z轴为根据两个特征的值所估计 p ( x ) p(x) p(x)值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sl4uoQuV-1575448595973)(https://www.github.com/OneJane/blog/raw/master/小书匠/82b90f56570c05966da116c3afe6fc91.jpg)]
我们选择一个 ε \varepsilon ε,将 p ( x ) = ε p(x) = \varepsilon p(x)=ε作为我们的判定边界,当 p ( x ) > ε p(x) > \varepsilon p(x)>ε时预测数据为正常数据,否则为异常。

在这段视频中,我们介绍了如何拟合 p ( x ) p(x) p(x),也就是 x x x的概率值,以开发出一种异常检测算法。同时,在这节课中,我们也给出了通过给出的数据集拟合参数,进行参数估计,得到参数 μ \mu μ σ \sigma σ,然后检测新的样本,确定新样本是否是异常。

在接下来的课程中,我们将深入研究这一算法,同时更深入地介绍,怎样让算法工作地更加有效。

开发和评价一个异常检测系统

参考视频: 15 - 4 - Developing and Evaluating an Anomaly Detection System (13 min). mkv

异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 $ y$ 的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。

例如:我们有10000台正常引擎的数据,有20台异常引擎的数据。 我们这样分配数据:

6000台正常引擎的数据作为训练集

2000台正常引擎和10台异常引擎的数据作为交叉检验集

2000台正常引擎和10台异常引擎的数据作为测试集

具体的评价方法如下:

  1. 根据测试集数据,我们估计特征的平均值和方差并构建 p ( x ) p(x) p(x)函数

  2. 对交叉检验集,我们尝试使用不同的 ε \varepsilon ε值作为阀值,并预测数据是否异常,根据 F 1 F1 F1值或者查准率与查全率的比例来选择 ε \varepsilon ε

  3. 选出 ε \varepsilon ε 后,针对测试集进行预测,计算异常检验系统的 F 1 F1 F1值,或者查准率与查全率之比

异常检测与监督学习对比

参考视频: 15 - 5 - Anomaly Detection vs. Supervised Learning (8 min).mkv

之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对比有助于选择采用监督学习还是异常检测:

两者比较:

异常检测 监督学习
非常少量的正向类(异常数据 y = 1 y=1 y=1), 大量的负向类( y = 0 y=0 y=0 同时有大量的正向类和负向类
许多不同种类的异常,非常难。根据非常 少量的正向类数据来训练算法。 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似。
未来遇到的异常可能与已掌握的异常、非常的不同。
例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况 例如:邮件过滤器 天气预报 肿瘤分类

希望这节课能让你明白一个学习问题的什么样的特征,能让你把这个问题当做是一个异常检测,或者是一个监督学习的问题。另外,对于很多技术公司可能会遇到的一些问题,通常来说,正样本的数量很少,甚至有时候是0,也就是说,出现了太多没见过的不同的异常类型,那么对于这些问题,通常应该使用的算法就是异常检测算法。

选择特征

参考视频: 15 - 6 - Choosing What Features to Use (12 min).mkv

对于异常检测算法,我们使用的特征是至关重要的,下面谈谈如何选择特征:

异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数: x = l o g ( x + c ) x= log(x+c) x=log(x+c),其中 c c c 为非负常数; 或者 x = x c x=x^c x=xc c c c为 0-1 之间的一个分数,等方法。(编者注:在python中,通常用np.log1p()函数, l o g 1 p log1p log1p就是 l o g ( x + 1 ) log(x+1) log(x+1),可以避免出现负数结果,反向函数就是np.expm1())

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F1m3Bx3L-1575448595974)(https://www.github.com/OneJane/blog/raw/master/小书匠/0990d6b7a5ab3c0036f42083fe2718c6.jpg)]
误差分析:

一个常见的问题是一些异常的数据可能也会有较高的 p ( x ) p(x) p(x)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。

异常检测误差分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcdFxOFe-1575448595974)(https://www.github.com/OneJane/blog/raw/master/小书匠/f406bc738e5e032be79e52b6facfa48e.png)]
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。

在这段视频中,我们介绍了如何选择特征,以及对特征进行一些小小的转换,让数据更像正态分布,然后再把数据输入异常检测算法。同时也介绍了建立特征时,进行的误差分析方法,来捕捉各种异常的可能。希望你通过这些方法,能够了解如何选择好的特征变量,从而帮助你的异常检测算法,捕捉到各种不同的异常情况。

多元高斯分布(选修)

参考视频: 15 - 7 - Multivariate Gaussian Distribution (Optional) (14 min).mkv

假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。

下图中是两个相关特征,洋红色的线(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的X所代表的数据点很可能是异常值,但是其 p ( x ) p(x) p(x)值却仍然在正常范围内。多元高斯分布将创建像图中蓝色曲线所示的判定边界。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S57Makdj-1575448595975)(https://www.github.com/OneJane/blog/raw/master/小书匠/598db991a7c930c9021cec5f6ab9beb9.png)]
在一般的高斯分布模型中,我们计算 p ( x ) p(x) p(x) 的方法是:
通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算 p ( x ) p(x) p(x)

我们首先计算所有特征的平均值,然后再计算协方差矩阵:
p ( x ) = ∏ j = 1 n p ( x j ; μ , σ j 2 ) = ∏ j = 1 n 1 2 π σ j e x p ( − ( x j − μ j ) 2 2 σ j 2 ) p(x)=\prod_{j=1}^np(x_j;\mu,\sigma_j^2)=\prod_{j=1}^n\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}) p(x)=j=1np(xj;μ,σj2)=j=1n2π σj1exp(2σj2(xjμj)2)

μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum_{i=1}^mx^{(i)} μ=m1i=1mx(i)

Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T = 1 m ( X − μ ) T ( X − μ ) \Sigma = \frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T=\frac{1}{m}(X-\mu)^T(X-\mu) Σ=m1i=1m(x(i)μ)(x(i)μ)T=m1(Xμ)T(Xμ)

注:其中$\mu $ 是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。最后我们计算多元高斯分布的 p ( x ) p\left( x \right) p(x):
p ( x ) = 1 ( 2 π ) n 2 ∣ Σ ∣ 1 2 e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p(x)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}exp\left(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\right) p(x)=(2π)2nΣ211exp(21(xμ)TΣ1(xμ))
其中:

∣ Σ ∣ |\Sigma| Σ是定矩阵,在 Octave 中用 det(sigma)计算

Σ − 1 \Sigma^{-1} Σ1 是逆矩阵,下面我们来看看协方差矩阵是如何影响模型的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvVwMFoi-1575448595976)(https://www.github.com/OneJane/blog/raw/master/小书匠/29df906704d254f18e92a63173dd51e7.jpg)]
上图是5个不同的模型,从左往右依次分析:

  1. 是一个一般的高斯分布模型

  2. 通过协方差矩阵,令特征1拥有较小的偏差,同时保持特征2的偏差

  3. 通过协方差矩阵,令特征2拥有较大的偏差,同时保持特征1的偏差

  4. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的正相关性

  5. 通过协方差矩阵,在不改变两个特征的原有偏差的基础上,增加两者之间的负相关性

多元高斯分布模型与原高斯分布模型的关系:

可以证明的是,原本的高斯分布模型是多元高斯分布模型的一个子集,即像上图中的第1、2、3,3个例子所示,如果协方差矩阵只在对角线的单位上有非零的值时,即为原本的高斯分布模型了。

原高斯分布模型和多元高斯分布模型的比较:

原高斯分布模型 多元高斯分布模型
不能捕捉特征之间的相关性 但可以通过将特征进行组合的方法来解决 自动捕捉特征之间的相关性
计算代价低,能适应大规模的特征 计算代价较高 训练集较小时也同样适用
必须要有 m > n m>n m>n,不然的话协方差矩阵 Σ \Sigma Σ不可逆的,通常需要 m > 10 n m>10n m>10n 另外特征冗余也会导致协方差矩阵不可逆

原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。

如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。

使用多元高斯分布进行异常检测(可选)

参考视频: 15 - 8 - Anomaly Detection using the Multivariate Gaussian Distribution (Optional) (14 min).mkv

在我们谈到的最后一个视频,关于多元高斯分布,看到的一些建立的各种分布模型,当你改变参数, μ \mu μ Σ \Sigma Σ。在这段视频中,让我们用这些想法,并应用它们制定一个不同的异常检测算法。

要回顾一下多元高斯分布和多元正态分布:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRd5wdVp-1575448595977)(https://www.github.com/OneJane/blog/raw/master/小书匠/3dbee365617e9264831400e4de247adc.png)]
分布有两个参数, μ \mu μ Σ \Sigma Σ。其中 μ \mu μ这一个 n n n维向量和 Σ \Sigma Σ 的协方差矩阵,是一种 n × n n\times n n×n的矩阵。而这里的公式 x x x的概率,如按 μ \mu μ 和参数化 Σ \Sigma Σ,和你的变量 μ \mu μ Σ \Sigma Σ,你可以得到一个范围的不同分布一样,你知道的,这些都是三个样本,那些我们在以前的视频看过了。

因此,让我们谈谈参数拟合或参数估计问题:

我有一组样本 x ( 1 ) , x ( 2 ) , . . . , x ( m ) {{{ x^{(1)},x^{(2)},...,x^{(m)}} }} x(1),x(2),...,x(m)是一个 n n n维向量,我想我的样本来自一个多元高斯分布。我如何尝试估计我的参数 μ \mu μ Σ \Sigma Σ 以及标准公式?

估计他们是你设置 μ \mu μ 是你的训练样本的平均值。

μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)} μ=m1i=1mx(i)
并设置 Σ \Sigma Σ
Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T \Sigma=\frac{1}{m}\sum_{i=1}^{m}(x^{(i)}-\mu)(x^{(i)}-\mu)^T Σ=m1i=1m(x(i)μ)(x(i)μ)T
这其实只是当我们使用PCA算法时候,有 Σ \Sigma Σ 时写出来。所以你只需插入上述两个公式,这会给你你估计的参数 μ \mu μ 和你估计的参数 Σ \Sigma Σ。所以,这里给出的数据集是你如何估计 μ \mu μ Σ \Sigma Σ。让我们以这种方法而只需将其插入到异常检测算法。那么,我们如何把所有这一切共同开发一个异常检测算法?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmhl92lm-1575448595977)(https://www.github.com/OneJane/blog/raw/master/小书匠/d1a228f2bec262f2206379ed844c7f4a.png)]
首先,我们把我们的训练集,和我们的拟合模型,我们计算 p ( x ) p(x) p(x),要知道,设定 μ \mu μ和描述的一样 Σ \Sigma Σ

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nr3ksad1-1575448595978)(https://www.github.com/OneJane/blog/raw/master/小书匠/015cee3a224dde6da0181215cf91a23d.png)]
如图,该分布在中央最多,越到外面的圈的范围越小。

并在该点是出路这里的概率非常低。

原始模型与多元高斯模型的关系如图:

其中:协方差矩阵 Σ \Sigma Σ为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9O5Fd6P4-1575448595978)(https://www.github.com/OneJane/blog/raw/master/小书匠/7104dd2548f1251e4c423e059d1d2594.png)]
原始模型和多元高斯分布比较如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Va7c3FmF-1575448595978)(https://www.github.com/OneJane/blog/raw/master/小书匠/f4585239738f2b5149608879fa166889.png)]

推荐系统(Recommender Systems)

问题形式化

参考视频: 16 - 1 - Problem Formulation (8 min).mkv

在接下来的视频中,我想讲一下推荐系统。我想讲推荐系统有两个原因:

第一、仅仅因为它是机器学习中的一个重要的应用。在过去几年,我偶尔访问硅谷不同的技术公司,我常和工作在这儿致力于机器学习应用的人们聊天,我常问他们,最重要的机器学习的应用是什么,或者,你最想改进的机器学习应用有哪些。我最常听到的答案是推荐系统。现在,在硅谷有很多团体试图建立很好的推荐系统。因此,如果你考虑网站像亚马逊,或网飞公司或易趣,或iTunes Genius,有很多的网站或系统试图推荐新产品给用户。如,亚马逊推荐新书给你,网飞公司试图推荐新电影给你,等等。这些推荐系统,根据浏览你过去买过什么书,或过去评价过什么电影来判断。这些系统会带来很大一部分收入,比如为亚马逊和像网飞这样的公司。因此,对推荐系统性能的改善,将对这些企业的有实质性和直接的影响。

推荐系统是个有趣的问题,在学术机器学习中因此,我们可以去参加一个学术机器学习会议,推荐系统问题实际上受到很少的关注,或者,至少在学术界它占了很小的份额。但是,如果你看正在发生的事情,许多有能力构建这些系统的科技企业,他们似乎在很多企业中占据很高的优先级。这是我为什么在这节课讨论它的原因之一。

我想讨论推荐系统地第二个原因是:这个班视频的最后几集我想讨论机器学习中的一些大思想,并和大家分享。这节课我们也看到了,对机器学习来说,特征是很重要的,你所选择的特征,将对你学习算法的性能有很大的影响。因此,在机器学习中有一种大思想,它针对一些问题,可能并不是所有的问题,而是一些问题,有算法可以为你自动学习一套好的特征。因此,不要试图手动设计,而手写代码这是目前为止我们常干的。有一些设置,你可以有一个算法,仅仅学习其使用的特征,推荐系统就是类型设置的一个例子。还有很多其它的,但是通过推荐系统,我们将领略一小部分特征学习的思想,至少,你将能够了解到这方面的一个例子,我认为,机器学习中的大思想也是这样。因此,让我们开始讨论推荐系统问题形式化。

我们从一个例子开始定义推荐系统的问题。

假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QJvO5jyJ-1575448595979)(https://www.github.com/OneJane/blog/raw/master/小书匠/c2822f2c28b343d7e6ade5bd40f3a1fc.png)]
前三部电影是爱情片,后两部则是动作片,我们可以看出AliceBob似乎更倾向与爱情片, 而 CarolDave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。

下面引入一些标记:

n u n_u nu 代表用户的数量

n m n_m nm 代表电影的数量

r ( i , j ) r(i, j) r(i,j) 如果用户j给电影 i i i 评过分则 r ( i , j ) = 1 r(i,j)=1 r(i,j)=1

y ( i , j ) y^{(i, j)} y(i,j) 代表用户 j j j 给电影 i i i的评分

m j m_j mj代表用户 j j j 评过分的电影的总数

基于内容的推荐系统

参考视频: 16 - 2 - Content Based Recommendations (15 min).mkv

在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。

在我们的例子中,我们可以假设每部电影都有两个特征,如 x 1 x_1 x1代表电影的浪漫程度, x 2 x_2 x2 代表电影的动作程度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTauXYSY-1575448595980)(https://www.github.com/OneJane/blog/raw/master/小书匠/747c1fd6bff694c6034da1911aa3314b.png)]
则每部电影都有一个特征向量,如 x ( 1 ) x^{(1)} x(1)是第一部电影的特征向量为[0.9 0]。

下面我们要基于这些特征来构建一个推荐系统算法。
假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如 θ ( 1 ) {{\theta }^{(1)}} θ(1)是第一个用户的模型的参数。
于是,我们有:

θ ( j ) \theta^{(j)} θ(j)用户 j j j 的参数向量

x ( i ) x^{(i)} x

你可能感兴趣的:(人工智能)