线性回归方程推导

理论推导

  机器学习所针对的问题有两种:一种是回归,一种是分类。回归是解决连续数据的预测问题,而分类是解决离散数据的预测问题。线性回归是一个典型的回归问题。其实我们在中学时期就接触过,叫最小二乘法。

  线性回归试图学得一个线性模型以尽可能准确地预测输出结果。 
  先从简单的模型看起: 
  首先,我们只考虑单组变量的情况,有: 
这里写图片描述 使得 这里写图片描述 
  假设有m个数据,我们希望通过x预测的结果f(x)来估计y。其中w和b都是线性回归模型的参数。 
  为了能更好地预测出结果,我们希望自己预测的结果f(x)与y的差值尽可能地小,所以我们可以写出代价函数(cost function)如下: 
这里写图片描述 
  接着代入f(x)的公式可以得到: 
这里写图片描述 
  不难看出,这里的代价函数表示的是预测值f(x)与实际值y之间的误差的平方。它对应了常用的欧几里得距离简称“欧氏距离”。基于均方误差最小化来求解模型的方法我们叫做“最小二乘法”。在线性回归中,最小二乘法实质上就是找到一条直线,使所有样本数据到该直线的欧式距离之和最小,即误差最小。 
  我们希望这个代价函数能有最小值,那么就分别对其求w和b的偏导,使其等于0,求解方程。 
  先求偏导,得到下面两个式子: 
这里写图片描述

这里写图片描述 
  很明显,公式中的参数m,b,w都与i无关,简化时可以直接提出来。 
  另这两个偏导等于0: 
  求解方程组,解得: 
这里写图片描述

这里写图片描述 
  这样根据数据集中给出的x和y,我们可以求出w和b来构建简单的线性模型来预测结果。

  接下来,推广到更一般的情况: 
  我们假设数据集中共有m个样本,每个样本有n个特征,用X矩阵表示样本和特征,是一个m×n的矩阵: 
这里写图片描述

  用Y矩阵表示标签,是一个m×1的矩阵: 
这里写图片描述

  为了构建线性模型,我们还需要假设一些参数: 
这里写图片描述 
(有时还要加一个偏差(bias)也就是这里写图片描述, 为了推导方便没加,实际上结果是一样的)

  好了,我们可以表示出线性模型了: 
这里写图片描述 
  h(x)表示假设,即hypothesis。通过矩阵乘法,我们知道结果是一个n×1的矩阵。 
  跟前面推导单变量的线性回归模型时一样,列出代价函数: 
这里写图片描述 
  这里的1/2并无太大意义,只是为了求导时能将参数正好消掉而加上。 
  代价函数代表了误差,我们希望它尽可能地小,所以要对它求偏导并令偏导数为0,求解方程。 
  在求偏导之前先展开一下: 
这里写图片描述 
这里写图片描述

  接下来对这里写图片描述 求导,先给出几个矩阵求导的公式: 
这里写图片描述

这里写图片描述

这里写图片描述

  对代价函数这里写图片描述 求关于这里写图片描述 的偏导,并令其等于0。

  求偏导。 
这里写图片描述

  套用前面给出的矩阵求导公式。 
这里写图片描述

  最后化简得到: 
这里写图片描述

  好了,另这个偏导数等于0: 
这里写图片描述

  解得: 
这里写图片描述

这是在可逆的前提下得到的,事实上存在不可逆的情况,我们在之后的ridge和lasso回归会针对这样的情况进行讨论,在此我们默认其是可逆的。

可以根据公式直接求得的值,但是当X维度很高时矩阵求逆计算量非常大,所以我们在实际应用中往往采用梯度下降的算法更新,方法如下

 

概述           梯度下降算法(Gradient Descent Optimization)

 

梯度下降算法(Gradient Descent Optimization)是神经网络模型训练最常用的优化算法。对于深度学习模型,基本都是采用梯度下降算法来进行优化训练的。梯度下降算法背后的原理:目标函数640?wx_fmt=png&wxfrom=5&wx_lazy=1关于参数640?wx_fmt=png&wxfrom=5&wx_lazy=1的梯度将是目标函数上升最快的方向。对于最小化优化问题,只需要将参数沿着梯度相反的方向前进一个步长,就可以实现目标函数的下降。这个步长又称为学习速率640?wx_fmt=png&wxfrom=5&wx_lazy=1。参数更新公式如下:

 

640?wx_fmt=png&wxfrom=5&wx_lazy=1

