机器学习:回归问题

机器学习:回归问题回归,我第一次看到回归的时候,想的就是回归是什么意思?后来看了一个答案解释很有意思,回归这个词来自于生物学,在调查父母与子代身高问题的时候,发现父母如果过高的话,子女就会比父母矮一点,如果父母矮的话,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

回归,我第一次看到回归的时候,想的就是回归是什么意思?后来看了一个答案解释很有意思,回归这个词来自于生物学,在调查父母与子代身高问题的时候,发现父母如果过高的话,子女就会比父母矮一点,如果父母矮的话,子女又会比父母高,这使得身高不会向高矮俩个极端发展,而是趋于回到中心,后来做统计的时候引入统计学,回归就是数据会向平均值靠拢,更确切地说,数据的分布遵循着某种规律,数据都会向这个规律靠近,就好比我们做事都有一个原则,我们每做一件事的时候,都会想想这个原则,做出的事尽量不会偏离这个原则。而我们要做的就是找出这些数据的规律,并用数学表示出这个规律。

引言

回归具体表现在数据中会是什么样的呢?我们来看分类的数据都是什么样,分类数据的类别必然是离散的,因为分类本质上就是找出决策边界,这个边界可能是线性的(这个边界是个直线),也有可能是非线性的(这个边界是弯弯曲曲的),有边界的前提就是类别一定是有限的,比如测身高,有监督(分类)模型可以找出决策边界告诉我们这个人是高还是矮,但是它一定得不到这个人的具体身高是多少,具体身高是一个连续值,不再被边界所束缚了,但是之前也说过身高不会随便乱发展,它也遵循着一种规律,那么找出回归规律,对身高规律进行建模,之后计算就能得到身高,这就是回归问题了。

简单来说的话,回归数据的类别都是连续的,分类数据的类别都是离散的。

我们可以用回归模型来得到具体身高,在现代很高女生认为180以上就是高,以下就是矮,我们就可以使用得到的具体身高来按照这个标准判断这个人是高还是矮,那么也就是说给一个阈值的话,就可以将回归应用到分类中。

那么现在的问题就是怎样找出这个规律?在生活中,规律是说大部分人的行为是符合一种特定的行为,那么我们只要让大部分数据符合我们建立的模型就行,但是我们知道数据不可能百分之一百符合,只能说是一种拟合,拟合就会有误差,很自然就可以想到当所有数据误差最小时的模型就是我们想要的模型,这也是一种权衡,选择出距离所有的点之和最短的那条线。那么问题就变成了模型如何表示?用数学上的线性和非线性函数来建立,而其中线性回归就是用线性函数来解决回归问题。

线性回归

线性函数来解决回归问题,说白了就是用一条直线来拟合所有数据,并且使整体拟合误差最小。图1就是一个线性回归图示,用整体误差最小的直线作为回归方程,而这种选择出距离所有的点之和最短的那条线也被称为最小二乘法。


机器学习:回归问题

图1. 线性回归图

最小二乘法推导

数学推导过程

我们先用数学来表示出整体误差,我们用向量来表示数据,默认的向量都是列向量,假设

\[X = (x_1, x_2, \dots, x_n)^T = \begin{bmatrix} x_{11} & x_{12} & \dots & x_{1p} \\ x_{21} & x_{22} & \dots & x_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \dots & x_{np} \\ \end{bmatrix} _{n\times p} \]

数据集\(X\)\(n\times p\)维矩阵,相当于有\(n\)条数据,每条数据有\(p\)维,其中的\(Y\)\(n\)维列向量,矩阵形式就是

\[Y = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_{n} \\ \end{bmatrix} _{n\times 1} \]

直线就会有线段的斜率\(W\)和偏置\(b\),线性函数初始化为\(Y = W^TX + b\),其中偏置\(b\)可以合并到斜率\(W\)中,将函数变成\(Y = W^TX + W_0X_0\),其中\(W_0 = b,X_0 = 1\),这样线性函数就可以合并成\(Y = W^TX\),计算还是正常计算,只是要心里有数,知道这里的偏置怎么合并进去的。现在可以写出整体拟合误差

\[L(W) = \sum\limits_{i=1}^{n} (W^Tx_i – y_i)^2 \]

可以将之进行分解

\[L(W) = \sum\limits_{i=1}^{n} (W^Tx_i – y_i)^2 = \begin{bmatrix} W^Tx_1 – y_1 & W^Tx_2 – y_2 & \dots & W^Tx_n – y_n\\ \end{bmatrix} \begin{bmatrix} W^Tx_1 – y_1 \\ W^Tx_2 – y_2 \\ \vdots \\ W^Tx_n – y_n \\ \end{bmatrix} \]

