Logistic Regression¶
Classification¶
在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。
- 垃圾邮件判断
- 金融欺诈判断
- 肿瘤诊断
讨论肿瘤诊断问题:

肿瘤诊断问题的目的是告诉病人是否为恶性肿瘤,是一个二元分类问题(binary class problems),则定义 y \in\lbrace 0, 1\rbrace,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项。
在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定
h_\theta(x) \geqslant 0.5 ,预测为 y = 1,即正向类;
h_\theta(x) \lt 0.5 ,预测为 y = 0,即负向类。
即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果 y。
接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。
不仅如此,线性回归算法的值域为全体实数集(h_\theta(x) \in R),则当线性回归函数给出诸如 h_\theta(x) = 10000, h_\theta(x) = -10000 等很大/很小(负数)的数值时,结果 y \in \lbrace 0, 1\rbrace,这显得非常怪异。
区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即 h_\theta(x) \in (0,1)。
Hypothesis Representation¶
对数几率函数(logistic function)正是我们所需要的(注意这里的 y 依然是实值):
y = \frac{1}{1+e^{-z}}
对数几率函数有时也称为对率函数,是一种Sigmoid函数(即形似S的函数)。将它作为 g^-(\cdot) 代入广义线性模型可得:
y = \frac{1}{1+ e^{-(\mathbf{w^Tx} + b)}}
逻辑函数是 S 形函数,会将所有实数映射到 (0, 1) 范围。
sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为 g\left( z \right)=\frac{1}{1+{{e}^{-z}}}。

应用 sigmoid 函数,则逻辑回归模型:
该式可以改写为:
\ln{\frac{y}{1-y}} = \mathbf{w^Tx} + b
其中,\frac{y}{1-y} 称作几率(odds),我们可以把 y 理解为该样本是正例的概率,把 1-y 理解为该样本是反例的概率,而几率表示的就是该样本作为正例的相对可能性。若几率大于1,则表明该样本更可能是正例。对几率取对数就得到对数几率(log odds,也称为logit)。几率大于1时,对数几率是正数。
由此可以看出,对数几率回归的实质使用线性回归模型的预测值逼近分类任务真实标记的对数几率。它有几个优点:
- 直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题;
- 不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;
- 对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。
最大似然估计¶
有了预测函数之后,我们需要关心的就是怎样求取模型参数了。这里介绍一种与最小二乘法异曲同工的办法,叫做极大似然法(maximum likelihood method)。我在另一个项目中有这方面比较详细的讲解,欢迎前往项目主页交流学习。
前面说道可以把 y 理解为一个样本是正例的概率,把 1-y 理解为一个样本是反例的概率。而所谓极大似然,就是最大化预测事件发生的概率,也即最大化所有样本的预测概率之积。令 p(c=1|\mathbf{x}) 和 p(c=0|\mathbf{x}) 分别代表 y 和 1-y。(注:书中写的是 y=1 和 y=0,这里为了和前面的 y 区别开来,我用了 c 来代表标记)。简单变换一下公式,可以得到:
p(c=1|\mathbf{x}) = \frac{e^(\mathbf{w^Tx} + b)}{1+e^{\mathbf{w^Tx} + b}}
p(c=0|\mathbf{x}) = \frac{1}{1+e^{\mathbf{w^Tx} + b}}
但是!由于预测概率都是小于1的,如果直接对所有样本的预测概率求积,所得的数会非常非常小,当样例数较多时,会超出精度限制。所以,一般来说会对概率去对数,得到对数似然(log-likelihood),此时求所有样本的预测概率之积就变成了求所有样本的对数似然之和。对率回归模型的目标就是最大化对数似然,对应的似然函数是:
\ell(\mathbf{w},b) = \sum_{i=1}^m \ln p(c_i | \mathbf{x_i;w};b)\
=\sum_{i=1}^m \ln (p_1(\hat{\mathbf{x_i}};\beta)^{c_i}(p_0(\hat{\mathbf{x_i}};\beta))^{(1-c_i)}\
= \sum_{i=1}^m \ln (c_ip_1(\hat{\mathbf{x_i}};\beta) + (1-c_i)p_0(\hat{\mathbf{x_i}};\beta))
可以理解为若标记为正例,则加上预测为正例的概率,否则加上预测为反例的概率。其中 \beta = (\mathbf{w};b)。
对该式求导,令导数为0可以求出参数的最优解。特别地,我们会发现似然函数的导数和损失函数是等价的,所以说最大似然解等价于最小二乘解。最大化似然函数等价于最小化损失函数:
这是一个关于 \beta 的高阶可导连续凸函数,可以用最小二乘求(要求矩阵的逆,计算开销较大),也可以用数值优化算法如梯度下降法(gradient descent method)、牛顿法(Newton method)等逐步迭代来求最优解(可能陷入局部最优解)。
逻辑回归模型中,h_\theta \left( x \right) 的作用是,根据输入 x 以及参数 \theta,计算得出”输出 y=1“的可能性(estimated probability),概率学中表示为:
\begin{align}
& h_\theta(x) = P(y=1 | x ; \theta) = 1 - P(y=0 | x ; \theta) \
& P(y = 0 | x;\theta) + P(y = 1 | x ; \theta) = 1
\end{align}
以肿瘤诊断为例,h_\theta \left( x \right)=0.7 表示病人有 70\% 的概率得了恶性肿瘤。
Decision Boundary¶
决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。
在逻辑回归中,有假设函数 h_\theta \left( x \right)=g(z)=g\left(\theta^{T}x \right)。
为了得出分类的结果,这里和前面一样,规定以 0.5 为阈值:
\begin{align}
& h_\theta(x) \geq 0.5 \rightarrow y = 1 \
& h_\theta(x) < 0.5 \rightarrow y = 0 \
\end{align}
回忆一下 sigmoid 函数的图像:

观察可得当 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 \
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) 是下图模型的假设函数:

根据上面的讨论,要进行分类,那么只要 {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}\geq0 时,就预测 y = 1,即预测为正向类。
如果取 \theta = \begin{bmatrix} -3\1\1\end{bmatrix},则有 z = -3+{x_1}+{x_2},当 z \geq 0 即 {x_1}+{x_2} \geq 3 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 y=1 的分类预测结果。
上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。
为了拟合下图数据,建模多项式假设函数:
{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},决策边界对应了一个在原点处的单位圆({x_1}^2+{x_2}^2 = 1),如此便可给出分类结果,如图中品红色曲线:

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。
简单来说,决策边界就是分类的分界线,分类现在实际就由 z (中的 \theta)决定啦。
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) 的图像,如下图

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

如果此处的损失函数也是一个凸函数,是否也有同样的性质,从而最优化?这类讨论凸函数最优值的问题,被称为凸优化问题(Convex optimization)。
当然,损失函数不止平方损失函数一种。
对于逻辑回归,更换平方损失函数为对数损失函数,可由统计学中的最大似然估计方法推出代价函数 J(\theta):
\begin{align}
& J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \
& \mathrm{Cost}(h_\theta(x),y) = -\log(h_\theta(x)) \; & \text{if y = 1} \
& \mathrm{Cost}(h_\theta(x),y) = -\log(1-h_\theta(x)) \; & \text{if y = 0}
\end{align}
则有关于 J(\theta) 的图像如下:

如左图,当训练集的结果为 y=1(正样本)时,随着假设函数趋向于 1,代价函数的值会趋于 0,即意味着拟合程度很好。如果假设函数此时趋于 0,则会给出一个很高的代价,拟合程度差,算法会根据其迅速纠正 \theta 值,右图 y=0 同理。
区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。
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 \
&{{\theta }{j}}:={{\theta }{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( {\theta} \right) \
\rbrace
\end{align}
解出偏导得:
\begin{align}
& \text{Repeat until convergence:} \; \lbrace \
& \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}\
\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) = g(z),g(z) = \frac{1}{1+e^{(-z)}},则
\begin{align}
f(\theta) &= {{y}^{(i)}}\log \left( \frac{1}{1+{{e}^{-z}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}^{-z}}} \right) \
&= -{{y}^{(i)}}\log \left( 1+{{e}^{-z}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{z}} \right)
\end{align}
忆及 z=\theta^Tx^{(i)},对 \theta_j 求偏导,则没有 \theta_j 的项求偏导即为 0,都消去,则得:
\frac{\partial z}{\partial {\theta_{j}}}=\frac{\partial }{\partial {\theta_{j}}}\left( \theta^Tx^{(i)} \right)=x^{(i)}_j
所以有:
\begin{align}
\frac{\partial }{\partial {\theta_{j}}}f\left( \theta \right)&=\frac{\partial }{\partial {\theta_{j}}}[-{{y}^{(i)}}\log \left( 1+{{e}^{-z}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}^{z}} \right)] \
&=-{{y}^{(i)}}\frac{\frac{\partial }{\partial {\theta_{j}}}\left(-z \right) e^{-z}}{1+e^{-z}}-\left( 1-{{y}^{(i)}} \right)\frac{\frac{\partial }{\partial {\theta_{j}}}\left(z \right){e^{z}}}{1+e^{z}} \
&=-{{y}^{(i)}}\frac{-x^{(i)}je^{-z}}{1+e^{-z}}-\left( 1-{{y}^{(i)}} \right)\frac{x^{(i)}_j}{1+e^{-z}} \
&=\left({{y}^{(i)}}\frac{e^{-z}}{1+e^{-z}}-\left( 1-{{y}^{(i)}} \right)\frac{1}{1+e^{-z}}\right)x^{(i)}_j \
&=\left({{y}^{(i)}}\frac{e^{-z}}{1+e^{-z}}-\left( 1-{{y}^{(i)}} \right)\frac{1}{1+e^{-z}}\right)x^{(i)}_j \
&=\left(\frac{{{y}^{(i)}}(e^{-z}+1)-1}{1+e^{-z}}\right)x^{(i)}_j \
&={({{y}^{(i)}}-\frac{1}{1+{{e}^{-z}}})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)}}
\end{align}
则可得代价函数的导数:
\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)}
Advanced Optimization¶
运行梯度下降算法,其能最小化代价函数 J(\theta) 并得出 \theta 的最优值,在使用梯度下降算法时,如果不需要观察代价函数的收敛情况,则直接计算 J(\theta) 的导数项即可,而不需要计算 J(\theta) 值。
我们编写代码给出代价函数及其偏导数然后传入梯度下降算法中,接下来算法则会为我们最小化代价函数给出参数的最优解。这类算法被称为最优化算法(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} 最优值。
Multiclass Classification: One-vs-all¶
一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。

原理是,转化多类别分类问题为多个二元分类问题,这种方法被称为 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 维向量。
对于某个样本实例,需计算所有的 k 种分类情况得到 h_\theta(x),然后看分为哪个类别时预测输出的值最大,就说它输出属于哪个类别,即 y = \mathop{\max}\limits_i\,h_\theta^{\left( i \right)}\left( x \right)。
logistic 损失函数的解释(Explanation of logistic regression cost function)¶
在前面的视频中,我们已经分析了逻辑回归的损失函数表达式,在这节选修视频中,我将给出一个简洁的证明来说明逻辑回归的损失函数为什么是这种形式。

回想一下,在逻辑回归中,需要预测的结果\hat{y},可以表示为\hat{y}=\sigma(w^{T}x+b),\sigma 我们熟悉的S 函数 \sigma(z)=\sigma(w^{T}x+b)=\frac{1}{1+e^{-z}} 。我们约定 \hat{y}=p(y=1|x) ,即算法的输出\hat{y} 是给定训练样本 x 条件下 y 等于1的概率。换句话说,如果y=1,在给定训练样本 x 条件下y=\hat{y};反过来说,如果y=0,在给定训练样本x 件下 y 等于1减去\hat{y}(y=1-\hat{y}),因此,如果 \hat{y} 代表 y=1 的概率,那么1-\hat{y} 是 y=0 概率。接下来,我们就来分析这两个条件概率公式。