其中640?wx_fmt=png&wxfrom=5&wx_lazy=1是参数的梯度,根据计算目标函数640?wx_fmt=png&wxfrom=5&wx_lazy=1采用数据量的不同,梯度下降算法又可以分为批量梯度下降算法(Batch Gradient Descent),随机梯度下降算法(Stochastic GradientDescent)和小批量梯度下降算法(Mini-batch Gradient Descent)。对于批量梯度下降算法,其640?wx_fmt=png&wxfrom=5&wx_lazy=1是在整个训练集上计算的,如果数据集比较大,可能会面临内存不足问题,而且其收敛速度一般比较慢。随机梯度下降算法是另外一个极端,640?wx_fmt=png&wxfrom=5&wx_lazy=1是针对训练集中的一个训练样本计算的,又称为在线学习,即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些,但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差。小批量梯度下降算法是折中方案,选取训练集中一个小批量样本计算640?wx_fmt=png&wxfrom=5&wx_lazy=1,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。这是目前最常用的梯度下降算法。

 

对于神经网络模型,借助于BP算法可以高效地计算梯度,从而实施梯度下降算法。但梯度下降算法一个老大难的问题是:不能保证全局收敛。如果这个问题解决了,深度学习的世界会和谐很多。梯度下降算法针对凸优化问题原则上是可以收敛到全局最优的,因为此时只有唯一的局部最优点。而实际上深度学习模型是一个复杂的非线性结构,一般属于非凸问题,这意味着存在很多局部最优点(鞍点),采用梯度下降算法可能会陷入局部最优,这应该是最头疼的问题。这点和进化算法如遗传算法很类似,都无法保证收敛到全局最优。因此,我们注定在这个问题上成为“高级调参师”。可以看到,梯度下降算法中一个重要的参数是学习速率,适当的学习速率很重要:学习速率过小时收敛速度慢,而过大时导致训练震荡,而且可能会发散。理想的梯度下降算法要满足两点:收敛速度要快;能全局收敛。为了这个理想,出现了很多经典梯度下降算法的变种,下面将分别介绍它们。

 

01

Momentum optimization

冲量梯度下降算法是BorisPolyak在1964年提出的,其基于这样一个物理事实:将一个小球从山顶滚下,其初始速率很慢,但在加速度作用下速率很快增加,并最终由于阻力的存在达到一个稳定速率。对于冲量梯度下降算法,其更新方程如下:

0?wx_fmt=png

可以看到,参数更新时不仅考虑当前梯度值,而且加上了一个积累项(冲量),但多了一个超参0?wx_fmt=png,一般取接近1的值如0.9。相比原始梯度下降算法,冲量梯度下降算法有助于加速收敛。当梯度与冲量方向一致时,冲量项会增加,而相反时,冲量项减少,因此冲量梯度下降算法可以减少训练的震荡过程。TensorFlow中提供了这一优化器:tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9)。

 

02 

NAG

NAG算法全称Nesterov Accelerated Gradient,是YuriiNesterov在1983年提出的对冲量梯度下降算法的改进版本,其速度更快。其变化之处在于计算“超前梯度”更新冲量项,具体公式如下:

0?wx_fmt=png

既然参数要沿着0?wx_fmt=png更新,不妨计算未来位置0?wx_fmt=png的梯度,然后合并两项作为最终的更新项,其具体效果如图1所示,可以看到一定的加速效果。在TensorFlow中,NAG优化器为:tf.train.MomentumOptimizer(learning_rate=learning_rate,momentum=0.9, use_nesterov=True)

 

0?wx_fmt=png

图1 NAG效果图

 

03

AdaGrad

AdaGrad是Duchi在2011年提出的一种学习速率自适应的梯度下降算法。在训练迭代过程,其学习速率是逐渐衰减的,经常更新的参数其学习速率衰减更快,这是一种自适应算法。其更新过程如下:

 

0?wx_fmt=png

其中是梯度平方的积累量,在进行参数更新时,学习速率要除以这个积累量的平方根,其中加上一个很小值是为了防止除0的出现。由于是该项逐渐增加的,那么学习速率是衰减的。考虑如图2所示的情况,目标函数在两个方向的坡度不一样,如果是原始的梯度下降算法,在接近坡底时收敛速度比较慢。而当采用AdaGrad,这种情况可以被改观。由于比较陡的方向梯度比较大,其学习速率将衰减得更快,这有利于参数沿着更接近坡底的方向移动,从而加速收敛。

 

 

0?wx_fmt=png

图2 AdaGrad效果图

 

前面说到AdaGrad其学习速率实际上是不断衰减的,这会导致一个很大的问题,就是训练后期学习速率很小,导致训练过早停止,因此在实际中AdaGrad一般不会被采用,下面的算法将改进这一致命缺陷。不过TensorFlow也提供了这一优化器:tf.train.AdagradOptimizer。

 

 

04

RMSprop

RMSprop是Hinton在他的课程上讲到的,其算是对Adagrad算法的改进,主要是解决学习速率过快衰减的问题。其实思路很简单,类似Momentum思想,引入一个超参数,在积累梯度平方项进行衰减:

 

0?wx_fmt=png