之后我们来看其中的

\[\begin{bmatrix}W^Tx_1 – y_1 & W^Tx_2 – y_2 & \dots & W^Tx_n – y_n\\\end{bmatrix} \]

可以将之分解开变成

\[\begin{bmatrix} W^Tx_1 – y_1 & W^Tx_2 – y_2 & \dots & W^Tx_n – y_n\\ \end{bmatrix}=W^T(x_1, x_2, \dots, x_n) – (y_1, y_2, \dots, y_n) = W^TX^T-Y^T \]

那么

\[\begin{bmatrix} W^Tx_1 – y_1 \\ W^Tx_2 – y_2 \\ \vdots \\ W^Tx_n – y_n \\ \end{bmatrix} = (W^TX^T-Y^T)^T = XW – Y \]

将上面的式子带入\(L(W)\)得到

\[L(W) = \sum\limits_{i=1}^{n} (W^Tx_i – y_i)^2 = (W^TX^T-Y^T)(XW – Y) = W^TX^TXW – W^TX^TY – Y^TXW + Y^TY \]

我们来看\(W^TX^TY\),其中的\(W^T\)\(1\times p\)\(X^T\)\(p\times n\)\(Y\)\(n\times 1\),所以\(W^TX^TY\)就是一个标量,那么它的转置\(Y^TXW\)也是标量,并且\(W^TX^TY\)\(Y^TXW\)相同,所以可以转化成

\[L(W) = W^TX^TXW – W^TX^TY – Y^TXW + Y^TY = W^TX^TXW – 2W^TX^TY + Y^TY \]

我们想要线性函数等于\(Y = W^TX\)的时候,整体拟合误差\(L(W)\)最小,换句话说,就是整体拟合误差\(L(W)\)最小的时候,求出\(W^T\)的值。那么对整体拟合误差\(L(W)\)进行求导

\[\frac{\partial L(W)}{\partial W} = \frac{\partial W^TX^TXW}{\partial W} – \frac{\partial 2W^TX^TY}{\partial W} \]

我们来看\(\frac{\partial W^TX^TXW}{\partial W}\),分子\(W^TX^TXW\)是一个标量,分母\(W\)是一个向量,这里面是矩阵求导,具体的话,就是标量对向量求导,后面的\(\frac{\partial 2W^TX^TY}{\partial W}\)还是标量对向量求导,这方面其实是有具体的公式的

\[\frac{\partial A^TX}{\partial X} = \frac{\partial X^TA}{\partial X} = A \\ \frac{\partial X^TAX}{\partial X} = (A + A^T)X \]

下面我们也会将矩阵求导公式的推导过程,这里先直接用,

\[\frac{\partial L(W)}{\partial W} = \frac{\partial W^TX^TXW}{\partial W} – \frac{\partial 2W^TX^TY}{\partial W} = 2X^TXW – 2X^TY \]

要求的是极值,那么将导数为0,得到\(2X^TXW – 2X^TY = 0\),那么进行转化得到\(W\)的求解公式

\[2X^TXW = 2X^TY \\ W = (X^TX)^{-1}X^TY \]

其中\((X^TX)^{-1}X^T\)在数学中也被称为伪逆,自此,推导过程全部结束。

一看到矩阵的逆,我就担心程序无法求解和计算量过大,先看程序无法求解,因为这个世界上存在不可逆矩阵,当样本不多或者维度非常大的时候,就无法满足\(N >> P\)条件,这时\(X^TX\)就不可逆,就有人引入了正则化项,并且将加入正则化项\(L_2\)称为岭回归,将加入正则化项\(L1\)称为LASSO回归,由于篇幅限制,这里只介绍一下岭回归。顺便提一下,正则化项\(L1\)\(P(W) = ||W||\)

即便加入正则化使它变成可逆矩阵了,但是这个矩阵的计算量肯定很大,研究中训练数据一般很多,\(X\)就非常大,并且有的时候还是高维数据,想求矩阵\((X^TX)^{-1}X^T\)就变得十分复杂,后来就使用了梯度下降法来求。下面的逻辑斯蒂回归就是用的梯度下降。

矩阵求导推导

为了防止以后忘记,我在这里面推导一下这俩个公式,首先讲一些前提数学知识。矩阵求导不太好求,先来看标量求导,函数的输入和输出都是标量(一个值),那么简单

\[Y = AX \\ \frac{\partial Y}{\partial X} = A \]

但是如果\(X\)\(Y\)任意一个是向量的话,那么导数的值也是一个向量,也就是有多个值,例如,假如\(X\)是向量,那么函数\(f(X)\)就要与\(X\)中的每个值进行求导,就得到了多个值,那么这多个值如何排列呢?如果\(X\)是向量,那么纵向排列,如果\(Y\)是向量,那么横向排列,如果俩个都是的话,那么俩个方向都要排列,我们来看一个例子,比如

