diff --git a/image/20180112_001720.png b/image/20180112_001720.png new file mode 100644 index 0000000..9af86fe Binary files /dev/null and b/image/20180112_001720.png differ diff --git a/week3.html b/week3.html index 152c67d..115f77f 100644 --- a/week3.html +++ b/week3.html @@ -2,7 +2,119 @@ -week3.md -

6 逻辑回归(Logistic Regression)6.1 分类(Classification)6.2 假设函数表示(Hypothesis Representation)6.3 决策边界(Decision Boundary)6.4 损失函数(Cost Function)6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)6.6 进阶优化(Advanced Optimization)6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)7 Regularization7.1 The Problem of Overfitting7.2 Cost Function7.3 Regularized Linear Regression7.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

+

6 逻辑回归(Logistic Regression)6.1 分类(Classification)6.2 假设函数表示(Hypothesis Representation)6.3 决策边界(Decision Boundary)6.4 损失函数(Cost Function)6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)6.6 进阶优化(Advanced Optimization)6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)7 Regularization7.1 The Problem of Overfitting7.2 Cost Function7.3 Regularized Linear Regression7.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)

运行梯度下降算法,其能最小化损失函数 并得出 的最优值,在使用梯度下降算法时,如果不需要观察损失函数的收敛情况,则直接计算 的导数项即可,而不需要计算 值。

我们编写代码给出损失函数及其偏导数然后传入梯度下降算法中,接下来算法则会为我们最小化损失函数给出参数的最优解。这类算法被称为最优化算法(Optimization Algorithms),梯度下降算法不是唯一的最小化算法1

一些最优化算法:

比较梯度下降算法:一些最优化算法虽然会更为复杂,难以调试,自行实现又困难重重,开源库又效率也不一,哎,做个调包侠还得碰运气。不过这些算法通常效率更高,并无需选择学习速率 (少一个参数少一份痛苦啊!)。

Octave/Matlab 中对这类高级算法做了封装,易于调用。

 

假设有 ,要求参数 的最优值。

下面为 Octave/Matlab 求解最优化问题的代码实例:

  1. 创建一个函数以返回损失函数及其偏导数:
 
  1. costFunction 函数及所需参数传入最优化函数 fminunc,以求解最优化问题:
 

'GradObj', 'on': 启用梯度目标参数(则需要将梯度传入算法)

'MaxIter', 100: 最大迭代次数为 100 次

@xxx: Octave/Matlab 中的函数指针

optTheta: 最优化得到的参数向量

functionVal: 引用函数最后一次的返回值

exitFlag: 标记损失函数是否收敛

注:Octave/Matlab 中可以使用 help fminunc 命令随时查看函数的帮助文档。

  1. 返回结果
 

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

一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。(⊙﹏⊙)有点累,让我歇歇,丢张图去休息啦。。。

原理是,转化多类别分类问题为多个二元分类问题,这种方法被称为 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 c4621d3..9006e12 100644 --- a/week3.md +++ b/week3.md @@ -197,14 +197,102 @@ $={\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) +运行梯度下降算法,其能最小化损失函数 $J(\theta)$ 并得出 $\theta$ 的最优值,在使用梯度下降算法时,如果不需要观察损失函数的收敛情况,则直接计算 $J(\theta)$ 的导数项即可,而不需要计算 $J(\theta)$ 值。 -## 6.6 进阶优化(Advanced Optimization) +我们编写代码给出损失函数及其偏导数然后传入梯度下降算法中,接下来算法则会为我们最小化损失函数给出参数的最优解。这类算法被称为**最优化算法(Optimization Algorithms)**,梯度下降算法不是唯一的最小化算法[^1]。 + +一些最优化算法: +- 梯度下降法(Gradient Descent) +- 共轭梯度算法(Conjugate gradient) +- 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods) + - DFP算法 + - 局部优化法(BFGS) + - 有限内存局部优化法(L-BFGS) +- 拉格朗日乘数法(Lagrange multiplier) + +比较梯度下降算法:一些最优化算法虽然会更为复杂,难以调试,自行实现又困难重重,开源库又效率也不一,哎,做个调包侠还得碰运气。不过这些算法通常效率更高,并无需选择学习速率 $\alpha$(少一个参数少一份痛苦啊!)。 + +Octave/Matlab 中对这类高级算法做了封装,易于调用。 + + + +假设有 $J(\theta) = (\theta_1-5)^2 + (\theta_2-5)^2$,要求参数 $\theta=\begin{bmatrix} \theta_1\\\theta_2\end{bmatrix}$的最优值。 + +下面为 Octave/Matlab 求解最优化问题的代码实例: + +1. 创建一个函数以返回损失函数及其偏导数: + +```matlab +function [jVal, gradient] = costFunction(theta) + % code to compute J(theta) + jVal=(theta(1)-5)^2+(theta(2)-5)^2; + + % code to compute derivative of J(theta) + gradient=zeros(2,1); + + gradient(1)=2*(theta(1)-5); + gradient(2)=2*(theta(2)-5); +end +``` + +2. 将 `costFunction` 函数及所需参数传入最优化函数 `fminunc`,以求解最优化问题: + +```matlab +options = optimset('GradObj', 'on', 'MaxIter', 100); +initialTheta = zeros(2,1); + [optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options); +``` +> `'GradObj', 'on'`: 启用梯度目标参数(则需要将梯度传入算法) +> +> `'MaxIter', 100`: 最大迭代次数为 100 次 +> +> `@xxx`: Octave/Matlab 中的函数指针 +> +> `optTheta`: 最优化得到的参数向量 +> +> `functionVal`: 引用函数最后一次的返回值 +> +> `exitFlag`: 标记损失函数是否收敛 +注:Octave/Matlab 中可以使用 `help fminunc` 命令随时查看函数的帮助文档。 + +3. 返回结果 + +``` +optTheta = + + 5 + 5 + +functionVal = 0 + +exitFlag = 1 +``` + + +[^1]: https://en.wikipedia.org/wiki/List_of_algorithms#Optimization_algorithms ## 6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all) +一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。(⊙﹏⊙)有点累,让我歇歇,丢张图去休息啦。。。 + +![](image/20180112_001720.png) + +原理是,转化多类别分类问题为**多个二元分类问题**,这种方法被称为 One-vs-all。 + +正式定义:$h_\theta^{\left( i \right)}\left( x \right)=p\left( y=i|x;\theta \right), i=\left( 1,2,3....k \right)$ + +> $h_\theta^{\left( i \right)}\left( x \right)$: 输出 $y=i$(属于第 $i$ 个分类)的可能性 +> +> $k$: 类别总数,如上图 $k=3$。 + +注意多类别分类问题中 $h_\theta(x)$ 的结果不再只是一个实数而是一个向量,如果类别总数为 $k$,现在 $h_\theta(x)$ 就是一个 $k$ 维向量。 + +对于样本实例来说,只要看分为哪个类别时预测输出的值最大,就说它输出属于哪个类别,即 $y = \mathop{\max}\limits_i\,h_\theta^{\left( i \right)}\left( x \right)$。 + # 7 Regularization ## 7.1 The Problem of Overfitting