可以认为仅仅对距离时间较近的梯度进行积累,其中一般取值0.9,其实这样就是一个指数衰减的均值项,减少了出现的爆炸情况,因此有助于避免学习速率很快下降的问题。同时Hinton也建议学习速率设置为0.001。RMSprop是属于一种比较好的优化算法了,在TensorFlow中当然有其身影:tf.train.RMSPropOptimizer(learning_rate=learning_rate,momentum=0.9, decay=0.9, epsilon=1e-10)。

不得不说点题外话,同时期还有一个Adadelta算法,其也是Adagrad算法的改进,而且改进思路和RMSprop很像,但是其背后是基于一次梯度近似代替二次梯度的思想,感兴趣的可以看看相应的论文,这里不再赘述。

 

05

Adam

Adam全称Adaptive moment estimation,是Kingma等在2015年提出的一种新的优化算法,其结合了Momentum和RMSprop算法的思想。相比Momentum算法,其学习速率是自适应的,而相比RMSprop,其增加了冲量项。所以,Adam是两者的结合体:

 

0?wx_fmt=png

可以看到前两项和Momentum和RMSprop是非常一致的,由于和的初始值一般设置为0,在训练初期其可能较小,第三和第四项主要是为了放大它们。最后一项是参数更新。其中超参数的建议值是0?wx_fmt=png。Adm是性能非常好的算法,在TensorFlow其实现如下: tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.9, beta2=0.999, epsilon=1e-08)。

 

 


 

学习速率

 

前面也说过学习速率的问题,对于梯度下降算法,这应该是一个最重要的超参数。如果学习速率设置得非常大,那么训练可能不会收敛,就直接发散了;如果设置的比较小,虽然可以收敛,但是训练时间可能无法接受;如果设置的稍微高一些,训练速度会很快,但是当接近最优点会发生震荡,甚至无法稳定。不同学习速率的选择影响可能非常大,如图3所示。

0?wx_fmt=png

图3 不同学习速率的训练效果

 

 

 

 

理想的学习速率是:刚开始设置较大,有很快的收敛速度,然后慢慢衰减,保证稳定到达最优点。所以,前面的很多算法都是学习速率自适应的。除此之外,还可以手动实现这样一个自适应过程,如实现学习速率指数式衰减:

0?wx_fmt=png

 

在TensorFlow中,你可以这样实现:

 

initial_learning_rate = 0.1
decay_steps = 10000
decay_rate = 1/10
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay(initial_learning_rate,                           
                            global_step, decay_steps, decay_rate)
# decayed_learning_rate = learning_rate *
#                decay_rate ^ (global_step / decay_steps)
optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=0.9)
training_op = optimizer.minimize(loss, global_step=global_step)

 

 

 

 


 

总结

 

本文简单介绍了梯度下降算法的分类以及常用的改进算法,总结来看,优先选择学习速率自适应的算法如RMSprop和Adam算法,大部分情况下其效果是较好的。还有一定要特别注意学习速率的问题。其实还有很多方面会影响梯度下降算法,如梯度的消失与爆炸,这也是要额外注意的。最后不得不说,梯度下降算法目前无法保证全局收敛还将是一个持续性的数学难题。

 

 

 


 

 

参考文献

 

 

  1. Anoverview of gradient descent optimization algorithms: http://sebastianruder.com/optimizing-gradient-descent/.

  2. Hands-OnMachine Learning with Scikit-Learn and TensorFlow, Aurélien Géron, 2017.

  3. NAG:http://proceedings.mlr.press/v28/sutskever13.pdf.

  4. Adagrad:http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf.

  5. RMSprop:http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf.

  6. Adadelta:https://arxiv.org/pdf/1212.5701v1.pdf.

  7. Adam:https://arxiv.org/pdf/1412.6980.pdf.

  8. 不同的算法的效果可视化:https://imgur.com/a/Hqolp.

其中为学习率。算法部分主要着重公式推导,梯度下降算法在对应的机器学习项目实践中会详细介绍。