\[X = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} , A = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \\ \end{bmatrix} \\ Y = f(X) = A^TX = \sum\limits_{i=1}^{n}a_ix_i \\ \]

我们可以看到\(Y\)是一个标量,\(X\)是一个向量,那么\(Y\)对向量\(X\)中的元素依次求导,并且纵向展开,那么

\[\frac{\partial Y}{\partial X} = \begin{bmatrix} \frac{\partial f(X)}{\partial x_1} \\ \frac{\partial f(X)}{\partial x_2} \\ \vdots \\ \frac{\partial f(X)}{\partial x_n} \\ \end{bmatrix} = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \\ \end{bmatrix} = A \]

因为\(Y\)是一个标量,那么它的转置就是它本身\(A^TX = X^TA\),所以

\[\frac{\partial A^TX}{\partial X} = \frac{\partial X^TA}{\partial X} = A \]

如果你还不懂,那么我们再来看看\(Y\)是向量的情况下求导,比如

\[Y = f(x), 其中\\ f(x) = \begin{bmatrix} f_1(x) \\ f_2(x) \\ \vdots \\ f_n(x) \\ \end{bmatrix} = \begin{bmatrix} a_1x \\ a_2x \\ \vdots \\ a_nx \\ \end{bmatrix} \]

那么\(Y\)肯定也是一个向量,对之进行求导,

\[\frac{\partial Y}{\partial X} = \begin{bmatrix} \frac{\partial f_1(x)}{\partial x} & \frac{\partial f_2(x)}{\partial x} & \dots & \frac{\partial f_n(x)}{\partial x} \\ \end{bmatrix} = \begin{bmatrix} a_1 & a_2 & \dots & a_n \\ \end{bmatrix} \]

我们再来看\(\frac{\partial X^TAX}{\partial X} = (A + A^T)X\),假设

\[X = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} , A = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{bmatrix} \]

可以看出\(X^TAX\)是标量,但是\(X\)是向量,那么先来看\(X^TAX\)

\[X^TAX = \begin{bmatrix} x_1 & x_2 & \dots & x_n \end{bmatrix} \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}a_{ij}x_ix_j \]

这下可以进行求导

\[\frac{\partial X^TAX}{\partial X} = \begin{bmatrix} \frac{\partial f(X)}{\partial x_1} \\ \frac{\partial f(X)}{\partial x_2} \\ \vdots \\ \frac{\partial f(X)}{\partial x_n} \\ \end{bmatrix} = \begin{bmatrix} \sum\limits_{i=1}^{n}a_{i1}x_i + \sum\limits_{j=1}^{n}a_{1j}x_j \\ \sum\limits_{i=1}^{n}a_{i2}x_i + \sum\limits_{j=1}^{n}a_{2j}x_j \\ \vdots \\ \sum\limits_{i=1}^{n}a_{in}x_i + \sum\limits_{j=1}^{n}a_{nj}x_j \\ \end{bmatrix} = \begin{bmatrix} \sum\limits_{i=1}^{n}a_{i1}x_i \\ \sum\limits_{i=1}^{n}a_{i2}x_i \\ \vdots \\ \sum\limits_{i=1}^{n}a_{in}x_i \\ \end{bmatrix} + \begin{bmatrix} \sum\limits_{j=1}^{n}a_{1j}x_j \\ \sum\limits_{j=1}^{n}a_{2j}x_j \\ \vdots \\ \sum\limits_{j=1}^{n}a_{nj}x_j \\ \end{bmatrix} \]

我们将上面展开就可以看出了

\[\frac{\partial X^TAX}{\partial X} = \begin{bmatrix} \sum\limits_{i=1}^{n}a_{i1}x_i \\ \sum\limits_{i=1}^{n}a_{i2}x_i \\ \vdots \\ \sum\limits_{i=1}^{n}a_{in}x_i \\ \end{bmatrix} + \begin{bmatrix} \sum\limits_{j=1}^{n}a_{1j}x_j \\ \sum\limits_{j=1}^{n}a_{2j}x_j \\ \vdots \\ \sum\limits_{j=1}^{n}a_{nj}x_j \\ \end{bmatrix} = \begin{bmatrix} a_{11}x_1 + a_{21}x_2 + \dots + a_{n1}x_n \\ a_{12}x_1 + a_{22}x_2 + \dots + a_{n2}x_n \\ \vdots \\ a_{1n}x_1 + a_{2n}x_2 + \dots + a_{nn}x_n \\ \end{bmatrix} + \begin{bmatrix} a_{11}x_1 + a_{12}x_2 + \dots + a_{1n}x_n \\ a_{21}x_1 + a_{22}x_2 + \dots + a_{2n}x_n \\ \vdots \\ a_{n1}x_1 + a_{n2}x_2 + \dots + a_{nn}x_n \\ \end{bmatrix} = \begin{bmatrix} a_{11} & a_{21} & \dots & a_{n1} \\ a_{12} & a_{22} & \dots & a_{n2} \\ \vdots \\ a_{1n} & a_{2n} & \dots & a_{nn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} + \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} \]

