.. _ch_29: ######################################################## 回归模型 ######################################################## 至此,我们已经讨论完概率图的基础知识,包括概率图的表示、推断和学习三个基本问题。 本章开始,我们讨论基于概率图的应用模型,虽然这些应用模型未必都是基于概率图理论提出的, 但是都是可以用概率图去解释的。 通过概率图理论,可以为这些模型构建一套完整的理论体系,更有利于这些模型的学习和研究。 机器学习的概率解释 ######################################################## 机器学习(machine learning,ML)通俗的讲,就是给你一批数据, 找到(学习)这批数据的规律(数学模型),然后预测新的数据。 按照应用场景,通常可以分为分类问题、回归问题、聚类问题和序列预测等等, 其中分类问题和回归问题最为常见。 在分类和回顾问题中,数据被分成两组,这两组数据有多种叫法,比如 输入(input)数据与输出(output)数据、特征(feature)数据与标签(label)数据、 自变量与因变量、协变量(covariate)与响应变量(response)等等。 一般用符号 :math:`X` 表示特征数据, 用符号 :math:`Y` 是表示标签数据。 通常输入变量 :math:`X` 是一个多维的向量数据 :math:`x \in R^M` , 输出变量 :math:`Y` 是一个单维的标量数据。 输出变量 :math:`Y` 和输出变量 :math:`X` 存在着某种关系,我们可以用一个数学函数来表示这种关系 :math:`y=f(x)` 。机器学习的目的就是利用已有的数据找到函数 :math:`f(x)` , 然后就对新的 :math:`x_{new}` 预测出其对应的输出 :math:`y_{new}=f(x_{new})` 。 理论上 :math:`f(x)` 可以是任意的,比如是线性函数 :math:`y=\theta^x +b` 亦或是二次函数等等, 具体选择什么样的函数要依赖于应用场景和数据。 在概率的理论框架下,我们可以把 :math:`X` 和 :math:`Y` 都看成是随机变量,把 :math:`f(x)` 看做条件概率分布 :math:`P(Y|X)` 。 在概率理论框架下,分类和回归问题就是就是找到这个条件概率分布 :math:`P(Y|X)` , 有了这个条件概率分布后,就可以预测新的样本。 当标签变量 :math:`Y` 是 **离散变量(顺序无关)** 时,可以看做是预测样本属于哪个类别,称之为 *分类(classification)* 模型, 二值离散变量称之为二分类问题,更多值离散变量就称为多分类问题。 当标签变量 :math:`Y` 是 **连续变量** 时,称之为 *回归(regression)* 模型。 本章我们讨论回归模型中最经典的模型,线性回归(linear regression,LR)模型。 经典线性回归 ######################################################## 我们已经知道机器学习就是要找到输出变量 :math:`Y` 和输入变量 :math:`X` 的函数关系, 并且当输出变量 :math:`Y` 是连续的实数值时,我们称之为回归问题。 当我们假设输出变量 :math:`Y` 和输入变量 :math:`X` 之间存在线性函数关系时, 就称之为线性回归(linear regression model)模型。 在线性回归模型中,我们假设 :math:`Y` 与 :math:`X` 之间是一个线性函数的关系。 .. math:: :label: eq_29_1 y = \theta_0+ \theta_1 x_1 +\theta_2 x_2+\dots+ \theta_m x_m+\dots+ \theta_M x_M 由于输入特征数据 :math:`X` 通常是多维的,所以 :math:`f(x)` 是一个多元一次函数, 其中 :math:`x_m` 是第 :math:`m` 维输入数据,:math:`x_m` 可以是任意实数值。 :math:`\theta_m (m > 0)` 是 :math:`x_m` 的系数,:math:`\theta_0` 是这个线性方程的截距, 我们把 :math:`\theta_m` 看做这个函数的未知参数,其值暂时是未知的。 :eq:`eq_29_1` 看上去不是很简洁,通常为了公式的简洁表达,我们令 :math:`\theta=[\theta_0,\theta_1,\dots,\theta_M],x=[1,x_1,x_2,\dots,x_M]` , 然后把 :eq:`eq_29_1` 看成是特征向量 :math:`x` 和参数向量 :math:`\theta` 的內积形式。 线性回归模型的简洁表示为: .. math:: y = \theta_0 \times 1 + \theta_1x_1 +\theta_2x_2+\dots+\theta_mx_m+\dots+\theta_M x_M = \theta^Tx .. note:: 为了满足向量內积的形式,我们人为的增加一列特征数据 :math:`x_0=1`,所有输入样本的 :math:`x_0` 都为常量1。 :numref:`fg_29_1` 是单一维度输入变量的线性回归模型的图形化展示, 为了方便图形化展示,我们假设输入特征变量 :math:`X` 只有一维,即 :math:`M=1` 。 图中蓝色的点代表一些 :math:`(x_n,y_n)` 的样本点,下标 :math:`n` 是样本点的编号。 线性回归模型的本质就是找到一条直线 :math:`y=\theta x` (比如图中的红色直线) ,并且这条直线和样本点的"走势"是一致的,这样我们就可以用这条直线去预测新的样。 比如根据图中蓝色样本点的分布,我们找到红色直线和样本的"走势"一致, 这样当输入一个新的 :math:`x_{new}` 时,就用直线上的点 :math:`y_{new}=\theta^Tx_{new}` 作为预测值 :math:`\hat{y}=y_{new}=\theta^Tx_{new}` 。 .. _fg_29_1: .. figure:: pictures/29_1.png :scale: 50 % :align: center 单一输入特征的回归模型 然而空间上存在无数条直线,要如何确定和样本点"走势"相同的直线呢? 我们的最终目的是用这条之间预测新的样本点,那么理论上预测最准的直线是最优的直线。 对于一条样本数据 :math:`(x_n,y_n)` ,模型的预测值是 :math:`\hat{y}_n = \theta^T x_n` ,显然,最优的直线就是 **预测误差** 最小的直线。 我们把样本的真实值 :math:`y_n` 和预测值 :math:`\hat{y}_n` 之间的差值定义成残差(residual), 我们的目标就是找到一条令所有观测样本残差最小的直线。 通常我们使用所有样本残差的平方和(residual sum of squares,RSS)做为整体的误差。 .. math:: J(\theta)=\sum_{n=1}^N (\hat{y}_n-y_n)^2 .. _fg_29_2: .. figure:: pictures/29_2.png :scale: 50 % :align: center 线性回归的残差 我们认为令RSS取得最小值的直线的最优的直线,所以我们通过极小化RSS来确定这条最优的直线, 由于直线是由参数 :math:`\theta` 决定的,所以要确定这条直线就是等价于找到参数 :math:`\theta` 的值。 因此: .. math:: \hat{\theta} = \mathop{\arg \max}_{\theta} \sum_{n=1}^N (\hat{y}_n-y_n)^2 =\mathop{\arg \max}_{\theta} \sum_{n=1}^N (\theta^Tx-y_n)^2 .. note:: 通常机器学习的过程,都是先根据场景或数据定义一个参数化的模型函数 :math:`y=f(x,\theta)` ,模型函数是对单条数据样本的建模。但它是含有未知参数的, 我们需要找到一个最优的参数值使得这个模型函数尽可能好的拟合数据样本。 因此就需要定义一个评价不同参数值模型好坏的标准或者说函数,通常我们称这个评价函数为目标函数(object function), 然后通过极大(小)化目标函数求得参数的最优解。 比如似然函数就是目标函数的一种,除此之外,还可以定义某种损失(误差)函数(cost function| loss function | error function) 作为目标函数,比如线性回归的平方损失、逻辑回归的交叉熵损失等等。 参数估计 ================== **以“残差平方和最小”确定直线位置的方法被称为最小二乘法。** 用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性, **这种方法对异常值非常敏感**。 显然对于线性回归模型,RSS是一个关于 :math:`\theta` 的二次函数, 我们知道二次函数一定是存在唯一的一个极值点的,所以参数 :math:`\theta` 一定存在唯一解, 并且在极值点函数的导数为0。 所以我们可以直接求出RSS的导数,并令导数为0的方法求得 :math:`\hat{\theta}` 。 .. math:: \frac{\partial J}{\partial \theta} = \sum_{n=1}^N 2 x_n (\theta^Tx_n-y_n) 上述偏导结果中包含所有样本的求和符号 :math:`\sum_{n=1}^N` ,为了简单表达我们用矩阵和向量乘积的方式替换求和符号。 我们用符号 :math:`X` 表示训练样本集中所有的输入数据的矩阵, 用符号 :math:`y` 表示训练样本集中所有输出数据的向量。上述偏导用矩阵符号表示为: .. math:: \frac{\partial J}{\partial \theta} = 2X^T(X\theta^T-y) 然后我们令导数为0,可以得到: .. math:: :label: eq_29_03 X^TX\theta^T = X^Ty :eq:`eq_29_03` 通常被称为正规方程组(normal equations), 理论上,我们可以根据这个等式得到参数 :math:`\theta` 的解析解 .. math:: \hat{\theta}=(X^TX)^{-1} X^Ty 然而,这个解析解需要求矩阵 :math:`X^TX` 的逆矩阵, 矩阵存在逆矩阵需要满足两个条件:(1)是方阵,(2)是满秩的。 虽然是 :math:`X^TX` 方阵,但是未必满秩, 那么也就不存在逆矩阵,当逆矩阵不存在时也没没办法计算解析解。 当矩阵 :math:`X` 存在(行或列)共线性时,:math:`(X^TX)` 一定是不满秩的。 :math:`(X^TX)` 不存在逆矩阵不代表参数 :math:`\theta` 无解,上面已经讲过损失函数 :math:`J(\theta)` 是二次函数,一定存在唯一的极值点,所以参数 :math:`\theta` 一定有全局最优解的。 当无法求得解析解时,我们可以使用迭代法求解,比如基于一阶导数的梯度下降法和基于二阶导数的牛顿法。 .. note:: 这种利用目标函数取得极值时求解最优参数值的方法,在数学上归属于最优化问题, 最优化算法有很多种,内容非常多,都可以独立成书,本书限于篇幅原因,暂时不过多讨论, 读者可参考其它资料。 线性回归的概率解释 ######################################################## 至此,我们还没有提到关于线性回归和最小二乘损失函数的任何概率意义。 现在我们回到概率的框架下解释线性回归模型。 在概率的框架下,我们认为输入变量 :math:`X` 和输出变量 :math:`Y` 都是随机变量, 回归模型的目标是找到输出变量和输入变量的依赖关系 :math:`y=f(x)` , 在概率的框架下,我们用条件概率 :math:`P(y|x)=f(x)` 去表达这种关系, 即当 :math:`X=x` 时,变量 :math:`Y=y` 的概率为 :math:`p(Y=y|X=x)` 。 用概率图的方式表达,就是两个结点的有向图模型,其中结点 :math:`X` 是结点 :math:`Y` 的父结点。 .. _fg_29_10: .. figure:: pictures/29_10.jpg :scale: 50 % :align: center 回归模型的概率图表示 这个有向图的联合概率可以写成: .. math:: p(x,y)=p(x)p(y|x) 在回归问题中,我们是给定输入 :math:`x` ,模型输出 :math:`y` 的值,特征变量 :math:`X` 的值是已知的确定的, 所以我们不需要边缘概率 :math:`p(x)` ,只需要得到条件概率 :math:`p(y|x)` 即可。 换句话说,我们不需要对联合概率 :math:`p(x,y)` 进行建模,只需要建模条件概率 :math:`p(y|x)` 。 在线性回归中, 可以理解成 :math:`y` 的值是在线性方程 :math:`\theta^Tx` 的基础上 加上一个高斯噪声(高斯随机误差) :math:`\epsilon \sim \mathcal{N}(0,\sigma^2)` , 这个误差 :math:`\epsilon` 是一个均值为0,方差为 :math:`\sigma^2` 的高斯变量, 如 :numref:`fg_29_12` 所示。 .. math:: y=\theta^Tx + \epsilon .. _fg_29_12: .. figure:: pictures/29_12.jpg :scale: 50 % :align: center 线性回归模型表示成条件均值函数加上一个高斯噪声。 因此条件概率 :math:`p(y|x)` 是服从均值为 :math:`\theta^T x` 方差为 :math:`\sigma^2` 的高斯分布,即 :math:`Y\sim \mathcal{N}(\theta^T x,\sigma^2)` 条件概率分布 :math:`P(Y|X)` 的概率密度函数为: .. math:: :label: eq_29_10 p(y|x,\theta) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp \{ -\frac{1}{2\sigma^2}(y-\theta^Tx)^2 \} .. note:: 实际上 :math:`Y` 的概率分布要根据数据的实际分布确定,并不是一定要高斯分布。 只不过在线性回归这个模型中我们假设 :math:`Y` 是服从高斯分布的。 如果你的数据不是(近似)高斯分布,那么就不应该使用线性回归模型。 在后面的章节中我们会介绍当 :math:`Y` 是其它分布时,应该怎么处理, 在广义线性模型的框架下,输出变量 :math:`Y` 可以扩展到指数族分布。 其中 :math:`\theta` 是模型的参数,是需要利用观测数据进行学习的。 方差 :math:`\sigma^2` 是一个常量,其值可以根据观测样本的方差来设定。 .. note:: 高斯假设的线性回归模型是建立在两个很强的假设之上的,(1)条件概率 :math:`p(y|x)` 是高斯分布, 并且(2)不同的 :math:`x` 条件下方差是相同的。然而这种假设在很多时候是不满足的,尤其是第(2)点, 这也是线性回归的模型的局限性。 当需要预测一个新样本时,我们用条件概率分布的期望值作为输出值, 模型输入一个 :math:`x` 值,输出 :math:`\hat{y}=\mathbb{E}[p(y|x,\theta)]=\theta^Tx` 。 实际上,线性回归模型比我们看上去的要广泛,线性组合部分 :math:`\theta^Tx` 只要求对 :math:`\theta` 是线性的, 并不要求对 :math:`x` 是线性的,所以可以为 :math:`x` 加上一个非线性的函数 :math:`\phi(\cdot)` 使模型具有拟合非线性数据的能力。 .. math:: y=\theta^T \phi(x) + \epsilon =\theta^T x' + \epsilon :math:`\phi(x)` 可以看做是对特征数据的预处理 :math:`x \Rightarrow \phi(x)` ,转化之后的 :math:`x'=\phi(x)` 作为模型的输入特征,并不影响线性回归模型的定义和计算。 参数估计 ================== 假设我们有一个成对的观测数据集 :math:`\mathcal{D}=\{(x_n,y_n);n=1,2,\dots,N\}` ,其中 :math:`x_n` 是一条输入变量 :math:`X` 的观测样值,:math:`y_n` 是对应的输出变量 :math:`Y` 的观测值, 注意 :math:`x_n` 是一个 :math:`M` 维的向量(vector),而 :math:`y_n` 是一个标量(scalar)。 样本集中的样本都是满足独立同分布(IID)的, :numref:`fg_29_11` 是这个样本集的图形化表示。 .. _fg_29_11: .. figure:: pictures/29_11.jpg :scale: 50 % :align: center 独立同分布(IID)的回归模型的图形表示 样本集的联合概率可以写成: .. math:: p(\mathcal{D}) &= \prod_{n=1}^N p(y_n|x_n,\theta) &= {2\pi\sigma^2}^{-\frac{N}{2}} \exp \{ -\frac{1}{2\sigma^2} \sum_{n=1}^N (y_n-\theta^Tx_n)^2 \} 我们知道观测样本集的联合概率就是似然函数,我们可以通过最大似然估计法估计出模型的未知参数 :math:`\theta` , 为了计算简单,通常我们采用极大化对数似然函数的方法估计参数。 线性回归模型的对数似然函数为: .. math:: \ell(\theta;x,y) = \underbrace{{-\frac{N}{2}} \ln (2\pi\sigma^2)}_{\text{常量}} -\frac{1}{2\sigma^2} \sum_{n=1}^N (y_n-\theta^Tx_n)^2 由于我们假设方差 :math:`\sigma^2` 是常量,所以上述公式的第一项是一个常量, 在极大化对数似然函数时不影响最终的求解,所以是可以去掉的。 .. math:: \hat{\theta}_{ML} &={\arg \max}_{\theta} \ell(\theta;x,y) &\triangleq -\frac{1}{2\sigma^2} \sum_{n=1}^N (y_n-\theta^Tx_n)^2 我们发现这和最小二乘法的损失函数 :math:`J(\theta)` 是等价的, 对数似然函数中的 :math:`\sum_{n=1}^N (y_n-\theta^Tx_n)^2` 就是残差的平方和(residual sum of squares,RSS)。 同理,我们可以使用迭代法求的最优解。 凸函数最优化问题 ##################################### 岭回归 ##################################### 线性回归 解析解 不可逆的问题 https://www.cnblogs.com/wangkundentisy/p/7505487.html 只有满秩的方阵才存在逆矩阵 线性回归的损失函数,是二次函数,一定存在极值点,即导数为0的点。 虽然存在极值点,但是未必能得到解析解, :math:`X^TX` 虽然是方阵,但是未必满秩,不满秩的方阵就相当于存在共线性的列或行, 那么它本质上就不是一个"方阵" 逻辑回归,由于sigmod的是非线性的,无法构造出 :math:`X^TX` 也就肯定得不到解析解了。