<think>好的,我现在需要处理用户关于多元线性回归方程的查询。首先,用户提到了想了解公式、解释和实现方法,可能他们正在学习统计学或机器学习的基础知识,或者是想应用在实际项目中。我需要先回顾一下多元线性回归的基础概念,确保自己理解正确,然后组织信息以清晰的结构呈现。 首先,多元线性回归公式。根据用户提供的引用[1]和[2],多元线性回归方程的一般形式是$y = b_0 + b_1X_1 + b_2X_2 + \dots + b_nX_n$。这里的$b_0$是截距项,$b_1$到$b_n$是各个自变量对应的偏回归系数。我需要解释每个部分的含义,比如截距项表示当所有自变量为零时的预测值,而偏回归系数则代表每个自变量对因变量的影响,控制其他变量不变的情况下。 接下来是推导部分。用户可能希望了解参数是如何估计的,最常见的方法是最小二乘法。我需要回忆最小二乘法的原理,即通过最小化残差平方和来求解参数。数学上,这涉及到构建设计矩阵$X$,其中包含一个全1的列(对应截距项)和各个自变量的观测值。然后,参数向量$\beta$的估计可以通过公式$\hat{\beta} = (X^TX)^{-1}X^Ty$得到。这里可能需要解释矩阵运算的意义,以及为什么需要求逆矩阵,同时也要提到前提条件,比如矩阵$X^TX$必须是可逆的,否则可能存在多重共线性问题。 然后,关于实现方法,用户可能希望看到具体的代码示例,比如使用Python的numpy库手动实现,或者使用scikit-learn库中的线性回归模型。手动实现部分需要注意矩阵运算的正确性,尤其是在处理矩阵求逆时可能出现的数值稳定性问题,比如使用numpy的lstsq函数而不是直接求逆,以提高计算的稳定性。而使用scikit-learn则更简洁,适合实际应用,但需要解释步骤如数据准备、模型训练和预测。 还需要考虑假设检验和模型评估,比如R²分数、调整R²、F检验等,但用户的问题可能更关注基础和实现,所以这部分可能简要提及,或者在相关问题中展开。此外,要注意解释各个参数的意义,比如偏回归系数的正负表示自变量与因变量的正相关或负相关关系,系数的大小表示影响程度,但需注意量纲的影响,可能需要标准化处理。 在解释过程中,需要确保所有的数学公式都按照用户的指示使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。例如,参数估计的公式需要单独成段,使用双美元符号包围。同时,引用用户提供的参考资料,在适当的地方添加引用标识,如[^1][^2]。 可能遇到的问题:用户可能对矩阵运算不熟悉,需要尽量用简明的方式解释,避免过于复杂的数学推导,但又要保证正确性。另外,代码示例需要正确无误,最好测试一下,比如手动实现的例子是否能够运行,是否有语法错误。比如,在numpy中,矩阵乘法使用@符号或者dot方法,需要确保示例中的写法正确。 最后,生成的相关问题需要围绕多元线性回归展开,比如假设检验、过拟合处理、变量选择方法等,这些可以帮助用户进一步深入学习。检查是否有遗漏的重要点,比如模型的前提假设(线性关系、误差项独立同分布、同方差性、无多重共线性、正态分布等),这些可能在解释或相关问题时提到。 总结回答的结构:先介绍公式,解释各个部分;然后推导参数估计方法;接着给出实现代码,包括手动和库的实现;最后相关的问题。确保每个部分清晰,步骤分明,语言简洁,符合用户的中文要求,并且正确应用引用和LaTeX格式。</think>### 多元线性回归方程详解 #### 1. **公式与解释** 多元线性回归用于研究一个因变量$y$与多个自变量$X_1, X_2, \dots, X_n$之间的线性关系,其方程形式为: $$y = b_0 + b_1X_1 + b_2X_2 + \dots + b_nX_n + \epsilon$$ - **$b_0$**:截距项,表示所有自变量为0时$y$的预测值。 - **$b_i$**:偏回归系数,表示在控制其他变量不变时,$X_i$每增加1单位对$y$的影响。 - **$\epsilon$**:误差项,代表未观测因素对$y$的影响。 #### 2. **参数估计(推导)** 通过**最小二乘法**估计参数,目标是使残差平方和最小: $$\min \sum (y_i - \hat{y_i})^2$$ 设设计矩阵$X$包含自变量和全1列(截距项),参数向量$\beta = [b_0, b_1, \dots, b_n]^T$,则最优解为: $$\hat{\beta} = (X^TX)^{-1}X^Ty$$ 此公式要求$X^TX$可逆,否则需处理多重共线性。 #### 3. **实现方法** ##### **手动实现(Python)** ```python import numpy as np # 生成示例数据 X = np.array([[1, 2, 3], [1, 4, 5], [1, 6, 7]]) # 包含截距列 y = np.array([6, 11, 16]) # 计算参数 beta = np.linalg.inv(X.T @ X) @ X.T @ y print("参数估计值:", beta) # 输出: [1. 1. 1.] ``` ##### **使用Scikit-learn库** ```python from sklearn.linear_model import LinearRegression # 假设X已去除截距列,模型自动添加 X = [[2, 3], [4, 5], [6, 7]] y = [6, 11, 16] model = LinearRegression() model.fit(X, y) print(f"截距: {model.intercept_}, 系数: {model.coef_}") # 输出: 截距: 1.0, 系数: [1. 1.] ``` #### 4. **模型评估** - **R²分数**:解释变量对因变量的解释力度,范围$[0,1]$。 - **调整R²**:考虑自变量数量后的修正值。 - **p值**:检验自变量显著性(需结合统计库如`statsmodels`)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值