mirror of
https://github.com/apachecn/ailearning.git
synced 2026-04-28 20:42:33 +08:00
2020-10-19 21:18:53
This commit is contained in:
32
docs/ml/5.md
32
docs/ml/5.md
@@ -1,7 +1,7 @@
|
||||
# 第5章 Logistic回归
|
||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
|
||||
|
||||

|
||||

|
||||
|
||||
## Logistic 回归 概述
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
|
||||
我们想要的函数应该是: 能接受所有的输入然后预测出类别。例如,在两个类的情况下,上述函数输出 0 或 1.或许你之前接触过具有这种性质的函数,该函数称为 `海维塞得阶跃函数(Heaviside step function)`,或者直接称为 `单位阶跃函数`。然而,海维塞得阶跃函数的问题在于: 该函数在跳跃点上从 0 瞬间跳跃到 1,这个瞬间跳跃过程有时很难处理。幸好,另一个函数也有类似的性质(可以输出 0 或者 1 的性质),且数学上更易处理,这就是 Sigmoid 函数。 Sigmoid 函数具体的计算公式如下:
|
||||
|
||||

|
||||

|
||||
|
||||
下图给出了 Sigmoid 函数在不同坐标尺度下的两条曲线图。当 x 为 0 时,Sigmoid 函数值为 0.5 。随着 x 的增大,对应的 Sigmoid 值将逼近于 1 ; 而随着 x 的减小, Sigmoid 值将逼近于 0 。如果横坐标刻度足够大, Sigmoid 函数看起来很像一个阶跃函数。
|
||||
|
||||

|
||||

