diff --git a/ml/linear regression/images/gd_diff_path.jpg b/ml/linear_regression/images/gd_diff_path.jpg similarity index 100% rename from ml/linear regression/images/gd_diff_path.jpg rename to ml/linear_regression/images/gd_diff_path.jpg diff --git a/ml/linear regression/images/overfitting.jpeg b/ml/linear_regression/images/overfitting.jpeg similarity index 100% rename from ml/linear regression/images/overfitting.jpeg rename to ml/linear_regression/images/overfitting.jpeg diff --git a/ml/linear regression/images/select_alpha.png b/ml/linear_regression/images/select_alpha.png similarity index 100% rename from ml/linear regression/images/select_alpha.png rename to ml/linear_regression/images/select_alpha.png diff --git a/ml/linear regression/linear regression.md b/ml/linear_regression/linear_regression.md similarity index 100% rename from ml/linear regression/linear regression.md rename to ml/linear_regression/linear_regression.md diff --git a/ml/logistic regression/logistic regression.md b/ml/logistic regression/logistic regression.md deleted file mode 100644 index 8780a0d..0000000 --- a/ml/logistic regression/logistic regression.md +++ /dev/null @@ -1,100 +0,0 @@ -逻辑回归问题总结 -============== - -## 目录 -+ 摘要 -+ 逻辑回归概述 - - 逻辑回归的假设函数 - + 假设函数的意义 - + 决策边界 - - 损失函数 - - 为什么不使用平方损失函数 - - 对数损失函数 - - 最大似然估计 - - 多分类问题 -+ 梯度下降法 - - 对数损失函数是凸函数 -+ 过拟合 - - 正则化的损失函数 - -## 逻辑回归概述 - -在 [线性回归总结](../linear\ regression/linear\ regression.md) 中,简单介绍了线性回归问题,这里将要阐述的逻辑回归,却并不是回归问题,而是一个分类问题(`classification problem`)。分类问题与回归问题的主要界限,在于分类问题的输出是离散值,而回归问题的输出是连续的。根据分类问题输出取值数量的不同,又可以分为**二分类问题**和**多分类问题**,这里主要阐述二分类问题。 - -二分类问题的输出一般为0或者1,表示某一特定的事件不发生或者发生,比如辅助诊断系统判断患者患病或者不患病,邮件分类系统判断邮件是否是垃圾邮件,都是典型的二分类问题。 - -为了训练二分类问题,一种直觉上的方法是直接套用此前的线性回归模型,这样就可以得到模型的假设函数为 - -$$ -h_\theta(x) = \theta^Tx -$$ - -仍然使用此前的平方损失函数以及梯度下降法(或者规范方程法)来对模型进行求解,对于某个简单的数据集,可以得到下面的结果 - -![fig1](images/fig1.png) - -此时$h_\theta(x)$的输出值仍然是连续值,而二分类问题要求模型的输出是0或者1,因此需要对假设函数的输出进行进一步处理。这里可以简单地令$\hat{y} = 1$当且仅当$h_\theta(x) >= 0.5$,令$\hat{y} = 0$当且仅当$h_\theta(x) < 0.5$。可以看到,采用这种策略时,对上图的数据具有很高的预测正确率。 - -然而这种方法却也有局限性,考虑在训练集中增加一个样本点$X = 80, y = 1$,此时线性回归模型的结果如下图所示: - -![fig2](images/fig2.png) - -可以看到,此时回归直线相对此前向右偏移,模型对训练集的预测能力下降了不少。可以想象,如果训练集中还有更多这样的极端数据,回归的直线将继续向右偏移,模型的预测能力将继续下降。 - -此外,线性回归模型的假设函数,其值域是$(-\infty, +\infty)$,而分类问题的输出$y$无非是0或者1而已,当$h_\theta(x) > 1$或者$h_\theta(x) < 0$时不具有意义。可见,简单套用线性回归的方法来解决分类问题是行不通的。 - -### 逻辑回归的假设函数 - -可以做一些简单的修改,使得假设函数的值域限制在$[0, 1]$。这里引入**sigmoid函数**,它的表达式$g(z)$满足 - -$$ -g(z) = \frac{1}{1 + e^{-z}} -$$ - -可以看出,它的取值范围恰好在$(0, 1)$之间,实际上,它的图像如下所示: - -![sigmoid](images/sigmoid.png) - -因此,可以把 sigmoid 函数作用到此前的线性回归模型上,就得到了新的假设函数 - -$$ -h_\theta(x) = sigmoid(\theta^Tx) -$$ - -此时,它的函数值,就可以被理解成在输入为$x$的条件下,$y = 1$的概率,即 - -$$ -P(y = 1| x) = sigmoid(\theta x) -$$ - -> 决策边界 - -以下对 sigmoid 函数进行进一步的讨论。前面已经指出,假设函数的返回值,表示的是预测样本为正(`positive`)的概率。一般地,当$h_\theta(x) >= 0.5$时,预测$\hat{y} = 1$;当$h_\theta(y) < 0.5$时,预测$\hat{y} = 0$。这样,$h_\theta(x) = 0.5$就成为正负样本的边界,称为**决策边界**(`decision boundary`)。 - -由 - -$$ -h_\theta(x) = sigmoid(\theta^Tx) = 0.5 -$$ - -根据 sigmoid 函数的图像,恰好可以得到 - -$$ -\theta^Tx = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n = 0 -$$ - -容易看出,这是一个(高维)平面的方程,预测为正负的样本,分别分布在该平面的两侧。因此,逻辑回归的假设函数,本质上就是找到这样一个高维平面对样本点进行划分,达到尽可能高的划分正确率。 - -利用**多项式回归**,可以得到更加复杂的决策边界。比如令 - -$$ -h_\theta(x) = sigmoid(\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_2^2) -$$ - -则得到的决策边界为 - -$$ -\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_2^2 = 0 -$$ - -容易看出,这是一个圆锥曲线的方程。因此,通过构造更高阶的多项式,可以得到相当复杂的决策边界,从而将逻辑回归应用到更加复杂的分类问题当中。 diff --git a/ml/logistic regression/images/fig1.png b/ml/logistic_regression/images/fig1.png similarity index 100% rename from ml/logistic regression/images/fig1.png rename to ml/logistic_regression/images/fig1.png diff --git a/ml/logistic regression/images/fig2.png b/ml/logistic_regression/images/fig2.png similarity index 100% rename from ml/logistic regression/images/fig2.png rename to ml/logistic_regression/images/fig2.png diff --git a/ml/logistic regression/images/sigmoid.png b/ml/logistic_regression/images/sigmoid.png similarity index 100% rename from ml/logistic regression/images/sigmoid.png rename to ml/logistic_regression/images/sigmoid.png diff --git a/ml/logistic_regression/initial_data.png b/ml/logistic_regression/initial_data.png new file mode 100644 index 0000000..1eb44b0 Binary files /dev/null and b/ml/logistic_regression/initial_data.png differ diff --git a/ml/logistic_regression/justfit.png b/ml/logistic_regression/justfit.png new file mode 100644 index 0000000..ed58969 Binary files /dev/null and b/ml/logistic_regression/justfit.png differ diff --git a/ml/logistic_regression/logistic_regression.md b/ml/logistic_regression/logistic_regression.md new file mode 100644 index 0000000..70b3e35 --- /dev/null +++ b/ml/logistic_regression/logistic_regression.md @@ -0,0 +1,289 @@ +逻辑回归问题总结 +============== + +## 目录 ++ 摘要 ++ 逻辑回归概述 + - 逻辑回归的假设函数 + + 假设函数的意义 + + 决策边界 + - 损失函数 + + 为什么对数似然函数 + + 对数似然函数是凸函数 + - 多分类问题 ++ 过拟合 + - 正则化的损失函数 + +## 逻辑回归概述 + +在 [线性回归总结](../linear_regression/linear_regression.md) 中,简单介绍了线性回归问题,这里将要阐述的逻辑回归,却并不是回归问题,而是一个分类问题(`classification problem`)。分类问题与回归问题的主要界限,在于分类问题的输出是离散值,而回归问题的输出是连续的。根据分类问题输出取值数量的不同,又可以分为**二分类问题**和**多分类问题**,这里主要阐述二分类问题。 + +二分类问题的输出一般为0或者1,表示某一特定的事件不发生或者发生,比如辅助诊断系统判断患者患病或者不患病,邮件分类系统判断邮件是否是垃圾邮件,都是典型的二分类问题。 + +为了训练二分类问题,一种直觉上的方法是直接套用此前的线性回归模型,这样就可以得到模型的假设函数为 + +$$ +h_\theta(x) = \theta^Tx +$$ + +仍然使用此前的平方损失函数以及梯度下降法(或者规范方程法)来对模型进行求解,对于某个简单的数据集,可以得到下面的结果 + +![fig1](images/fig1.png) + +此时$h_\theta(x)$的输出值仍然是连续值,而二分类问题要求模型的输出是0或者1,因此需要对假设函数的输出进行进一步处理。这里可以简单地令$\hat{y} = 1$当且仅当$h_\theta(x) >= 0.5$,令$\hat{y} = 0$当且仅当$h_\theta(x) < 0.5$。可以看到,采用这种策略时,对上图的数据具有很高的预测正确率。 + +然而这种方法却也有局限性,考虑在训练集中增加一个样本点$X = 80, y = 1$,此时线性回归模型的结果如下图所示: + +![fig2](images/fig2.png) + +可以看到,此时回归直线相对此前向右偏移,模型对训练集的预测能力下降了不少。可以想象,如果训练集中还有更多这样的极端数据,回归的直线将继续向右偏移,模型的预测能力将继续下降。 + +此外,线性回归模型的假设函数,其值域是$(-\infty, +\infty)$,而分类问题的输出$y$无非是0或者1而已,当$h_\theta(x) > 1$或者$h_\theta(x) < 0$时不具有意义。可见,简单套用线性回归的方法来解决分类问题是行不通的。 + +### 逻辑回归的假设函数 + +可以做一些简单的修改,使得假设函数的值域限制在$[0, 1]$。这里引入**sigmoid函数**,它的表达式$g(z)$满足 + +$$ +g(z) = \frac{1}{1 + e^{-z}} +$$ + +可以看出,它的取值范围恰好在$(0, 1)$之间,实际上,它的图像如下所示: + +![sigmoid](images/sigmoid.png) + +因此,可以把 sigmoid 函数作用到此前的线性回归模型上,就得到了新的假设函数 + +$$ +h_\theta(x) = sigmoid(\theta^Tx) +$$ + +此时,它的函数值,就可以被理解成在输入为$x$的条件下,$y = 1$的概率,即 + +$$ +P(y = 1| x) = sigmoid(\theta x) +$$ + +> 决策边界 + +以下对 sigmoid 函数进行进一步的讨论。前面已经指出,假设函数的返回值,表示的是预测样本为正(`positive`)的概率。一般地,当$h_\theta(x) >= 0.5$时,预测$\hat{y} = 1$;当$h_\theta(y) < 0.5$时,预测$\hat{y} = 0$。这样,$h_\theta(x) = 0.5$就成为正负样本的边界,称为**决策边界**(`decision boundary`)。 + +由 + +$$ +h_\theta(x) = sigmoid(\theta^Tx) = 0.5 +$$ + +根据 sigmoid 函数的图像,恰好可以得到 + +$$ +\theta^Tx = \theta_0x_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n = 0 +$$ + +容易看出,这是一个(高维)平面的方程,预测为正负的样本,分别分布在该平面的两侧。因此,逻辑回归的假设函数,本质上就是找到这样一个高维平面对样本点进行划分,达到尽可能高的划分正确率。 + +利用**多项式回归**,可以得到更加复杂的决策边界。比如令 + +$$ +h_\theta(x) = sigmoid(\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_2^2) +$$ + +则得到的决策边界为 + +$$ +\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2 + \theta_4x_2^2 = 0 +$$ + +容易看出,这是一个圆锥曲线的方程。因此,通过构造更高阶的多项式,可以得到相当复杂的决策边界,从而将逻辑回归应用到更加复杂的分类问题当中。 + +### 逻辑回归的损失函数 + +在线性回归当中,是使用平方损失函数来作为损失函数,逻辑回归也可以沿用这种方式,即定义$J(\theta)$满足 + +$$ +J(\theta) = \frac{1}{2m}\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 +$$ + +为了找到一组最优的$\theta$,应该使平方损失函数具有最小值,这里仍然沿用**梯度下降法**来求解。然而,在逻辑回归中,上面的平方损失函数却并非一个凸函数,使用梯度下降法无法确保收敛到全局最优点,等以后我变强了可以考虑给个证明。 + +因此,实际上并不是使用平方损失函数,而是**对数损失函数**,来作为逻辑回归的损失函数。此时,单个样本的损失函数$cost(h_\theta(x), y)$满足 + +$$ +cost(h_\theta(x), y) = \left\{ + \begin{aligned} + -log(h_\theta(x))&, y = 1\\\\ + -log(1 - h_theta(x))&, y = 0 + \end{aligned} +\right +$$ + +可以分别画出$y = 0$与$y = 1$的损失函数的图像,以获得一个比较直观的理解。容易看到,当$y = 1$时,对输出的预测值$h_\theta(x)$越接近一,则损失函数的值越小;预测值越接近零,则损失函数的值越大。并且当$h_\theta(x) = 1$时,$cost(h_\theta(x), 1) = 0$,当$h_\theta(x) = 0$时,$cost(h_\theta(x), 1) = +\infty$。该性质是容易理解的,即预测值与真值越接近,则相应的损失就越小。$y = 0$时也有类似的性质。 + +可以用一种更加简单的方法来表示$cost(h_\theta(x), y)$,即 + +$$ +cost(h_\theta(x), y) = -ylog(h_\theta(x)) - (1-y)log(1 - logh_\theta(x)) +$$ + +因此,整个样本的损失函数为 + +$$ +J(\theta) = \frac{1}{m}\Sigma_{i = 1}^mcost(h_\theta(x^{(i)}), y^{(i)}) = -\frac{1}{m}[\Sigma_{i = 1}^my^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - logh_\theta(x^{(i)}))] +$$ + +> 为什么使用对数似然函数? + +使用对数似然函数并非偶然,而是由**最大似然估计**推导而出的。下面给出推导过程: + +假设函数$h_\theta(x)$满足 + +$$ +h_\theta(x) = sigmoid(\theta^T \cdot x) +$$ + +它的意义是在输入为$x$的条件下,输出$y = 1$的概率,即 + +$$ +P(y = 1| x) = sigmoid(\theta^T x) +$$ + +因此$y | x$服从这样一个两点分布,其中 + +$$ +\begin{aligned} +&P(y = 1| x) = sigmoid(\theta^T x)\\\\ +&P(y = 0| x) = 1 - sigmoid(\theta^T x) +\end{aligned} +$$ + +设样本容量为$m$,其中$y = 1$的样本有$k$个,所以可以写出似然函数 + +$$ +L(\theta) = \Pi_{y^{(i)} = 1}sigmoid(\theta x^{(i)}) \cdot \Pi_{y^{(j) } = 0}(1 - sigmoid(\theta x^{(j)})) +$$ + +对似然函数进行一些化简 + +$$ +L(\theta) = \Pi_{i = 1}^m \{[h_\theta(x^{(i)})]^{y^{(i)}} \cdot [(1 - h\theta(x^{(i)}))]^{1-y^{(i)}}\} +$$ + +从而可以得到 + +$$ +lnL(\theta) = \Sigma_{i = 1}^m [y^{(i)}lnh_\theta(x^{(i)}) + (1 - y^{(i)})ln(1 - h_\theta(x^{(i)})] +$$ + +这样,求似然函数的最大值,就等价于求 + +$$ +J(\theta) = -\frac{1}{m}[\Sigma_{i = 1}^my^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - logh_\theta(x^{(i)}))] +$$ + +的最小值。可见,对数损失函数,实际上与最大似然估计是一脉相承的。 + +> 对数损失函数是凸函数 + +相较于平方损失函数,对数似然函数还具有一个优良性质,即它是一个凸函数。证明如下: + +再次给出$J(\theta)$的表达式: + +$$ +J(\theta) = -\frac{1}{m}[\Sigma_{i = 1}^my^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - logh_\theta(x^{(i)}))] +$$ + +所以 + +$$ +\frac{\partial}{\partial \theta_j}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} +$$ + +这里应该看到,对数损失函数以及平方损失函数的一阶偏导的形式是完全相同的(尽管其中的$h_\theta(x)$不同),据说这并不是巧合,而是存在一些深层次的原因,有机会我会回来说明一下。 + +因此可以给出二阶偏导的表达式 + +$$ +\frac{\partial^2}{\partial \theta_j \partial \theta_k}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^mx_j^{(i)}\frac{e^{-z}}{(1 + e^{-z})^2}x_k^{(i)},\ z = \theta^Tx^{(i)} +$$ + +可以看出,$\frac{e^{-z}}{(1 + e^{-z})^2}$一定是大于零的。不妨设$g(x)$为 + +$$ +g(x) = \sqrt{\frac{e^{-\theta^Tx}}{(1 + e^{-\theta^Tx})^2}} +$$ + +构造矩阵$G$为 + +$$ +G = \left[ +\begin{matrix} +g(x^{(1)}) & & &\\\\ +& g(x^{(2)}) & &\\\\ +& & \ddots & \\\\ +& & & g(x^{(m)}) +\end{matrix} +\right] +$$ + +所以对数损失函数的 Hessian 矩阵为 + +$$ +H = \frac{1}{m}\left[ +\begin{matrix} +\frac{\partial^2}{\partial \theta_0^2}J(\theta) & \frac{\partial^2}{\partial \theta_0 \partial \theta_1}J(\theta) & \cdots & \frac{\partial^2}{\partial \theta_0 \partial \theta_n}J(\theta)\\\\ +\frac{\partial^2}{\partial \theta_1 \partial \theta_0}J(\theta) & \frac{\partial^2}{\partial \theta_1^2}J(\theta) + & \cdots & \frac{\partial^2}{\partial \theta_1 \partial \theta_n}J(\theta)\\\\ +\vdots & \vdots & & \vdots\\\\ +\frac{\partial^2}{\partial \theta_n \partial \theta_0}J(\theta) & \frac{\partial^2}{\partial \theta_n \partial \theta_1}J(\theta) & \cdots & \frac{\partial^2}{\partial \theta_n^2}J(\theta) +\end{matrix} +\right] +$$ + +容易看出(?, + +$$ +H = \frac{1}{m}(GX)^TGX +$$ + +因此,Hessian 矩阵是一个半正定矩阵,从而对数损失函数确实是一个凸函数,得证。同理可得,规范化后的对数损失函数也是一个凸函数,这里不再赘述。这样,利用梯度下降法求解对数损失函数的最小值,一定可以收敛到全局最优点。 + +### 多分类问题 + +顾名思义,多分类问题中预测的结果可以有多个(多于两个)取值,比如给定一个图片集,将每张图片划分为行人,车辆,道路,树木四个类别。为了求解多分类问题,可以简单地套用二分类问题的方法。 + +具体说来,假设多分类问题中一共有$k(k \ge 3)$个类别,因此预测值$y$有$k$个不同的取值。套用二分类问题的方法是,对于每一个类别$c$,定义输出为$c$时$y = 1$,输出不为$c$时$y = 0$,这样就把问题转化为了一个二分类问题。可见,对于任一个类别,都需要训练一个二分类器,最终一共需要训练$k$个二分类器,即 + +$$ +h_\theta^{(i)}(x) = P(y = i | x)\ (i = 1, 2, 3, ..., k) +$$ + +对模型进行预测时,分别使用$k$个二分类器对模型进行预测,可以得到$k$个概率,分别表示在当前输入的条件下,输出为某个类别的可能性。最后,简单选择可能性最大的一个类别,作为多分类问题的输出,即 + +$$ +max_i h_\theta^{(i)}(x) +$$ + +## 过拟合 + +在此前的 [线性回归总结](../linear_regression/linear_regression.md) 中,已经对过拟合问题进行了一些探讨,这里主要是结合实例,直观地说明过拟合问题及其解决方案。 + +为了解决过拟合,仍然可以对此前的对数损失函数添加**正则化项**,正则化后的损失函数$J(\theta)$ + +$$ +J(\theta) = -\frac{1}{m}[\Sigma_{i = 1}^my^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1 - logh_\theta(x^{(i)}))] + \frac{\lambda}{2m}\Sigma_{i = j}^n\theta_j^2 +$$ + +下面以一个具体实例,直观地展示过拟合现象以及正则化对过拟合的影响。这个实例是一个二类分类问题,输入$x$是一个二维向量,即具有两个特征$x_1, x_2$。首先对原始数据进行可视化,如下图所示: + +![initial_data](images/initial_data.png) + +其中用圆圈标识$y = 0$的实例,用十字标识$y = 1$的实例,容易看出,原始数据并不服从线性分布,因此考虑添加高次项,利用多项式回归对该模型进行拟合。这里是添加了$x_1, x_2$的所有二次项与三次项,再加上$x_0$,处理后的输入具有28个特征。 + +之后,我手动将这些数据划分成了训练集和测试集,其中测试集占所有数据的20%。然后分别使用未正则化的损失函数与正则化的损失函数($\lambda = 1$),利用梯度下降法对模型进行训练。结果如下: + +![overfit](images/overfit.png) +![justfit](images/justfit.png) + +图中黑色的圆圈或者十字,是表示训练集的实例;而红色边界的圆圈或者十字,表示的是测试集实例。可以看到,未经过正则化的损失函数,训练出来的模型决策边界相对复杂,具有许多高次项,同时对于训练集有更高的预测准确率(87.21%);而正则化后的损失函数,利用梯度下降法训练出的决策边界则要简单很多,比较规则,对训练集的准确率也要低一些(80.23%)。 + +尽管如此,未正则化的模型,对于测试集数据的预测正确率则要低了不少(81.25%),而正则化的模型,则对测试集有更高的预测准确率(84.375%)。这说明没有正则化虽然可以获得更高的训练集预测准确率,却难以将训练得到的模型**泛化**到其他输入数据当中,因此发生了过拟合。而引入正则化则可以使训练的模型具有更好的**泛化能力**。 diff --git a/ml/logistic_regression/overfit.png b/ml/logistic_regression/overfit.png new file mode 100644 index 0000000..6ac98b2 Binary files /dev/null and b/ml/logistic_regression/overfit.png differ