From d2d9f6ced6d087b22d8c798462543d4ce8fdd5ad Mon Sep 17 00:00:00 2001 From: scruel Date: Thu, 11 Jan 2018 13:39:52 +0800 Subject: [PATCH] finish 6.4 & 6.5 --- image/20180111_080314.png | Bin 0 -> 9669 bytes image/20180111_080514.png | Bin 0 -> 8774 bytes image/20180111_080614.png | Bin 0 -> 52430 bytes week1.html | 2 +- week1.md | 14 +++--- week2.html | 4 +- week2.md | 24 +++++---- week3.html | 11 ++++- week3.md | 123 +++++++++++++++++++++++++++++++++++++++------- 9 files changed, 138 insertions(+), 40 deletions(-) create mode 100644 image/20180111_080314.png create mode 100644 image/20180111_080514.png create mode 100644 image/20180111_080614.png diff --git a/image/20180111_080314.png b/image/20180111_080314.png new file mode 100644 index 0000000000000000000000000000000000000000..dcdc945c6f6c7afc4cdd6779be246eb349bdb95f GIT binary patch literal 9669 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 literal 0 KcmV+b0RR6000031 diff --git a/image/20180111_080614.png b/image/20180111_080614.png new file mode 100644 index 0000000000000000000000000000000000000000..00bb12362a0b42792cce5f94a98e5405b571339e GIT binary patch literal 52430 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 literal 0 KcmV+b0RR6000031 diff --git a/week1.html b/week1.html index badb158..1559028 100644 --- a/week1.html +++ b/week1.html @@ -335,6 +335,6 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria

1. 引言(Introduction)

1.1 Welcome

随着互联网数据不断累积,硬件不断升级迭代,在这个信息爆炸的时代,机器学习已被应用在各行各业中,可谓无处不在。

一些常见的机器学习的应用,例如:

  • 手写识别
  • 垃圾邮件分类
  • 搜索引擎
  • 图像处理

使用到机器学习的一些案例:

  • 数据挖掘

    • 网页点击流数据分析
  • 人工无法处理的工作(量大)

    • 手写识别
    • 计算机视觉
  • 个人定制

    • 推荐系统
  • 研究大脑

  • ……

1.2 什么是机器学习(What is Machine Learning)

  1. 机器学习定义 这里主要有两种定义:

    • Arthur Samuel (1959). Machine Learning: Field of study that gives computers the ability to learn without being explicitly programmed.

      这个定义有点不正式但提出的时间最早,来自于一个懂得计算机编程的下棋菜鸟。他编写了一个程序,但没有显式地编程每一步该怎么走,而是让计算机自己和自己对弈,并不断地计算布局的好坏,来判断什么情况下获胜的概率高,从而积累经验,好似学习,最后,这个计算机程序成为了一个比他自己还厉害的棋手。

    • Tom Mitchell (1998) Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

      Tom Mitchell 的定义更为现代和正式。在过滤垃圾邮件这个例子中,电子邮件系统会根据用户对电子邮件的标记(是/不是垃圾邮件)不断学习,从而提升过滤垃圾邮件的准确率,定义中的三个字母分别代表:

      • T(Task): 过滤垃圾邮件任务。
      • P(Performance): 电子邮件系统过滤垃圾邮件的准确率。
      • E(Experience): 用户对电子邮件的标记。
  2. 机器学习算法

    主要有两种机器学习的算法分类

    1. 监督学习
    2. 无监督学习

    两者的区别为是否需要人工参与数据结果的标注。这两部分的内容占比很大,并且很重要,掌握好了可以在以后的应用中节省大把大把的时间~

    还有一些算法也属于机器学习领域,诸如:

    • 半监督学习: 介于监督学习于无监督学习之间
    • 推荐算法: 没错,就是那些个买完某商品后还推荐同款的某购物网站所用的算法。
    • 强化学习: 通过观察来学习如何做出动作,每个动作都会对环境有所影响,而环境的反馈又可以引导该学习算法。
    • 迁移学习

1.3 监督学习(Supervised Learning)

监督学习,即为教计算机如何去完成预测任务(有反馈),预先给一定数据量的输入和对应的结果即训练集,建模拟合,最后让计算机预测未知数据的结果。

监督学习一般有两种:

  1. 回归问题(Regression)

    回归问题即为预测一系列的连续值

    在房屋价格预测的例子中,给出了一系列的房屋面基数据,根据这些数据来预测任意面积的房屋价格。给出照片-年龄数据集,预测给定照片的年龄。

  2. 分类问题(Classification)

    分类问题即为预测一系列的离散值

    即根据数据预测被预测对象属于哪个分类。

    视频中举了癌症肿瘤这个例子,针对诊断结果,分别分类为良性或恶性。还例如垃圾邮件分类问题,也同样属于监督学习中的分类问题。

视频中提到支持向量机这个算法,旨在解决当特征量很大的时候(特征即如癌症例子中的肿块大小,颜色,气味等各种特征),计算机内存一定会不够用的情况。支持向量机能让计算机处理无限多个特征。

1.4 无监督学习(Unsupervised Learning)

相对于监督学习,训练集不会有人为标注的结果(无反馈),我们不会给出结果或无法得知训练集的结果是什么样,而是单纯由计算机通过无监督学习算法自行分析,从而“得出结果”。计算机可能会把特定的数据集归为几个不同的簇,故叫做聚类算法。

无监督学习一般分为两种:

  1. 聚类(Clustering)

    • 新闻聚合
    • DNA 个体聚类
    • 天文数据分析
    • 市场细分
    • 社交网络分析
  2. 非聚类(Non-clustering)

    • 鸡尾酒问题

新闻聚合

在例如谷歌新闻这样的网站中,每天后台都会收集成千上万的新闻,然后将这些新闻分组成一个个的新闻专题,这样一个又一个聚类,就是应用了无监督学习的结果。

鸡尾酒问题

在鸡尾酒会上,大家说话声音彼此重叠,几乎很难分辨出面前的人说了什么。我们很难对于这个问题进行数据标注,而这里的通过机器学习的无监督学习算法,就可以将说话者的声音同背景音乐分离出来,看视频,效果还不错呢~~。

嗯,这块是打打鸡血的,只需要一行代码就解决了问题,就是这么简单!当然,我没复现过 ^_^……