这两个条件概率公式定义形式为 p(y|x) 且代表了 y=0 或者 y=1 这两种情况,我们可以将这两个公式合并成一个公式。需要指出的是我们讨论的是二分类问题的损失函数,因此,y 取值只能是0或者1。上述的两个条件概率公式可以合并成如下公式:
p(y|x)={\hat{y}}^{y}{(1-\hat{y})}^{(1-y)}
接下来我会解释为什么可以合并成这种形式的表达式:(1-\hat{y}) (1-y) 方这行表达式包含了上面的两个条件概率公式,我来解释一下为什么。

第一种情况,假设 y=1,由于y=1,那么{(\hat{y})}^{y}=\hat{y},因为 \hat{y} 1次方等于\hat{y},1-{(1-\hat{y})}^{(1-y)} 指数项(1-y) 于0,由于任何数的0次方都是1,\hat{y} 以1等于\hat{y}。因此当y=1 p(y|x)=\hat{y}(图中绿色部分)。
第二种情况,当 y=0 时 p(y|x) 等于多少呢?
假设y=0,\hat{y} y 方就是
因此,刚才的推导表明 p(y|x)={\hat{y}}^{(y)}{(1-\hat{y})}^{(1-y)},就是 p(y|x) 的完整定义。由于 log 函数是严格单调递增的函数,最大化 log(p(y|x)) 等价于最大化 p(y|x) 并且计算 p(y|x) 的 log对数,就是计算 log({\hat{y}}^{(y)}{(1-\hat{y})}^{(1-y)}) (其实就是将 p(y|x) 代入),通过对数函数化简为:
ylog\hat{y}+(1-y)log(1-\hat{y})
而这就是我们前面提到的损失函数的负数 (-L(\hat{y},y)) ,前面有一个负号的原因是当你训练学习算法时需要算法输出值的概率是最大的(以最大的概率预测这个值),然而在逻辑回归中我们需要最小化损失函数,因此最小化损失函数与最大化条件概率的对数 log(p(y|x)) 关联起来了,因此这就是单个训练样本的损失函数表达式。

在 m 训练样本的整个训练集中又该如何表示呢,让我们一起来探讨一下。
让我们一起来探讨一下,整个训练集中标签的概率,更正式地来写一下。假设所有的训练样本服从同一分布且相互独立,也即独立同分布的,所有这些样本的联合概率就是每个样本概率的乘积:
P\left(\text{labels in training set} \right) = \prod_{i =1}^{m}{P(y^{(i)}|x^{(i)})}。

如果你想做最大似然估计,需要寻找一组参数,使得给定样本的观测值概率最大,但令这个概率最大化等价于令其对数最大化,在等式两边取对数:
logp\left( \text{labels in training set} \right) = log\prod_{i =1}^{m}{P(y^{(i)}|x^{(i)})} = \sum_{i = 1}^{m}{logP(y^{(i)}|x^{(i)})} = \sum_{i =1}^{m}{- L(\hat y^{(i)},y^{(i)})}
在统计学里面,有一个方法叫做最大似然估计,即求出一组参数,使这个式子取最大值,也就是说,使得这个式子取最大值,\sum_{i= 1}^{m}{- L(\hat y^{(i)},y^{(i)})},可以将负号移到求和符号的外面,- \sum_{i =1}^{m}{L(\hat y^{(i)},y^{(i)})},这样我们就推导出了前面给出的logistic回归的成本函数J(w,b)= \sum_{i = 1}^{m}{L(\hat y^{(i)},y^{\hat( i)})}。

由于训练模型时,目标是让成本函数最小化,所以我们不是直接用最大似然概率,要去掉这里的负号,最后为了方便,可以对成本函数进行适当的缩放,我们就在前面加一个额外的常数因子\frac{1}{m},即:J(w,b)= \frac{1}{m}\sum_{i = 1}^{m}{L(\hat y^{(i)},y^{(i)})}。
总结一下,为了最小化成本函数J(w,b),我们从logistic回归模型的最大似然估计的角度出发,假设训练集中的样本都是独立同分布的条件下。
评论