『我爱机器学习』简单回归

本文介绍:

  • 线性回归
  • 逻辑回归

线性回归

回归问题举个简单的例子,如预测股票的价格,输出空间y不再是一个标签,而是一个实数集。

对此,线性回归问题的假设是: \[
f({\bf x}) = {\bf w^T x} + b
\]

可以看出和感知机的模型很像,只不过不用取sign,因为最后结果就是个连续的值。

有时为了方便表示,将b吸收进w,把所有的样本x添加一列为1,成为一个矩阵X: \[
{\bf w} = ({\bf w_{old}},b)
\]

\[
\rm X = \begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1d} & 1 \\
x_{21} & x_{22} & \cdots & x_{2d} & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_{n1} & x_{n2} & \cdots & x_{nd} & 1 \\
\end{bmatrix}
\]

于是得到: \[
f({\bf x}) = \rm X{\bf w}
\]

设样本数为M,特征数为d,则维度为:

  • \(\rm X\): n * (d + 1)
  • \({\bf y}\): n * 1
  • \({\bf w}​\): (d + 1) * 1

优化目标

在回归问题中,均方误差是常见的性能度量,公式如下: \[
{\rm err}(f({\bf x}), y) = (f({\bf x}) – y)^2
\]
均方误差对应了常见的欧几里得距离,基于均方误差最小化来进行模型求解的方法称为最小二乘法

线性回归便是用均方误差作为损失函数, \[
\begin{align*} L({\bf w})
& = (f({\bf x}) – {\bf y})^2 \\
& = (\rm X{\bf w} – {\bf y})^T (\rm X{\bf w} – {\bf y})
\end{align*}
\]
其实也就是找一个w使得损失函数最小:

\[
{\bf w}^* = \rm{arg min_{\bf w}} (X{\bf w} – {\bf y})^T (X{\bf w} – {\bf y})
\]

求解

w求导得: \[
\frac{\partial L({\bf w})}{\partial {\bf w}} = 2\rm X^T(\rm X{\bf w} – {\bf y})
\]
\(\rm X^TX\)是可逆的,令导数为0便得到: \[
{\bf w}^* = ({\rm X^TX})^{-1}{\rm X^T}{\bf y}
\]

通常有特征数d << 样本数m,使得\(\rm X^TX\)满秩,有唯一解。

但是也有许多情况m < d,这样\(\rm X^TX\)不是满秩的,会有多组解。此时可以解出多个w,都能使均方误差最小化。选择哪一解作为输出将由学习算法归纳偏好决定。

实际求解过程中,一般都直接求解\(\rm (X^TX)^{−1}X^T\)\(\rm (X^TX)^{−1}X^T\)称为\(\rm X\)的伪逆,记作\({\rm X}^\dagger\)

求解出伪逆后,线性回归模型为: \[
f({\bf x}) = \rm X (X^\dagger {\bf y})
\]

空间变换

线性回归可以进行输出空间的变换。

比如当我们觉得样本的是在指数尺度上变化,我们可以加个指数的变换使得\(f({\bf x})\)接近y \[
f({\bf x}) = e^{{\bf w^Tx}+b}
\]
也就是求解: \[
\ln y = {\bf w^T x }+b
\]
便得到了对数线性回归,如图(图来自周志华的《机器学习》):

这里对数函数起到了将线性回归模型的预测值与真实值联系起来的作用。

更一般的,考虑单调可谓函数g,令: \[
y = g^{-1}({\bf w^Tx}+b)
\]
这样的模型称为”广义线性模型“。g称为联系函数,显然对数线性回归是g = ln时的特例。

逻辑回归

现在来讲讲逻辑回归,虽然它的名字叫“回归”,但其实它用于分类任务。

在二分类问题中,我们的训练数据集是 \(T = \{(x_1,y_1), \cdots,(x_m,y_m)\}\) ,其中\(y_i \in \{-1, 1\}\)。训练数据的标签是-1和+1,那么我们预测也是输出+1或者-1标签。但是有时候我们想知道的是概率,即为正例或负例的概率是多少。比如用于医院的任务中,给定一个病人,预测其是否得某种病a。不仅是关心ta是否得病,还关心得病的概率是多少。这个问题与原来的二分类问题有所差别,被称作“软二元分类”问题。求解此问题得到的值越高,说明越有可能是得病a的,否则越有可能是不得病a的。此时目标函数会变化成\(f({\bf x})=P(+1|{\bf x})∈[0,1]\)的形式

和之前一样,我们仍可以假设计算加权分数,即 \[
z = \sum_{j=0}^d w_jx_j = {\bf w^Tx}
\]
然后,将该分数缩放到[0, 1]这个区间。而缩放操作通常使用Logistic函数来完成,因此这个问题称为Logistic回归问题,假设也被称为Logistic假设。

Logistic函数与逻辑回归模型

现在介绍神奇的Logistic函数 \[
\theta(z)= \frac{e^{\bf z}}{1+e^{\bf z}} = \frac{1}{1+e^{-{\bf z}}}
\]
画出二维的图:

从上图可以看出,对数几率函数是一种Sigmoid函数(即形似s的函数),它将z值转化为接近0或1的y值。

将上面的假设带入Logistic函数,便得到我们的逻辑回归模型,这里设为 \(h({\bf x})\) : \[
h({\bf x}) = \theta({\bf w^Tx}) = \frac{1}{1+e^{-({\bf w^Tx})}} \tag{2-1}
\]
按照上面的说法,我们进行了”映射“,这就是输出为正例的概率,因此 \[
\begin{align}
p(Y = 1 | {\bf x}) &= h({\bf x}) = \frac{1}{1+e^{-{\bf w^Tx}}} \\
p(Y = 0 | {\bf x}) &= 1-P(Y = 1|{\bf x}) \\
&= \frac{1}{1+e^{{\bf w^Tx}}} \\
\end{align}
\]
现在可以讨论Logistic函数的特点了,一个事件的几率(odds) 是该事件发生的概率与该事件不发生概率的比值,如果事件发生的概率为p,那么该事件的几率是\(\frac{p}{1-p}\),该事件的对数几率(就是取对数)是: \[
\ln \frac{p}{1-p}
\]
对于逻辑回归而言: \[
\ln \frac{P(Y = 1|{\bf x}) }{1-P(Y = 1|{\bf x}) } = {\bf w^Tx}
\]
因此可以看出,实际上我们的逻辑回归模型是用线性回归模型的预测结果去逼近真实标记的对数几率。

因此,我们用Logistic函数,并使用了线性函数\(\bf w^Tx\)完成了实数域到输出区间[0,1](概率值)的转化。

参数估计与损失函数

那么,如何确定逻辑回归模型中的w呢?我们可以使用极大似然法(maximum likelihood method)估计模型参数w

写出似然函数为: \[
\prod_{i=1}^N h({\bf x_i})^{y_i} (1- h({\bf x_i}))^{1-y_i}\\
\]
取对数似然为: \[
\begin{align}
&\sum_{i=1}^N [y_i\ln h({\bf x_i}) + (1-y_i)\ln(1- h({\bf x_i}))]\\
= & \sum_{i=1}^N [y_i\ln \frac{h({\bf x_i})}{1-h({\bf x_i})} + \ln(1- h({\bf x_i}))]\\
= &\sum_{i=1}^N [y_i ({\bf w^Tx_i}) – \ln(1+ e^{\bf w^Tx_i})]\\
\end{align}
\]

求上式的最大值即可得到w的估计值。但实际中,我们一般喜欢优化极小值,因此取个负号,得到我们逻辑回归的损失函数: \[
L(w) = \sum_{i=1}^N [-y_i ({\bf w^Tx_i }) + \ln(1+ e^{\bf w^Tx_i})] \tag{2-2}
\]

梯度下降求解

式2-2给出了损失函数L(w),该函数是关于w的高阶可导连续凸函数,可以用梯度下降法、牛顿法求解。

下面使用最常用的梯度下降法。

L(w)对\(\bf w_j\)求偏导,有: \[
\begin{align*} \frac{\partial L(\bf w)}{\partial w_j}
&= \sum_{i=1}^NM[-y_ix_{ij} + \frac{1}{1+e^{\bf w^Tx_i}}e^{\bf w^Tx_i}x_{ij}] \\
&= \sum_{i=1}^N[-y_ix_{ij} + h({\bf x_i})x_{ij}] \\
&= \sum_{i=1}^N \left(h({\bf x_i}) -y_i \right)x_{ij}
\end{align*}
\]
于是,w的更新公式为: \[
w_j = w_j – \eta\sum_{i=1}^N(h({\bf x_i}) -y_i )x_{ij}\tag{2-3}
\]

注意上述的更新公式有连加符号,在python的实现中,如果用for是非常慢的,我们希望能向量化上述式子,从而使用Numpy来加速过程。

查了半天资料,基本没个详细的,自己推吧。

那么,怎么加速呢?

分析公式2-3,我们发现\(w_j\)更新是\(w_j\)减去步长 乘上 每个训练数据的\(h({\bf x_i})-y_i\)并乘上对应的\(\bf x_i\)的j维。

如何消去累加? 联想到向量乘法或者矩阵乘法就是有累加的过程!

本文最开始的时候讲过:

\[
\rm X = \begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1d} & 1 \\
x_{21} & x_{22} & \cdots & x_{2d} & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_{n1} & x_{n2} & \cdots & x_{nd} & 1 \\
\end{bmatrix}
\]

维度如下:

  • X: N * (d + 1)
  • \({\bf y}\): N * 1
  • \({\bf w}\): (d + 1) * 1