由此可见

\[\frac{\partial X^TAX}{\partial X} = \begin{bmatrix} a_{11} & a_{21} & \dots & a_{n1} \\ a_{12} & a_{22} & \dots & a_{n2} \\ \vdots \\ a_{1n} & a_{2n} & \dots & a_{nn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} + \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \\ \end{bmatrix} = A^TX+ AX = (A^T + A)X \]

自此对矩阵求导的推导完成。

岭回归

上面我们知道岭回归是为了解决\(X^TX\)不可逆的情况,并且也是解决过拟合的情况,下面我们简单推导一下岭回归,加入了正则化项\(L_2\)的话,\(L2\)正则化项,也称为Ridge,就是\(P(W) = W^2 = W^TW\)这种形式,那么就会变成

\[L(W) = \sum\limits_{i=1}^{n} (W^Tx_i – y_i)^2 + \lambda P(W) \]

其中的\(\lambda P(W)\)就是惩罚项,具体也就是上面的\(L2\)正则化项

\[L(W) = \sum\limits_{i=1}^{n} (W^Tx_i – y_i)^2 + \lambda W^TW \]

前面式子的推导过程上面都有,我就直接写出来了,并且\(\lambda\)是个实数。

\[L(W) = W^TX^TXW – 2W^TX^TY + Y^TY + \lambda W^TW = W^T(X^TX + \lambda E)W – 2W^TX^TY + Y^TY \]

下面还是进行求导,让导数为0

\[\frac{\partial L(W)}{\partial W} = 2(X^TX + \lambda E)W – 2X^TY = 0 \]

最终得到

\[W = (X^TX + \lambda E)^{-1}X^TY = 0 \]

这里面的\(X^TX\)是一个半正定矩阵,后面\(\lambda E\)是一个对角矩阵,那么\(X^TX + \lambda E\)一定是可逆的。

极大似然估计推导

我们再来看图一,图中有多个点,我们换一个角度思考,这个坐标系中可以有无数个点,为什么是这几个点被我们观察到?为什么出现的不是其他点,偏偏就是它们?难道这些点的背后隐藏着规律,而这个规律使得这些点出现的概率是最大,它们就是这个规律的天命点,它们就是最接近这个规律的点,那么我们只要找到一个函数使得这些点出现的概率最大即可,我们现在不知道这个函数是多少,但是我们知道这个函数一定存在,并且固定,那么将这个函数设置为

\[f(X) = W^TX \]

那这个函数不可能完全拟合所有的点,肯定有点和它是有误差的,我们设置这个误差为\(\varepsilon\),每个点都和这个函数有误差,那么函数和误差\(\varepsilon\)就共同组成了这些点,我们将之表示为

\[Y = f(X) + \varepsilon = W^TX + \varepsilon \]

既然每个点都有一个误差了,那么这个误差也会有一个概率分布函数,我们假设概率分布函数就是正态分布

\[\varepsilon \thicksim N(0, \sigma^2) \]

那么\(Y\)肯定也是一个正态分布,并且

\[Y|W,X \thicksim N(W^TX, \sigma^2) \\ P(y_i|x_i, W) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y – W^Tx_i)^2}{2\sigma^2}} \]

这个就不证明了,这是概率论的基础知识。现在我有了这些点出现的概率,我将这些点出现的概率最大来求函数参数\(W^T\)

\[L(W) = In\prod\limits_{i=1}^{n}P(y_i|x_i, W) = \sum\limits_{i=1}^{n}InP(y_i|x_i, W) = \sum\limits_{i=1}^{n}In \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y_i – W^Tx_i)^2}{2\sigma^2}} = \sum\limits_{i=1}^{n}(In \frac{1}{\sqrt{2\pi}\sigma} – \frac{(y_i – W^Tx_i)^2}{2\sigma^2}) \]

我们要求的是\(L(W)\)最大时候,\(W\)的值,那么

\[W = arg \max\limits_{W} L(W) \\ W = arg \max\limits_{W} \sum\limits_{i=1}^{n}(In \frac{1}{\sqrt{2\pi}\sigma} – \frac{(y_i – W^Tx_i)^2}{2\sigma^2}) \]