神奇的一行代码: [W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');

编程语言建议

在机器学习刚开始时,推荐使用 Octave 类的工程计算编程软件,因为在 C++ 或 Java 等编程语言中,编写对应的代码需要用到复杂的库以及要写大量的冗余代码,比较耗费时间,建议可以在学习过后再考虑使用其他语言来构建系统。 -另外,在做原型搭建的时候也应该先考虑使用类似于 Octave 这种便于计算的编程软件,当其已经可以工作后,才将模型移植到其他的高级编程语言中。

注:Octave 与 MATLAB 语法相近,由于 MATLAB 为商业软件,课程中使用开源且免费的 Octave。

机器学习领域发展迅速,现在也可使用 Tensorflow 等开源机器学习框架编写机器学习代码,这些框架十分友好,易于编写及应用。

2 单变量线性回归(Linear Regression with One Variable)

2.1 模型表示(Model Representation)

  1. 房价预测训练集

    Size in ()Price ($) in 1000's()
    2104460
    1416232
    1534315
    852178
    ......

房价预测训练集中,同时给出了输入 和输出结果 ,即给出了人为标注的”正确结果“,且预测的量是连续的,属于监督学习中的回归问题。

  1. 问题解决模型

其中 代表结果函数,也称为假设(hypothesis) 。这个函数 根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 的映射。

,为其中一种可行的表达式。

: 特征/输入变量。

上式中, 为参数, 的变化才决定了输出结果,不同以往,这里的 被我们视作已知(不论是数据集还是预测时的输入),所以怎样解得 以更好地拟合数据,成了求解该问题的最终问题。

单变量,即只有一个特征(如例子中房屋的面积这个特征)。

2.2 损失函数(Cost Function)

我们的目的在于求解预测结果 最接近于实际结果 的取值,则问题可表达为求解 的最小值

: 训练集中的样本总数

: 目标变量/输出变量

: 训练集中的实例

: 训练集中的第 个样本实例

上图展示了当 取不同值时, 对数据集的拟合情况,蓝色虚线部分代表建模误差(预测结果与实际结果之间的误差),我们的目标就是最小化所有误差之和。

为了求解最小值,引入损失函数(Cost Function)概念,用于度量建模误差。考虑到要计算最小值,应用二次函数对求和式建模,即应用统计学中的平方损失函数(最小二乘法):

系数 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉

讨论到这里,我们的问题就转化成了求解 的最小值

 

2.3 损失函数 - 直观理解1(Cost Function - Intuition I)

根据上节视频,列出如下定义:

  • 假设函数(Hypothesis):
  • 参数(Parameters):
  • 损失函数(Cost Function):
  • 目标(Goal):

为了直观理解损失函数到底是在做什么,先假设 ,并假设训练集有三个数据,分别为,这样在平面坐标系中绘制出 ,并分析 的变化。

右图 随着 的变化而变化,可见 时,,取得最小值,对应于左图青色直线,即函数 拟合程度最好的情况。

2.4 损失函数 - 直观理解2(Cost Function - Intuition II)

注:该部分由于涉及到了多变量成像,可能较难理解,要求只需要理解上节内容即可,该节如果不能较好理解可跳过。

给定数据集:

参数在 不恒为 时损失函数 关于 的3-D图像,图像中的高度为损失函数的值。

由于3-D图形不便于标注,所以将3-D图形转换为轮廓图(contour plot),下面用轮廓图(下图中的右图)来作直观理解,其中相同颜色的一个圈代表着同一高度(同一 值)。

时:

大概在 时:

上图中最中心的点(红点),近乎为图像中的最低点,也即损失函数的最小值,此时对应 对数据的拟合情况如左图所示,嗯,一看就拟合的很不错,预测应该比较精准啦。

2.5 梯度下降(Gradient Descent)

在特征量很大的情况下,即便是借用计算机来生成图像,人工的方法也很难读出 的最小值,并且大多数情况无法进行可视化,故引入梯度下降(Gradient Descent)方法,让计算机自动找出最小化损失函数时对应的 值。

梯度下降背后的思想是:开始时,我们随机选择一个参数组合即起始点,计算损失函数,然后寻找下一个能使得损失函数下降最多的参数组合。不断迭代,直到找到一个局部最小值(local minimum),由于下降的情况只考虑当前参数组合周围的情况,所以无法确定当前的局部最小值是否就是全局最小值(global minimum),不同的初始参数组合,可能会产生不同的局部最小值。

下图根据不同的起始点,产生了两个不同的局部最小值。

视频中举了下山的例子,即我们在山顶上的某个位置,为了下山,就不断地看一下周围下一步往哪走下山比较快,然后就迈出那一步,一直重复,直到我们到达山下的某一处陆地

梯度下降公式:

: 第 个特征参数

”:=“: 赋值操作符

: 学习速率(learning rate),

: 的偏导

公式中,学习速率决定了参数值变化的速率即”走多少距离“,而偏导这部分决定了下降的方向即”下一步往哪里“走(当然实际上的走多少距离是由偏导值给出的,学习速率起到调整后决定的作用),收敛处的局部最小值又叫做极小值,即”陆地“。

注意,在计算时要批量更新 ,即如上图中的左图所示,否则结果上会有所出入,原因不做细究。

2.6 梯度下降直观理解(Gradient Descent Intuition)

该节探讨 的梯度下降更新过程,即 ,此处为了数学定义上的精确性,用的是 ,如果不熟悉微积分学,就把它视作之前的 即可。

把红点定为初始点,切于初始点的红色直线的斜率,表示了函数 在初始点处有正斜率,也就是说它有正导数,则根据梯度下降公式 , 右边的结果是一个正值,即 向左边移动。这样不断重复,直到收敛(达到局部最小值,即斜率为0)。

初始 值(初始点)是任意的,若初始点恰好就在极小值点处,梯度下降算法将什么也不做()。

不熟悉斜率的话,就当斜率的值等于图中三角形的高度除以水平长度好啦,精确地求斜率的方法是求导。

 

对于学习速率 ,需要选取一个合适的值才能使得梯度下降算法运行良好。

  • 学习速率过小图示:

    收敛的太慢,需要更多次的迭代。

  • 学习速率过大图示:

    可能越过最低点,甚至导致无法收敛。

学习速率只需选定即可,不需要在运行梯度下降算法的时候进行动态改变,随着斜率越来越接近于0,损失函数的变化幅度会越来越小,直到收敛到局部极小值。

如图,品红色点为初始点,损失函数随着迭代的进行,变化的幅度越来越小。

最后,梯度下降不止可以用于线性回归中的损失函数,还通用于最小化其他的损失函数。

2.7 线性回归中的梯度下降(Gradient Descent For Linear Regression)

线性回归模型

梯度下降算法

直接将线性回归模型公式带入梯度下降公式可得出公式

对于 时,给出偏导计算公式的推导过程如下:

所以当 时:

所以当 时:

 

上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用所有的数据集 更新。

由于线性回归函数呈现碗状,且只有一个全局的最优值,所以函数一定总会收敛到全局最小值(学习速率不可过大)。同时,函数 被称为凸二次函数,而线性回归函数求解最小值问题属于凸函数优化问题

另外,使用循环求解,代码较为冗余,后面会讲到如何使用向量化(Vectorization)来简化代码并优化计算,使梯度下降运行的更快更好。

3 Linear Algebra Review

这部分,学过线性代数的可以复习一下,比较基础。笔记整理暂留。

3.1 Matrices and Vectors

Octave/Matlab 代码:

 

执行结果:

 

3.2 Addition and Scalar Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.3 Matrix Vector Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.4 Matrix Matrix Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.5 Matrix Multiplication Properties

Octave/Matlab 代码:

 

执行结果:

 

3.6 Inverse and Transpose

Octave/Matlab 代码:

 

执行结果:

 
+另外,在做原型搭建的时候也应该先考虑使用类似于 Octave 这种便于计算的编程软件,当其已经可以工作后,才将模型移植到其他的高级编程语言中。

注:Octave 与 MATLAB 语法相近,由于 MATLAB 为商业软件,课程中使用开源且免费的 Octave。

机器学习领域发展迅速,现在也可使用 Tensorflow 等开源机器学习框架编写机器学习代码,这些框架十分友好,易于编写及应用。

2 单变量线性回归(Linear Regression with One Variable)

2.1 模型表示(Model Representation)

  1. 房价预测训练集

    Size in ()Price ($) in 1000's()
    2104460
    1416232
    1534315
    852178
    ......

房价预测训练集中,同时给出了输入 和输出结果 ,即给出了人为标注的”正确结果“,且预测的量是连续的,属于监督学习中的回归问题。

  1. 问题解决模型

其中 代表结果函数,也称为假设(hypothesis) 。假设函数根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 的映射。

,为解决房价问题的一种可行表达式。

: 特征/输入变量。

上式中, 为参数, 的变化才决定了输出结果,不同以往,这里的 被我们视作已知(不论是数据集还是预测时的输入),所以怎样解得 以更好地拟合数据,成了求解该问题的最终问题。

单变量,即只有一个特征(如例子中房屋的面积这个特征)。

2.2 损失函数(Cost Function)

我们的目的在于求解预测结果 最接近于实际结果 的取值,则问题可表达为求解 的最小值

: 训练集中的样本总数

: 目标变量/输出变量

: 训练集中的实例

: 训练集中的第 个样本实例

上图展示了当 取不同值时, 对数据集的拟合情况,蓝色虚线部分代表建模误差(预测结果与实际结果之间的误差),我们的目标就是最小化所有误差之和。

为了求解最小值,引入损失函数(Cost Function)概念,用于度量建模误差。考虑到要计算最小值,应用二次函数对求和式建模,即应用统计学中的平方损失函数(最小二乘法):

: 的预测值

系数 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉

讨论到这里,我们的问题就转化成了求解 的最小值

2.3 损失函数 - 直观理解1(Cost Function - Intuition I)

根据上节视频,列出如下定义:

  • 假设函数(Hypothesis):
  • 参数(Parameters):
  • 损失函数(Cost Function):
  • 目标(Goal):

为了直观理解损失函数到底是在做什么,先假设 ,并假设训练集有三个数据,分别为,这样在平面坐标系中绘制出 ,并分析 的变化。

右图 随着 的变化而变化,可见 时,,取得最小值,对应于左图青色直线,即函数 拟合程度最好的情况。

2.4 损失函数 - 直观理解2(Cost Function - Intuition II)

注:该部分由于涉及到了多变量成像,可能较难理解,要求只需要理解上节内容即可,该节如果不能较好理解可跳过。

给定数据集:

参数在 不恒为 时损失函数 关于 的3-D图像,图像中的高度为损失函数的值。

由于3-D图形不便于标注,所以将3-D图形转换为轮廓图(contour plot),下面用轮廓图(下图中的右图)来作直观理解,其中相同颜色的一个圈代表着同一高度(同一 值)。

时:

大概在 时:

上图中最中心的点(红点),近乎为图像中的最低点,也即损失函数的最小值,此时对应 对数据的拟合情况如左图所示,嗯,一看就拟合的很不错,预测应该比较精准啦。

2.5 梯度下降(Gradient Descent)

在特征量很大的情况下,即便是借用计算机来生成图像,人工的方法也很难读出 的最小值,并且大多数情况无法进行可视化,故引入梯度下降(Gradient Descent)方法,让计算机自动找出最小化损失函数时对应的 值。

梯度下降背后的思想是:开始时,我们随机选择一个参数组合即起始点,计算损失函数,然后寻找下一个能使得损失函数下降最多的参数组合。不断迭代,直到找到一个局部最小值(local minimum),由于下降的情况只考虑当前参数组合周围的情况,所以无法确定当前的局部最小值是否就是全局最小值(global minimum),不同的初始参数组合,可能会产生不同的局部最小值。

下图根据不同的起始点,产生了两个不同的局部最小值。

视频中举了下山的例子,即我们在山顶上的某个位置,为了下山,就不断地看一下周围下一步往哪走下山比较快,然后就迈出那一步,一直重复,直到我们到达山下的某一处陆地

梯度下降公式:

: 第 个特征参数

”:=“: 赋值操作符

: 学习速率(learning rate),

: 的偏导

公式中,学习速率决定了参数值变化的速率即”走多少距离“,而偏导这部分决定了下降的方向即”下一步往哪里“走(当然实际上的走多少距离是由偏导值给出的,学习速率起到调整后决定的作用),收敛处的局部最小值又叫做极小值,即”陆地“。

注意,在计算时要批量更新 ,即如上图中的左图所示,否则结果上会有所出入,原因不做细究。

2.6 梯度下降直观理解(Gradient Descent Intuition)

该节探讨 的梯度下降更新过程,即 ,此处为了数学定义上的精确性,用的是 ,如果不熟悉微积分学,就把它视作之前的 即可。

把红点定为初始点,切于初始点的红色直线的斜率,表示了函数 在初始点处有正斜率,也就是说它有正导数,则根据梯度下降公式 , 右边的结果是一个正值,即 向左边移动。这样不断重复,直到收敛(达到局部最小值,即斜率为0)。

初始 值(初始点)是任意的,若初始点恰好就在极小值点处,梯度下降算法将什么也不做()。

不熟悉斜率的话,就当斜率的值等于图中三角形的高度除以水平长度好啦,精确地求斜率的方法是求导。

 

对于学习速率 ,需要选取一个合适的值才能使得梯度下降算法运行良好。

  • 学习速率过小图示:

    收敛的太慢,需要更多次的迭代。

  • 学习速率过大图示:

    可能越过最低点,甚至导致无法收敛。

学习速率只需选定即可,不需要在运行梯度下降算法的时候进行动态改变,随着斜率越来越接近于0,损失函数的变化幅度会越来越小,直到收敛到局部极小值。

如图,品红色点为初始点,损失函数随着迭代的进行,变化的幅度越来越小。

最后,梯度下降不止可以用于线性回归中的损失函数,还通用于最小化其他的损失函数。

2.7 线性回归中的梯度下降(Gradient Descent For Linear Regression)

线性回归模型

梯度下降算法

直接将线性回归模型公式带入梯度下降公式可得出公式

时,平方损失函数求导的推导过程:

所以当 时:

所以当 时:

 

上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用所有的数据集 更新。

由于线性回归函数呈现碗状,且只有一个全局的最优值,所以函数一定总会收敛到全局最小值(学习速率不可过大)。同时,函数 被称为凸二次函数,而线性回归函数求解最小值问题属于凸函数优化问题

另外,使用循环求解,代码较为冗余,后面会讲到如何使用向量化(Vectorization)来简化代码并优化计算,使梯度下降运行的更快更好。

3 Linear Algebra Review

这部分,学过线性代数的可以复习一下,比较基础。笔记整理暂留。

3.1 Matrices and Vectors

Octave/Matlab 代码:

 

执行结果:

 

3.2 Addition and Scalar Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.3 Matrix Vector Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.4 Matrix Matrix Multiplication

Octave/Matlab 代码:

 

执行结果:

 

3.5 Matrix Multiplication Properties

Octave/Matlab 代码:

 

执行结果:

 

3.6 Inverse and Transpose

Octave/Matlab 代码:

 

执行结果:

 
\ No newline at end of file diff --git a/week1.md b/week1.md index 3c25be8..0bed38f 100644 --- a/week1.md +++ b/week1.md @@ -144,9 +144,9 @@ ![](image/20180105_212048.png) -其中 $h$ 代表结果函数,也称为**假设(hypothesis)** 。这个函数 $h$ 根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 $X\to Y$ 的映射。 +其中 $h$ 代表结果函数,也称为**假设(hypothesis)** 。假设函数根据输入(房屋的面积),给出预测结果输出(房屋的价格),即是一个 $X\to Y$ 的映射。 -$h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 +$h_\theta(x)=\theta_0+\theta_1x$,为解决房价问题的一种可行表达式。 > $x$: 特征/输入变量。 @@ -156,7 +156,7 @@ $h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 ## 2.2 损失函数(Cost Function) -我们的目的在于求解预测结果 $h_\theta(x)$ 最接近于实际结果 $y$ 时 $\theta$ 的取值,则问题可表达为**求解 $\sum\limits_{i=0}^{m}(h_\theta(x^{(i)})-y^{(i)})$ 的最小值**。 +我们的目的在于求解预测结果 $h$ 最接近于实际结果 $y$ 时 $\theta$ 的取值,则问题可表达为**求解 $\sum\limits_{i=0}^{m}(h_\theta(x^{(i)})-y^{(i)})$ 的最小值**。 > $m$: 训练集中的样本总数 > @@ -174,12 +174,12 @@ $h_\theta(x)=\theta_0+\theta_1x$,为其中一种可行的表达式。 $$J(\theta_0,\theta_1)=\dfrac{1}{2m}\displaystyle\sum_{i=1}^m\left(\hat{y}_{i}-y_{i} \right)^2=\dfrac{1}{2m}\displaystyle\sum_{i=1}^m\left(h_\theta(x_{i})-y_{i}\right)^2$$ +> $\hat{y}$: $y$ 的预测值 +> > 系数 $\frac{1}{2}$ 存在与否都不会影响结果,这里是为了在应用梯度下降时便于求解,平方的导数会抵消掉 $\frac{1}{2}$ 。 讨论到这里,我们的问题就转化成了**求解 $J\left( \theta_0, \theta_1 \right)$ 的最小值**。 - - ## 2.3 损失函数 - 直观理解1(Cost Function - Intuition I) 根据上节视频,列出如下定义: @@ -299,7 +299,7 @@ $\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\th ![](image/20180106_203726.png) -对于 $j = 0, j = 1$ 时,给出偏导计算公式的推导过程如下: +当 $j = 0, j = 1$ 时,**平方损失函数求导的推导过程:** $\frac{\partial}{\partial\theta_j} J(\theta_1, \theta_2)=\frac{\partial}{\partial\theta_j} \left(\frac{1}{2m}\sum\limits_{i=1}^{m}{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}} \right)=$ @@ -319,7 +319,7 @@ $\frac{\partial}{\partial\theta_1} J(\theta)=\frac{1}{m}\sum\limits_{i=1}^{m}{{\ 上文中所提到的梯度下降,都为批量梯度下降(Batch Gradient Descent),即每次计算都使用**所有**的数据集 $\left(\sum\limits_{i=1}^{m}\right)$ 更新。 -由于线性回归函数呈现**碗状**,且**只有一个**全局的最优值,所以函数**一定总会**收敛到全局最小值(学习速率不可过大)。同时,函数 $J​$ 被称为凸二次函数,而线性回归函数求解最小值问题属于**凸函数优化问题**。 +由于线性回归函数呈现**碗状**,且**只有一个**全局的最优值,所以函数**一定总会**收敛到全局最小值(学习速率不可过大)。同时,函数 $J$ 被称为**凸二次函数**,而线性回归函数求解最小值问题属于**凸函数优化问题**。 ![](image/24e9420f16fdd758ccb7097788f879e7.png) diff --git a/week2.html b/week2.html index d23b07f..31f91ff 100644 --- a/week2.html +++ b/week2.html @@ -220,8 +220,8 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表特征矩阵中第 行,也就是第 个训练实例。

: 代表特征矩阵中第 行的第 个特征,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可对 简化。

: 矩阵的转置

: 为了计算方便我们会假设

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量损失函数类似于单变量损失函数,

,其中

前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即

对其求导:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的损失函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

  • 多次迭代收敛法

    • 无法确定需要多少次迭代
    • 较易绘制关于迭代次数的图像
    • 根据图像易预测所需的迭代次数
  • 自动化测试收敛法(比较阈值)

    • 不易选取阈值
    • 损失函数近乎直线时无法确定收敛情况

对于梯度下降,一般采用多次迭代收敛法来得出最小化损失函数的参数值,自动化测试收敛法(如设定 为阈值)则几乎不会被使用。

我们可以通过绘制损失函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现损失函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,损失函数无法收敛,右图可能表明 过小,损失函数收敛的太慢。当然, 足够小时,损失函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave 中为 theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

 

接下来对 求偏导,根据矩阵的求导法则:

 

所以有:

, 则有

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

  • 特征之间线性相关

    比如同时包含英寸的尺寸和米为单位的尺寸两个特征,它们是线性相关的

  • 特征数量大于训练集的数量

如果发现 的结果不可逆,可尝试:

  • 减少多余/重复特征
  • 增加训练集数量
  • 使用正则化(后文)

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements_ for, while, if statement

5.6 Vectorization

5.x 常用函数整理


-
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
+

4 多变量线性回归(Linear Regression with Multiple Variables)

4.1 多特征(Multiple Features)

对于一个要度量的对象,一般来说会有不同维度的多个特征。比如之前的房屋价格预测例子中,除了房屋的面积大小,可能还有房屋的年限、房屋的层数等等其他特征:

这里由于特征不再只有一个,引入一些新的记号

: 特征的总数

: 代表样本矩阵中第 行,也就是第 个训练实例。

: 代表样本矩阵中第 行的第 列,也就是第 个训练实例的第 个特征。

参照上图,则有

多变量假设函数 表示为:

对于 ,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。

参数向量的维度为 ,在特征向量中添加 后,其维度也变为 , 则运用线性代数,可简化

: 矩阵的转置

: 某个样本的特征向量, 维特征量向量

: 为了计算方便我们会假设

注:该部分记号较多,记不住可随时回顾!

 

4.2 多变量梯度下降(Gradient Descent for Multiple Variables)

多变量损失函数类似于单变量损失函数,

,其中

前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即

解出偏导得:

可展开为:

当然,同单变量梯度下降一样,计算时需要同时更新所有参数。

,则得到同时更新参数的向量化(Vectorization)实现:

: 训练集数据, 维矩阵(包含额外特征

4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling)

在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。

以房价预测问题为例,这里选取房屋面积大小和房间数量这两个特征。

下图中,左图是以原始数据绘制的损失函数轮廓图,右图为采用特征缩放(都除以最大值)后图像。左图中呈现的图像较扁,相对于使用特征缩放方法的右图,梯度下降算法需要更多次的迭代。

 

为了优化梯度下降的收敛速度,采用特征缩放的技巧,使各特征值的范围尽量一致

除了以上图人工选择并除以一个参数的方式,均值归一化(Mean normalization)方法更为便捷,可采用它来对所有特征值统一缩放:

使

对于特征的范围,并不一定需要使得 ,类似于 等也是可取的,而诸如 ,就显得过大/过小了。

另外注意,一旦采用特征缩放,我们就需对所有的输入采用特征缩放,包括训练集、测试集、预测输入等。

4.4 梯度下降实践2-学习速率(Gradient Descent in Practice II - Learning Rate)

通常,有两种方法来确定函数是否收敛

  • 多次迭代收敛法

    • 无法确定需要多少次迭代
    • 较易绘制关于迭代次数的图像
    • 根据图像易预测所需的迭代次数
  • 自动化测试收敛法(比较阈值)

    • 不易选取阈值
    • 损失函数近乎直线时无法确定收敛情况

对于梯度下降,一般采用多次迭代收敛法来得出最小化损失函数的参数值,自动化测试收敛法(如设定 时判定收敛)则几乎不会被使用。

我们可以通过绘制损失函数关于迭代次数的图像,可视化梯度下降的执行过程,借助直观的图形来发现损失函数趋向于多少时能趋于收敛,依据图像变化情况,确定诸如学习速率的取值,迭代次数的大小等问题。

对于学习速率 ,一般上图展现的为适中情况,下图中,左图可能表明 过大,损失函数无法收敛,右图可能表明 过小,损失函数收敛的太慢。当然, 足够小时,损失函数在每轮迭代后一定会减少。

通过不断改变 值,绘制并观察图像,并以此来确定合适的学习速率。 尝试时可取

4.5 特征和多项式回归(Features and Polynomial Regression)

在特征选取时,我们也可以自己归纳总结,定义一个新的特征,用来取代或拆分旧的一个或多个特征。比如,对于房屋面积特征来说,我们可以将其拆分为长度和宽度两个特征,反之,我们也可以合并长度和宽度这两个特征为面积这一个特征。

线性回归只能以直线来对数据进行拟合,有时候需要使用曲线来对数据进行拟合,即多项式回归(Polynomial Regression)

比如一个二次方模型:

或者三次方模型:

或者平方根模型:

在使用多项式回归时,要记住非常有必要进行特征缩放,比如 的范围为 1-1000,那么 的范围则为 1- 1000000,不适用特征缩放的话,范围更有不一致,也更易影响效率。

4.6 正规方程(Normal Equation)

对于一些线性回归问题来说,正规方程法给出了一个更好的解决问题的方式。

正规方程法,即令 ,通过解析函数的方式直接计算得出参数向量的值 ,Octave 中代码为 theta = inv(X'*X)*X'*y

: 矩阵 的逆,在 Octave 中,inv 函数用于计算矩阵的逆,类似的还有 pinv 函数。

下表列出了正规方程法与梯度下降算法的对比

条件梯度下降正规方程
是否需要选取 需要不需要
是否需要迭代运算需要不需要
特征量大1适用,不适用, 复杂度
适用范围2各类模型只适用线性模型,且矩阵需可逆

正规方程法的推导过程

展开上式可得

注意到 都为标量,实际上是等价的,则

接下来对 求偏导,根据矩阵的求导法则:

所以有:

, 则有

4.7 不可逆性正规方程(Normal Equation Noninvertibility)

(本部分内容为选讲)

正规方程无法应用于不可逆的矩阵,发生这种问题的概率很小,通常由于

  • 特征之间线性相关

    比如同时包含英寸的尺寸和米为单位的尺寸两个特征,它们是线性相关的

  • 特征数量大于训练集的数量

如果发现 的结果不可逆,可尝试:

  • 减少多余/重复特征
  • 增加训练集数量
  • 使用正则化(后文)

对于这类不可逆的矩阵,我们称之为奇异矩阵退化矩阵

这种情况下,如果还想使用正规方程法,在Octave中,可以选用 pinv 函数,pinv 区别于 invpinv 函数被称为伪逆函数,在矩阵不可逆的时候,使用这个函数仍可正确地计算出 的值。

5 Octave/Matlab Tutorial

复习时可直接倍速回顾视频,笔记整理暂留。

5.1 Basic Operations

5.2 Moving Data Around

5.3 Computing on Data

5.4 Plotting Data

5.5 Control Statements_ for, while, if statement

5.6 Vectorization

5.x 常用函数整理


+
1 一般来说,当 超过 10000 时,对于正规方程而言,特征量较大。
2 梯度下降算法的普适性好,而对于特定的线性回归模型,正规方程是很好的替代品。
\ No newline at end of file diff --git a/week2.md b/week2.md index f62c81b..a0a575b 100644 --- a/week2.md +++ b/week2.md @@ -12,9 +12,9 @@ > $n$: 特征的总数 > -> ${x}^{\left( i \right)}$: 代表特征矩阵中第 $i$ 行,也就是第 $i$ 个训练实例。 +> ${x}^{\left( i \right)}$: 代表样本矩阵中第 $i$ 行,也就是第 $i$ 个训练实例。 > -> ${x}_{j}^{\left( i \right)}$: 代表特征矩阵中第 $i$ 行的第 $j$ 个特征,也就是第 $i$ 个训练实例的第 $j$ 个特征。 +> ${x}_{j}^{\left( i \right)}$: 代表样本矩阵中第 $i$ 行的第 $j$ 列,也就是第 $i$ 个训练实例的第 $j$ 个特征。 参照上图,则有 ${x}^{(2)}\text{=}\begin{bmatrix} 1416\\\ 3\\\ 2\\\ 40 \end{bmatrix}, {x}^{(2)}_{1} = 1416$ @@ -22,14 +22,20 @@ 对于 $\theta_0$,和单特征中一样,我们将其看作基础数值。例如,房价的基础价格。 -参数向量的维度为 $n+1$,在特征向量中添加 $x_{0}$ 后,其维度也变为 $n+1$, 则运用线性代数,可对 $h$ 简化。 +参数向量的维度为 $n+1$,在特征向量中添加 $x_{0}$ 后,其维度也变为 $n+1$, 则运用线性代数,可简化 $h$: $h_\theta\left(x\right)=\begin{bmatrix}\theta_0\; \theta_1\; ... \;\theta_n \end{bmatrix}\begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix}= \theta^T x$ > $\theta^T$: $\theta$ 矩阵的转置 > +> $x$: 某个样本的特征向量,$n+1$ 维特征量向量 +> > $x_0$: 为了计算方便我们会假设 $x_0^{(i)} = 1$ +**注:该部分记号较多,记不住可随时回顾!** + + + ## 4.2 多变量梯度下降(Gradient Descent for Multiple Variables) 多变量损失函数类似于单变量损失函数, @@ -38,11 +44,11 @@ $h_\theta\left(x\right)=\begin{bmatrix}\theta_0\; \theta_1\; ... \;\theta_n \end 前文提到梯度下降对于最小化损失函数的通用性,则多变量梯度下降公式即 -$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right) \newline \rbrace \end{align*}​$ +$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta_{0}},{\theta_{1}}...{\theta_{n}} \right) \newline \rbrace \end{align*}$ -对其求导: +解出偏导得: -$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}$ +$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}​$ 可展开为: @@ -55,6 +61,8 @@ $$ \theta = \theta - \alpha \frac{1}{m}(X^T(X\theta-y)) $$ +> $X$: 训练集数据,$m\times(n+1)$ 维矩阵(包含额外特征 $x_0=1$) + ## 4.3 梯度下降实践1-特征值缩放(Gradient Descent in Practice I - Feature Scaling) 在应用梯度下降算法实践时,由于各特征值的范围不一,可能会影响损失函数收敛速度。 @@ -150,16 +158,12 @@ $$ ​ $J(\theta) = \frac{1}{2m}[X^TX\theta-2\theta^TX^Ty+y^Ty]$ - - 接下来对$J(\theta )$ 求偏导,根据矩阵的求导法则: ​ $\frac{dX^TAX}{dX}=(A+A^\mathrm{T})X$ ​ $\frac{dX^TA}{dX}={A}$ - - 所以有: ​ $\frac{\partial J\left( \theta \right)}{\partial \theta }=\frac{1}{2m}\left(2{{X}^{T}}X\theta -2{{X}^{T}}y \right)$ diff --git a/week3.html b/week3.html index bb99415..152c67d 100644 --- a/week3.html +++ b/week3.html @@ -220,6 +220,15 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

肿瘤诊断问题:

肿瘤诊断问题是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果。

不仅如此,线性回归算法的值域为 ,则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念可以帮助我们更好地理解逻辑回归模型。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数。

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中讨论的其实没有多大区别。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆,如此便可给出分类结果了,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界像碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 代价函数(Cost Function)

 

6.5 Simplified Cost Function and Gradient Descent

6.6 Advanced Optimization

6.7 Multiclass Classification_ One-vs-all

7 Regularization

7.1 The Problem of Overfitting

7.2 Cost Function

7.3 Regularized Linear Regression

7.4 Regularized Logistic Regression

+

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

讨论肿瘤诊断问题:

肿瘤诊断问题的目的是告诉病人是否为恶性肿瘤,是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。

不仅如此,线性回归算法的值域为 ,则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数:

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆(),如此便可给出分类结果,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 损失函数(Cost Function)

上节又留下了个问题,我们怎么知道决策边界是啥样? 多少时能很好的拟合数据?当然,见招拆招,总要来个

如果直接套用线性回归的损失函数:

其中 ,可绘制关于 的图像,如下图

回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。

如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为凸优化问题。还好,损失函数不止平方损失函数一种。

对于逻辑回归,更换平方损失函数为对数损失函数:

则可绘制关于 的图像如下:

如左图,当训练集的结果为 (正样本)时,随着假设函数趋向于 ,损失函数的值会趋于 ,即意味着拟合程度很好。如果假设函数此时趋于 ,则会给出一个很高的损失,拟合程度,算法会根据其迅速纠正 值,右图 同理。

区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。

6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)