我们可以构造矩阵 \[
\begin{align}
X^T(h(x) – y)
&= \begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1d} & 1 \\
x_{21} & x_{22} & \cdots & x_{2d} & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_{n1} & x_{n2} & \cdots & x_{nd} & 1 \\
\end{bmatrix} ^T
\begin{bmatrix}h(x_1) – y_1 \\h(x_2) – y_2 \\ \vdots \\h(x_n) – y_n \\\end{bmatrix}
\\& = \begin{bmatrix}
x_{11} & x_{21} & \cdots & x_{n1} \\
x_{12} & x_{22} & \cdots & x_{n2} \\
\vdots & \vdots & \ddots & \vdots \\
x_{1d} & x_{2d} & \cdots & x_{nd} \\
1 & 1 & \cdots &1 \\
\end{bmatrix}
\begin{bmatrix}h(x_1) – y_1 \\h(x_2) – y_2 \\ \vdots \\h(x_n) – y_n \\\end{bmatrix}
\\&= \begin{bmatrix}
x_{11} & x_{21} & \cdots & x_{n1} \\
x_{12} & x_{22} & \cdots & x_{n2} \\
\vdots & \vdots & \ddots & \vdots \\
x_{1d} & x_{2d} & \cdots & x_{nd} \\
x_{1(d+1)} & x_{2(d+1)} & \cdots & x_{n(d+1)} \\
\end{bmatrix}
\begin{bmatrix}h(x_1) – y_1 \\h(x_2) – y_2 \\ \vdots \\h(x_n) – y_n \\\end{bmatrix}
\\&= \begin{bmatrix}
\sum_{i=1}^n(h(x_i)-y_i) x_{i1} \\
\sum_{i=1}^n(h(x_i)-y_i) x_{i2} \\
\vdots \\
\sum_{i=1}^n(h(x_i)-y_i) x_{id} \\
\sum_{i=1}^n(h(x_i)-y_i) x_{i(d+1)} \\
\end{bmatrix}
\end{align}
\]
推导到这很明显了吧?

还不明显,那么继续: \[
\begin{align}
{\bf w} &= {\bf w}- \eta {\rm X^T}(h({\bf x}) – {\bf y})
\\& = \begin{bmatrix}
w_1 \\
w_2 \\
\vdots\\
w_d\\
w_{d+1}
\end{bmatrix}-\eta
\begin{bmatrix}
\sum_{i=1}^n(h(x_i)-y_i) x_{i1} \\
\sum_{i=1}^n(h(x_i)-y_i) x_{i2} \\
\vdots \\
\sum_{i=1}^n(h(x_i)-y_i) x_{id} \\
\sum_{i=1}^n(h(x_i)-y_i) x_{i(d+1)} \\
\end{bmatrix}
\\& = \begin{bmatrix}
w_1 – \eta\sum_{i=1}^n(h(x_i)-y_i) x_{i1} \\
w_2- \eta\sum_{i=1}^n(h(x_i)-y_i) x_{i2} \\
\vdots \\
w_d – \eta\sum_{i=1}^n(h(x_i)-y_i) x_{id} \\
w_{d+1} – \eta \sum_{i=1}^n(h(x_i)-y_i) x_{i(d+1)} \\
\end{bmatrix}
\end{align} \tag{2-4}
\]
看到这里就懂了吧? 式2-4是2-3等价的矩阵表示。

因此我们可以用式2-4来写程序~

这也是《机器学习实战》中倒数第二行式子的由来:

 

另一种似然函数

在上面推导损失函数2-2的时候,我们y的标签为{0,1},如果我们我们假设标签为{-1, +1},那么同样用极大似然估计,会得到很多材料上的另一种类似的似然函数。

推导如下: \[
\begin{align}
p(Y = +1 | {\bf x}) &= h({\bf x}) = \frac{1}{1+e^{-{\bf w^Tx}}} \\
p(Y = -1 | {\bf x}) &= 1-P(Y = 1|{\bf x}) \\
&= \frac{1}{1+e^{{\bf w^Tx}}}
\end{align}
\]
由于sigmoid有性质\(h(-x) = 1 – h(x)\),因此上面两式可以合并为: \[
p(y |{\bf x}) = h(y{\bf x}) = \frac{1}{1+e^{-y{\bf w^Tx}}}
\]
写出似然函数为: \[
\begin{align*}
\prod_{i=1}^n p(y_i |{\bf x_i}) &= \prod_{i=1}^n h(y_i{\bf x_i})
\\ &=\prod_{i=1}^n\frac{1}{1+e^{-y_i{\bf w^Tx_i}}}
\end{align*}
\]
取对数似然有: \[
\sum_{i=1}^n \ln\frac{1}{1+e^{-y_i{\bf w^Tx_i}}} = -\sum_{i=1}^n \ln(1+e^{-y_i{\bf w^Tx_i}})
\]
取负值就得到另一种损失函数 \[
\sum_{i=1}^n \ln(1+e^{-y_i{\bf w^Tx_i}})\tag{2-5}
\]

 

参考资料

本博客若无特殊说明则由 hrwhisper 原创发布
转载请点名出处:细语呢喃 > 『我爱机器学习』简单回归
本文地址:https://www.hrwhisper.me/machine-learning-linear-regression-logistic-regression/

打赏一杯咖啡钱呗

机器学习 , . permalink.

One thought on “『我爱机器学习』简单回归

Leave a Reply

Your email address will not be published. Required fields are marked *