我们可以看出前面的\(In \frac{1}{\sqrt{2\pi}\sigma}\)\(W\)无关,那么

\[W = arg \max\limits_{W} \sum\limits_{i=1}^{n}(- \frac{1}{2\sigma^2}(y_i – W^Tx_i)^2 \\ W = arg \min\limits_{W} \sum\limits_{i=1}^{n}(y_i – W^Tx_i)^2 \]

上面这个式子是不是有点熟悉,整体拟合误差最小,这个式子和最小二乘法的计算公式是一样的,从这里也可以看出极大似然估计和最小二乘估计相差的就是一个正态分布。

贝叶斯学派

不论是最小二乘和极大似然估计,它都有一个大前提,这些数据都是在某个确定的参数下产生,虽然我事先并不知道这个参数是什么,但是通过这些产生的数据可以逆流而上反推这个确定的参数,那么参数在我们眼里就是客观存在的,并不会改变,我们只要找出哪个值最有可能是真实参数就行,这其实就是机器学习中频率派的思想。那么你想想,难道这个世界真的是由一条条确定的规律组成的吗?这个世界是确定的吗?我们无法给出答案,因为我们是人类,没有上帝视角,我们并不能说上面出现的点就是由某种确定的参数下产生,我们只能对世界有一个预先的估计,之后通过不断地获取信息来调整之前的预估计,所以在我们眼里,参数就不是确定的,每个值都有可能是参数,参数就是一个随机值,那么参数也是有分布的,我们先对参数有一个先验概率(预先估计),然后通过数据不断地调整每个值是参数的概率,这也是贝叶斯学派的思想。

频率派与贝叶斯学派,本想留到贝叶斯那章再讲的,但是现在碰到了,只好先解释一下,这二者是机器学习的俩大思想,其实本质上就是对参数空间上的认知不同。理解这二者的区别,总有一种哲学的感觉在里面,就感觉在探讨世界的起源一样。

首先我们假设\(W \thicksim N(0, \sigma_0^2)\),之后我们需要利用这些数据来调整\(W\)的概率分布,其实意思就是这些数据确定的情况下,参数的概率是多少,也就是一个后验概率\(P(W|Y)\),通过概率论中的公式可以得到

\[P(W|Y) = \frac{P(Y|W)P(W)}{P(Y)} \]

上面的式子其实也是贝叶斯公式,这里的分母中Y就是数据,它是确定的,所以\(P(Y)\)可以去掉。我们想求的肯定是概率最大的情况,也就是后验概率\(P(W|Y)\)最大的时候,这很好理解,你肯定选概率最大的值作为参数。

\[W = arg \max\limits_W In\prod\limits_{i=1}^{n} P(W|y_i) = arg \max\limits_W In\prod\limits_{i=1}^{n}P(y_i|W)P(W) = arg \max\limits_W \sum\limits_{i=1}^{n}InP(y_i|W)P(W) \]

其中\(W \thicksim N(0, \sigma_0^2)\),并且之前极大似然估计的时候$Y|W,X \thicksim N(W^TX, \sigma^2) $,所以

\[P(y_i|x_i, W) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(y_i – W^Tx_i)^2}{2\sigma^2}} \\ P(W) = \frac{1}{\sqrt{2\pi}\sigma_0}e^{-\frac{(W)^2}{2\sigma_0^2}} \\ P(Y|W)P(W) = \frac{1}{\sqrt{2\pi}\sigma}\frac{1}{\sqrt{2\pi}\sigma_0} e^{-\frac{(y_i – W^Tx_i)^2}{2\sigma^2} -\frac{(W)^2}{2\sigma_0^2}} \]

下面基本和之前的化简差不多了

\[W = arg \max\limits_W \sum\limits_{i=1}^{n}InP(y_i|W)P(W) = arg \max\limits_W \sum\limits_{i=1}^{n}In\frac{1}{\sqrt{2\pi}\sigma}\frac{1}{\sqrt{2\pi}\sigma_0} e^{-\frac{(y_i – W^Tx_i)^2}{2\sigma^2} -\frac{(W)^2}{2\sigma_0^2}} = arg \max\limits_W \sum\limits_{i=1}^{n}(In\frac{1}{\sqrt{2\pi}\sigma}\frac{1}{\sqrt{2\pi}\sigma_0} -\frac{(y_i – W^Tx_i)^2}{2\sigma^2} -\frac{(W)^2}{2\sigma_0^2}) \]

我们知道前面和\(W\)没有关系,因此可以去除,变成