|
||||
|
||||
因此,为了实现 Logistic 回归分类器,我们可以在每个特征上都乘以一个回归系数(如下公式所示),然后把所有结果值相加,将这个总和代入 Sigmoid 函数中,进而得到一个范围在 0~1 之间的数值。任何大于 0.5 的数据被分入 1 类,小于 0.5 即被归入 0 类。所以,Logistic 回归也是一种概率估计,比如这里Sigmoid 函数得出的值为0.5,可以理解为给定数据和参数,数据被分入 1 类的概率为0.5。想对Sigmoid 函数有更多了解,可以点开[此链接](https://www.desmos.com/calculator/bgontvxotm)跟此函数互动。
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
|
||||
Sigmoid 函数的输入记为 z ,由下面公式得到:
|
||||
|
||||

|
||||

|
||||
|
||||
如果采用向量的写法,上述公式可以写成  ,它表示将这两个数值向量对应元素相乘然后全部加起来即得到 z 值。其中的向量 x 是分类器的输入数据,向量 w 也就是我们要找到的最佳参数(系数),从而使得分类器尽可能地精确。为了寻找该最佳参数,需要用到最优化理论的一些知识。我们这里使用的是——梯度上升法(Gradient Ascent)。
|
||||
如果采用向量的写法,上述公式可以写成  ,它表示将这两个数值向量对应元素相乘然后全部加起来即得到 z 值。其中的向量 x 是分类器的输入数据,向量 w 也就是我们要找到的最佳参数(系数),从而使得分类器尽可能地精确。为了寻找该最佳参数,需要用到最优化理论的一些知识。我们这里使用的是——梯度上升法(Gradient Ascent)。
|
||||
|
||||
|
||||
### 梯度上升法
|
||||
@@ -50,17 +50,17 @@ Sigmoid 函数的输入记为 z ,由下面公式得到:
|
||||
#### 梯度上升法的思想
|
||||
要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为 ▽ ,则函数 f(x, y) 的梯度由下式表示:
|
||||
|
||||

|
||||

|
||||
|
||||
这个梯度意味着要沿 x 的方向移动  ,沿 y 的方向移动  。其中,函数f(x, y) 必须要在待计算的点上有定义并且可微。下图是一个具体的例子。
|
||||
这个梯度意味着要沿 x 的方向移动  ,沿 y 的方向移动  。其中,函数f(x, y) 必须要在待计算的点上有定义并且可微。下图是一个具体的例子。
|
||||
|
||||

|
||||

|
||||
|
||||
上图展示的,梯度上升算法到达每个点后都会重新估计移动的方向。从 P0 开始,计算完该点的梯度,函数就根据梯度移动到下一点 P1。在 P1 点,梯度再次被重新计算,并沿着新的梯度方向移动到 P2 。如此循环迭代,直到满足停止条件。迭代过程中,梯度算子总是保证我们能选取到最佳的移动方向。
|
||||
|
||||
上图中的梯度上升算法沿梯度方向移动了一步。可以看到,梯度算子总是指向函数值增长最快的方向。这里所说的是移动方向,而未提到移动量的大小。该量值称为步长,记作 α 。用向量来表示的话,梯度上升算法的迭代公式如下:
|
||||
|
||||

|
||||

|
||||
|
||||
该公式将一直被迭代执行,直至达到某个停止条件为止,比如迭代次数达到某个指定值或者算法达到某个可以允许的误差范围。
|
||||
|
||||
@@ -80,12 +80,12 @@ Sigmoid 函数的输入记为 z ,由下面公式得到:
|
||||
|
||||
只需要在迭代公式中的加法变成减法。因此,对应的公式可以写成
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
**局部最优现象 (Local Optima)**
|
||||
|
||||

|
||||

|
||||
|
||||
上图表示参数 θ 与误差函数 J(θ) 的关系图 (这里的误差函数是损失函数,所以我们要最小化损失函数),红色的部分是表示 J(θ) 有着比较高的取值,我们需要的是,能够让 J(θ) 的值尽量的低。也就是深蓝色的部分。θ0,θ1 表示 θ 向量的两个维度(此处的θ0,θ1是x0和x1的系数,也对应的是上文w0和w1)。
|
||||
|
||||
@@ -126,7 +126,7 @@ Sigmoid 函数的输入记为 z ,由下面公式得到:
|
||||
|
||||
### 附加 方向导数与梯度
|
||||
|
||||

|
||||

|
||||
|
||||
## Logistic 回归 项目案例
|
||||
|
||||
@@ -163,7 +163,7 @@ Sigmoid 函数的输入记为 z ,由下面公式得到:
|
||||
|
||||
绘制在图中,如下图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
> 准备数据: 由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳
|
||||
|
||||
@@ -247,7 +247,7 @@ def gradAscent(dataMatIn, classLabels):
|
||||
|
||||
大家看到这儿可能会有一些疑惑,就是,我们在迭代中更新我们的回归系数,后边的部分是怎么计算出来的?为什么会是 alpha * dataMatrix.transpose() * error ?因为这就是我们所求的梯度,也就是对 f(w) 对 w 求一阶导数。具体推导如下:
|
||||
|
||||

|
||||

|
||||
可参考http://blog.csdn.net/achuo/article/details/51160101
|
||||
|
||||
画出数据集和 Logistic 回归最佳拟合直线的函数
|
||||
@@ -357,7 +357,7 @@ def stocGradAscent0(dataMatrix, classLabels):
|
||||
|
||||
判断优化算法优劣的可靠方法是看它是否收敛,也就是说参数是否达到了稳定值,是否还会不断地变化?下图展示了随机梯度上升算法在 200 次迭代过程中回归系数的变化情况。其中的系数2,也就是 X2 只经过了 50 次迭代就达到了稳定值,但系数 1 和 0 则需要更多次的迭代。如下图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
针对这个问题,我们改进了之前的随机梯度上升算法,如下:
|
||||
|
||||
@@ -393,7 +393,7 @@ def stocGradAscent1(dataMatrix, classLabels, numIter=150):
|
||||
|
||||
程序运行之后能看到类似于下图的结果图。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 项目案例2: 从疝气病症预测病马的死亡率
|
||||
|
||||
Reference in New Issue
Block a user