由于懒得分类讨论,对于二元分类问题,我们把损失函数简化为一个函数: +

,左边式子整体为 ,当 ,则 ,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。

向量化实现:

 

为了最优化 ,仍使用梯度下降法,算法同线性回归中一致:

解出偏导得:

注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即,不过求导后的结果也相同。

向量化实现:

 

对数损失函数求导的推导过程:

带入得

+

根据求偏导的性质,没有 的项都消去,则得:

所以有:

+ + + + + + +

则可得对数损失函数的导数:

 

6.6 进阶优化(Advanced Optimization)

 

6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)

7 Regularization

7.1 The Problem of Overfitting

7.2 Cost Function

7.3 Regularized Linear Regression

7.4 Regularized Logistic Regression

\ No newline at end of file diff --git a/week3.md b/week3.md index 797a4c9..c4621d3 100644 --- a/week3.md +++ b/week3.md @@ -10,11 +10,11 @@ - 金融欺诈判断 - 肿瘤诊断 -肿瘤诊断问题: +讨论肿瘤诊断问题: ![](image/20180109_144040.png) -肿瘤诊断问题是一个**二元分类问题(binary class problems)**,则定义 $ y \in\lbrace 0, 1\rbrace$,其中 0 表示**负向类(negative class)**,代表恶性肿瘤("-"),1 为**正向类(positive class)**,代表良性肿瘤("+")。如图,定义最右边的样本为**偏差项**。 +肿瘤诊断问题的目的是告诉病人**是否**为恶性肿瘤,是一个**二元分类问题(binary class problems)**,则定义 $ y \in\lbrace 0, 1\rbrace$,其中 0 表示**负向类(negative class)**,代表恶性肿瘤("-"),1 为**正向类(positive class)**,代表良性肿瘤("+")。如图,定义最右边的样本为**偏差项**。 在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定 @@ -26,21 +26,21 @@ $h_\theta(x) \lt 0.5$ ,预测为 $y = 0$,即负向类。 -接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果。 +接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。 -不仅如此,线性回归算法的值域为 $R$,则当线性回归函数给出诸如 $h = 10000, h = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 +不仅如此,线性回归算法的值域为 $R$,则当线性回归函数给出诸如 $h_\theta(x) = 10000, h_\theta(x) = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 -区别于线性回归算法,逻辑回归算法是一个分类算法,**其输出值永远在 0 到 1 之间**,即 $h \in (0,1)$。 +区别于线性回归算法,逻辑回归算法是一个分类算法,**其输出值永远在 0 到 1 之间**,即 $h_\theta(x) \in (0,1)$。 ## 6.2 假设函数表示(Hypothesis Representation) -为了使 $h \in \left(0, 1\right)$,引入逻辑回归模型,定义假设函数 +为了使 $h_\theta(x) \in \left(0, 1\right)$,引入逻辑回归模型,定义假设函数 $$ -h_\theta \left( x \right)=g(z)=g\left(\theta^{T}X \right) +h_\theta \left( x \right)=g(z)=g\left(\theta^{T}x \right) $$ -对比线性回归函数 $h_\theta \left( x \right)=\theta^{T}X$,$g$ 表示逻辑函数([logistic function][1]),复合起来,则称为逻辑回归函数。 +对比线性回归函数 $h_\theta \left( x \right)=\theta^{T}x$,$g$ 表示逻辑函数([logistic function][1]),复合起来,则称为逻辑回归函数。 逻辑函数是 S 形函数,会将所有实数映射到 $(0, 1)$ 范围。 @@ -63,9 +63,9 @@ $\begin{align*}& h_\theta(x) = P(y=1 | x ; \theta) = 1 - P(y=0 | x ; \theta) \ne ## 6.3 决策边界(Decision Boundary) -决策边界的概念可以帮助我们更好地理解逻辑回归模型。 +决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。 -在逻辑回归中,有假设函数 $h_\theta \left( x \right)=g(z)=g\left(\theta^{T}X \right)$。 +在逻辑回归中,有假设函数 $h_\theta \left( x \right)=g(z)=g\left(\theta^{T}x \right)$。 为了得出分类的结果,这里和前面一样,规定以 $0.5$ 为阈值: @@ -76,11 +76,11 @@ $\begin{align*}& h_\theta(x) \geq 0.5 \rightarrow y = 1 \newline& h_\theta(x) < ![sigmoid function](image/2413fbec8ff9fa1f19aaf78265b8a33b_Logistic_function.png) -观察可得当 $g(z) \geq 0.5$ 时,有 $z \geq 0$,即 $\theta^TX \geq 0$。 +观察可得当 $g(z) \geq 0.5$ 时,有 $z \geq 0$,即 $\theta^Tx \geq 0$。 同线性回归模型的不同点在于: $\begin{align*}z \to +\infty, e^{-\infty} \to 0 \Rightarrow g(z)=1 \newline z \to -\infty, e^{\infty}\to \infty \Rightarrow g(z)=0 \end{align*}$ -直观一点来个例子,${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}\right)$ 是下图模型的假设函数。 +直观一点来个例子,${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}\right)​$ 是下图模型的假设函数: ![](image/20180111_000814.png) @@ -90,35 +90,120 @@ $\begin{align*}& h_\theta(x) \geq 0.5 \rightarrow y = 1 \newline& h_\theta(x) < -上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中讨论的其实没有多大区别。 +上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。 为了拟合下图数据,建模多项式假设函数: ${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}^{2}+{\theta_{4}}x_{2}^{2} \right)$ -这里取 $\theta = \begin{bmatrix} -1\\0\\0\\1\\1\end{bmatrix}$,决策边界对应了一个在原点处的单位圆,如此便可给出分类结果了,如图中品红色曲线: +这里取 $\theta = \begin{bmatrix} -1\\0\\0\\1\\1\end{bmatrix}$,决策边界对应了一个在原点处的单位圆(${x_1}^2+{x_2}^2 = 1$),如此便可给出分类结果,如图中品红色曲线: ![](image/20180111_000653.png) -当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界像碗状、爱心状等等。 +当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。 简单来说,决策边界就是**分类的分界线**,分类现在实际就由 $z$ (中的 $\theta$)决定啦。 -## 6.4 代价函数(Cost Function) +## 6.4 损失函数(Cost Function) 上节又留下了个问题,我们怎么知道决策边界是啥样?$\theta$ 多少时能很好的拟合数据?当然,见招拆招,总要来个 $J(\theta)$。 +如果直接套用线性回归的损失函数: $J\left( {\theta} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}$ +其中 $h_\theta(x) = g\left(\theta^{T}x \right)$,可绘制关于 $J(\theta)$ 的图像,如下图 -## 6.5 Simplified Cost Function and Gradient Descent +![](image/20180111_080314.png) -## 6.6 Advanced Optimization +回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。 -## 6.7 Multiclass Classification_ One-vs-all +![](image/20180111_080514.png) + +如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为**凸优化问题**。还好,损失函数不止平方损失函数一种。 + +对于逻辑回归,更换平方损失函数为**对数损失函数:** + +$\begin{align*}& J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(h_\theta(x)) \; & \text{if y = 1} \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(1-h_\theta(x)) \; & \text{if y = 0}\end{align*}$ + +则可绘制关于 $J(\theta)$ 的图像如下: + +![](image/20180111_080614.png) + +如左图,当训练集的结果为 $y=1$(正样本)时,随着假设函数趋向于 $1$,损失函数的值会趋于 $0$,即意味着拟合程度很好。如果假设函数此时趋于 $0$,则会给出一个**很高的损失**,拟合程度**差**,算法会根据其迅速纠正 $\theta$ 值,右图 $y=0$ 同理。 + +区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。 + +## 6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent) + +由于懒得分类讨论,对于二元分类问题,我们把损失函数**简化**为一个函数: +$Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)$ + +当 $y = 0$,左边式子整体为 $0$,当 $y = 1$,则 $1-y=0$,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。 + +$J(\theta) = - \frac{1}{m} \displaystyle \sum_{i=1}^m [y^{(i)}\log (h_\theta (x^{(i)})) + (1 - y^{(i)})\log (1 - h_\theta(x^{(i)}))]$ + +向量化实现: + +$h = g(X\theta)$,$J(\theta) = \frac{1}{m} \cdot \left(-y^{T}\log(h)-(1-y)^{T}\log(1-h)\right)$ + + + +为了最优化 $\theta$,仍使用梯度下降法,算法同线性回归中一致: + +$\begin{align*} & \text{repeat until convergence:} \; \lbrace \newline \; &{{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta} \right) \newline \rbrace \end{align*}$ + +解出偏导得: + +$\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0,1...n}\newline \rbrace\end{align*}$ + +注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即$h_\theta(x) = g\left(\theta^{T}x \right)$,不过求导后的结果也相同。 + +向量化实现:$\theta := \theta - \frac{\alpha}{m} X^{T} (g(X \theta ) - y)$ + + + +**对数损失函数求导的推导过程:** + +$J(\theta) = - \frac{1}{m} \displaystyle \sum_{i=1}^m [y^{(i)}\log (h_\theta (x^{(i)})) + (1 - y^{(i)})\log (1 - h_\theta(x^{(i)}))]$ + +令 $f(\theta) = {{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)$ + +将 $h_\theta(x^{(i)}) = g\left(\theta^{T}x^{(i)} \right)=\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} $ 带入得 + +$f(\theta)={{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}} \right)$ +$=-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^T}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^T}{{x}^{(i)}}}} \right)$ + +根据求偏导的性质,没有 $\theta_j$ 的项都消去,则得: + +$\frac{\partial }{\partial {\theta_{j}}}\left( \theta^Tx^{(i)} \right)=x^{(i)}_j$ + +所以有: + +$\frac{\partial }{\partial {\theta_{j}}}f\left( \theta \right)=\frac{\partial }{\partial {\theta_{j}}}[-{{y}^{(i)}}\log \left( 1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{{\theta^{T}}{{x}^{(i)}}}} \right)]$ + +$=-{{y}^{(i)}}\frac{-x_{j}^{(i)}{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}{1+{{e}^{-{\theta^{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}$ +$={{y}^{(i)}}\frac{x_j^{(i)}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}$ +$={\frac{{{y}^{(i)}}x_j^{(i)}-x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}+{{y}^{(i)}}x_j^{(i)}{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}}$ +$={\frac{{{y}^{(i)}}\left( 1\text{+}{{e}^{{\theta^T}{{x}^{(i)}}}} \right)-{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}}x_j^{(i)}}$ +$={({{y}^{(i)}}-\frac{{{e}^{{\theta^T}{{x}^{(i)}}}}}{1+{{e}^{{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}}$ +$={({{y}^{(i)}}-\frac{1}{1+{{e}^{-{\theta^T}{{x}^{(i)}}}}})x_j^{(i)}}$ +$={\left({{y}^{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)\right)x_j^{(i)}}$ +$={\left({h_\theta}\left( {{x}^{(i)}} \right)-{{y}^{(i)}}\right)x_j^{(i)}}$ + +则可得对数损失函数的导数: + +$\frac{\partial }{\partial {\theta_{j}}}J(\theta) = -\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{\partial }{\partial {\theta_{j}}}f(\theta)}=\frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} $ + + + +## 6.6 进阶优化(Advanced Optimization) + + + +## 6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all) # 7 Regularization ## 7.1 The Problem of Overfitting