\[W = arg \max\limits_W \sum\limits_{i=1}^{n}(-\frac{(y_i – W^Tx_i)^2}{2\sigma^2} -\frac{(W)^2}{2\sigma_0^2}) \\ W = arg \min\limits_W \sum\limits_{i=1}^{n}(\frac{(y_i – W^Tx_i)^2}{2\sigma^2} +\frac{(W)^2}{2\sigma_0^2}) \]

将这个式子乘以一个\(2\sigma^2\),就可以得到

\[W_{MAP} = arg \min\limits_W \sum\limits_{i=1}^{n}((y_i – W^Tx_i)^2+\frac{\sigma^2}{\sigma_0^2}(W)^2) \]

仔细看这个公式发现,它只是比前面多了一个\(\frac{\sigma^2}{\sigma_0^2}(W)^2\),这种形式非常像是前面的结果加了正则化项\(L_2\),看到岭回归那里,那么岭回归的\(\lambda\)可以对应\(\frac{\sigma^2}{\sigma_0^2}\)\(W)^2\)就是正则化项\(L_2\)

结论

从上面总体就可以看出,最小二乘法LSE从概率的角度来看的话,就是噪声为正态分布的极大似然估计MLE,如果最小二乘加上正则化项Regularized LSE,那么就等于最大后验估计MAP。

逻辑斯蒂回归(logistic regression)

开始的时候我们说过高矮的问题,也说过给一个阈值的话,就可以将回归应用到分类中。上面说的180作为高矮的阈值,但是它只能用在身高中,无法用于其他领域,比如胖瘦的区分,你不能说180了。那么不同领域为什么不能用同一个具体值?因为不同领域的量纲不一样,正常人的身高应该在区间\([150,190]\),但是正常人的体重在\([90,160]\),那么知道哪里出问题,我们就可以解决,那么统一量纲,那都转化到区间\([0,1]\),转化到其他的也行,主要是因为区间\([0,1]\)更熟悉,毕竟还可以看成概率,并且数学中也有现成的函数可以将数转化到区间\([0,1]\)中,就是sigmoid函数,表达式如下所示,

\[\sigma(x) = \frac{1}{1 + e^{-x}} \]


机器学习:回归问题

图2. sigmoid函数

这个函数求导方便,也有优化稳定,还是一个连续函数,不像sign是一个跃阶函数,之后它还会被用到神经网络中作为网络的激活函数。

下面我们处理二分类问题,数据为\({(x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)}\),既然我们现在有了sigmoid函数来统一量纲了,我们就可以将线性函数放进去了,变成

\[p = \sigma(x_i) = \frac{1}{1 + e^{-W^Tx_i}} \]

量纲发生了改变,那么最小二乘法的就无法使用,因为\(y_i – \frac{1}{1 + e^{-W^Tx_i}}\)并不能代表损失了。\(\sigma(x_i)\)结果区间就变成了\([0,1]\),如果我们将之看成概率的话,比如结果是0.1,表达的意思就是\(x_i\)属于类别1的概率是0.1,属于0的概率是0.9,假如结果只是\(p\),我们就可以表达成

\[P(y_i|x_i) = (p)^{y_i}(1-p)^{1-y_i} \]

这里的\(y_i\)就是真实类别,比如\(y_i = 1\),那么属于正确类别1的概率就是\(p\),当\(y_i = 0\),那么属于正确类别0的概率就是\(1-p\),完美的表达出我们想要的效果,这就是数学之美。

我们需要的是属于正确类别的概率越大越好,这就用到了极大似然估计,将所有的概率相乘

\[P_{总} = P(y_1|x_1)P(y_2|x_2)\dots P(y_n|x_n) = \prod\limits_{i=1}^nP(y_n|x_n) \]

依旧用对数函数将上面的乘法变成加法

\[P_{总} = \sum\limits_{i=1}^nIn P(y_n|x_n) = \sum\limits_{i=1}^nIn (p)^{y_i}(1-p)^{1-y_i} = \sum\limits_{i=1}^n y_i In (p) + (1-y_i)In(1-p) \]

上面我们说了导数为0来求最值有很多缺点,这里我们使用梯度上升,因为我们这里想要概率最大,如果将\(-P_{总}\)作为损失函数来看的话,就是用梯度下降,我们想要损失最小。这里我们就不加负号。计算都是一样的计算。梯度上升法是把梯度看成上升最快的方向,至于为什么,我们会在机器学习:优化方法中详细聊一聊,这其实涉及到数学中的方向导数。现在只要知道梯度是最快的方向,梯度就是计算导数,我们想要求概率最大时候的\(W\),就要沿着梯度方向来增大\(W\),公式就是

\[W_{t+1} = W_t + \eta\frac{\partial P_{总}}{\partial W} \]

这是一个更新公式,不是一个求值公式,我们肯定需要初始化最开始的\(W_0\)作为基准,直接更新这个\(W_0\),公式中\(W_t\)每次根据梯度方向\(\frac{\partial P_{总}}{\partial W}\)进行更新,更新的大小由步长\(\eta\)决定。就好像一个人爬山,你先自己选定一个上山的地点,之后每次沿着\(\frac{\partial P_{总}}{\partial W}\)行走\(\eta\)能够最快到达山顶。

所以首先要计算梯度,也就是计算导数

\[\frac{\partial P_{总}}{\partial W} = \sum\limits_{i=1}^n y_i \frac{1}{p}\frac{\partial p}{\partial W} + (1-y_i)\frac{1}{1-p}\frac{\partial (1-p)}{\partial W} \]

我们需要计算\(\frac{\partial p}{\partial W}\)\(\frac{\partial (1-p)}{\partial W}\),我们知道\(p = \frac{1}{1 + e^{-W^Tx_i}}\),因此就是,

\[\frac{\partial p}{\partial W} = (\frac{1}{1 + e^{-W^Tx_i}})^{‘} = \frac{1}{1 + e^{-W^Tx_i}}\frac{e^{-W^Tx_i}}{1 + e^{-W^Tx_i}}x_i = p(1-p)x_i \\ \frac{\partial (1-p)}{\partial W} = (\frac{ e^{-W^Tx_i}}{1 + e^{-W^Tx_i}})^{‘} = – \frac{1}{1 + e^{-W^Tx_i}}\frac{e^{-W^Tx_i}}{1 + e^{-W^Tx_i}}x_i = -p(1-p)x_i \]

将之带入\(\frac{\partial P_{总}}{\partial W}\)可以得到

\[\frac{\partial P_{总}}{\partial W} = \sum\limits_{i=1}^n y_i \frac{1}{p}p(1-p)x_i + (1-y_i)\frac{1}{1-p}p(1-p)x_i = \sum\limits_{i=1}^n y_i (1-p)x_i – (1-y_i)px_i \]

将结果式子分解合并成

\[\frac{\partial P_{总}}{\partial W} = \sum\limits_{i=1}^n (y_i – p)x_i = \sum\limits_{i=1}^n (y_i – \frac{1}{1 + e^{-W^Tx_i}})x_i \]

之后我们还需要步长\(\eta\),初始化\(W_0 = 0\),对这个\(W_0\)进行运算相加,我们看一次更新就是

\[W_{1} = W_0 + \eta\sum\limits_{i=1}^n (y_i – \frac{1}{1 + e^{-W^Tx_i}})x_i \]

梯度下降法和梯度上升法都差不多,就是把加号变成减号,梯度下降法有很多种,我们这里用的就是最简单的梯度上升法,计算所有数据的梯度,之后上升,这种做法的一次更新计算量很大,之后的优化就有了其他的梯度上升法,比如随机梯度下降。

我们来整理一下逻辑回归的整个过程:

  1. 先对\(W_0\)和步长\(\eta\)进行初始化;
  2. 循环更新\(W_t\),先计算\(\sum\limits_{i=1}^n (y_i – \frac{1}{1 + e^{-W^Tx_i}})x_i\)
  3. 将之计算结果带入公式\(W_{t} = W_{t-1} + \eta\sum\limits_{i=1}^n (y_i – \frac{1}{1 + e^{-W^Tx_i}})x_i\)中更新\(W\)
  4. 一直更新,直到梯度下降到一定程度,比如梯度为0了,结束更新,得到逻辑斯蒂回归方程\(\frac{1}{1 + e^{-W^Tx_i}}\)

逻辑回归最大的优势就是可解释强,每个\(w_i\)都反映了第\(i\)维属性的权重,通过\(W\)可以看到分类中哪个属性最重要,而偏置\(b\)虽然一直隐藏在矩阵\(W\)中,但是也是存在,如果它大于0,表明它更容易被判成正类,反之亦然,这说明它更倾向于哪一类。

还有就是逻辑斯蒂回归的决策边界也是线性的,在二维数据情况下就是一条直线,我们可以来看一下,逻辑斯蒂回归的阈值是0.5,那么决策边界就是

\[\frac{1}{1 + e^{-W^Tx_i}} = 0.5 \]

我们可以看出\(e^{-W^Tx_i} = 1\)的时候才能满足上面的式子,那么\(-W^Tx_i = 0\),如果是二维数据,那么这个公式就是直线的一般式,因此可以得知决策边界确实是线性的。

回归树

基础决策树就是ID3,C4.5和CART,其中ID3和C4.5的特征分裂的评价标准都是以信息熵为基础,熵针对分类,计算方式都是以类别是离散值为基础进行计算的,根本无法处理类别是连续值的回归问题。回归树主要是指CART树,首先声明,CART树是一个标准的二叉树,分类任务中使用的是基尼系数来提纯,并且CART树也可以拓展到回归问题中,只不过用的就不是基尼系数了,而是利用均方误差来找最优属性,利用最小化均方误差来找出最优属性的最好切分点,首先就是找出一个属性的所有切分点,然后对所有的切分点做均方误差,找出最小误差的那个切分点,计算所有属性的最小切分点,得到最优属性的最好切分点,这个过程也被称为最小二乘法。然后将数据分成俩个分支之后,继续在数据集上寻找最优属性的最好切分点。

需要注意CART某一属性使用过后依然可以被使用的,只要属性不是只有唯一值,它就不会丢弃该属性,使用过的属性还会被重复使用。这是因为CART树是一个二叉树,即使属性是离散值,只要它的值有俩种以上,那么一次分裂就不能完全挖掘出全部信息,需要多次分裂才行。而ID3不能处理连续值,只能处理离散值,并且ID3是一个多叉树,不管属性有多少种离散值,都能被全部消耗。C4.5处理离散值和ID3同理,都是多叉树,在连续属性上,如果有多个的话,也是可以多次分裂的。那么它的停止取决你指定的树的深度。

它的过程可以简单写一下,假设数据集是\(D={(x_1,y_1),(x_2,y_2),\dots,(x_n,y_n)}\),其中\(x_i\)是p维数据,就是有p个属性。

  1. 循环处理p个属性,取出其中一个属性\(j\),并且得出所有的切分点;
  2. 依次处理切分点,取出其中一个切分点\(s\),找出大于和小于这个切分点\(s\)的数据,计算俩边的均值作为\(c_1\)\(c_2\)
  3. 计算出俩边的\(c_1\)\(c_2\)之后,再根据下面的公式计算均方误差MSE,
\[\sum\limits_{x_i^{j} <= s} (y_i – c_1)^2 + \sum\limits_{x_i^{j} > s} (y_i – c_2)^2 \]

选择所有切分点中,MSE最小的那个切分点;
4. 选择对比所有属性的最好切分点,选择最好属性的最好切分点作为节点;
5. 对于其中的叶子节点,还需要计算出叶子节点的值作为输出值,使用该节点中所有数据\(y\)的平均值作为该叶子节点的输出值。

为了加深一下,可以来看一道简单的例题

x 1 2 3 4 5 6 7 8 9 10
y 5.56 5.7 5.91 6.4 6.8 7.05 8.9 8.7 9 9.05

第一步,因为数据属性只有一个,我们直接找出这个属性的全部切分点,分别是{1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5} 。

第二步,取切分点1.5,左边数据只有1,那么\(c_1 = 5.56\),右边有2,3,4,5,6,7,8,9,10,那么\(c_2 = \frac{5.7+5.91+6.4+6.8+7.05+8.9+8.7+9+9.05}{9} = 7.5\)

第三步,计算切分点1.5的MSE,代入公式中得到

\[\sum\limits_{x_i^{j} <= s} (y_i – c_1)^2 + \sum\limits_{x_i^{j} > s} (y_i – c_2)^2 = (5.56 – 5.56)^2 + [(5.7 – 7.5)^2 + (5.91 – 7.5)^2+ \dots + (9.05 – 7.5)^2] = 15.72 \]

依次计算出所有切分点的MSE,如下表

s 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5
MSE 15.72 12.07 8.36 5.78 3.91 1.93 8.01 11.73 15.74
在这个属性中选择切分点6.5。

第四步,选择切分点6.5作为节点,左子树的数据是{1,2,3,4,5,6},右子树的数据是{7,8,9,10}。

第五步,假设我们设回归树的深度就是2,那么左节点的值就是\(c_1 = \frac{5.56 + 5.7 + 5.91 + 6.4 + 6.8 + 7.05}{6} = 6.24\),右节点的值就是\(c_2 = \frac{8.9+8.7+9+9.05}{4} = 8.91\)

所以回归树的数学表达式就是

\[T = \begin{cases} 6.24 & x < 6.5\\ 8.91 & x \geqslant 6.5 \end{cases} \]

总结

回归在我的研究中用的并不多,不过了解回归问题的方法也可以给我们一种不同的解题思路,我上面总结都是回归的入门基础,回归经过这么多年的研究,本身就产生了很多种方法,并且用到了不同的领域之中,我知道的只有增量学习回归判别,因为之前了解过一点增量学习里面的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/166958.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号