线性回归正则化 regularized linear regression

本文探讨了线性回归中的过拟合问题,并介绍了如何通过正则化方法来减小模型复杂度,从而提高泛化能力。文中详细解释了正则化的原理及其在梯度下降和正规方程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性回归正则化regularized linear regression


在前几篇博客中介绍了一元线性回归http://blog.youkuaiyun.com/u012328159/article/details/50994095和多元线性回归http://blog.youkuaiyun.com/u012328159/article/details/51029695等线性回归的知识,具体请参见本人其他博客。但是线性回归存在一个很重要的问题就是过拟合(overfitting)问题,所谓过拟合简单直白的说就是模型的训练误差极小,而检验误差很大。一个好的学习器不仅能够很好的拟合训练数据,而且能够对未知样本有很强的泛化能力,即低泛化误差。先来看看线性回归中的过拟合现象(自己不想画图了,直接盗用Andrew Ng大神的图吧):

图中左边的图表示的线性回归模型存在欠拟合现象(underfitting),欠拟合顾名思义就是对训练数据的拟合程度不够好,训练误差大。中间的线性回归模型是个拟合程度很好的模型。右边图表示的就是过拟合现象,能够看出它对训练数据拟合的非常好,但是预测能力很差,泛化能力很差。

因此,处理过拟合问题常用的方法有:
  • 减少特征数量  主要方法有:人工的挑选重要的特征,去除不重要的特征。采用特征选择算法(在后面的博客中会介绍,在这不细说了)  但是这个方法在去除特征的同时,也去除了这部分特征所提供的信息。
  • 正则化(regularization) 保留所有特征,但是减少参数的值。
线性回归正则化通过缩小参数的值,可以使多项式模型更加简单,直接举个例子吧(图片来源:ng machine learning课)



上图左边的二次曲线是我们希望的,右边的更高次的线性回归模型显然是过拟合的,但是如果在它的代价函数后面添加两项 ,如果想让最小,那么的值几乎要接近0,因此,右边的多项式几乎等价于左边的,又能够得到一个正确的线性回归模型。
先来说说为什么增加正则项就能够有效避免过拟合(或者说是引入正则项的动机): 假如对于一个多项式函数,

我们来看看随着多项式阶数的增加系数M是如何剧增的,见下表(来自PRML):

看完这个表应该一目了然,正则项为什么能够惩罚系数了。
因此,正则化线性回归(regularized linear regression)的代价函数(cost function)为:

其中为正则项,为正则系数。如果设置的非常大,会使 ,将会产生欠拟合问题。因此应该选择合适的正则系数
我们的目标是即求得使最小的参数。因此对正则化线性回归使用梯度下降(gradient descent),为:

之所以把单独写出来,是因为我们正则化的时候,不对 进行惩罚。如果上面的的公式中的同类项合并下,则为:

因为  始终为正,因此  一般来说其值比1小一点点,因此相当于把缩小了一点点。

对于线性回归来说,除了通过梯度下降来求解参数,还可以通过正规方程(normal equation)用矩阵运算来直接求解参数。对于样本X和label Y而言,可以如下表达:

那么正则化线性回归的正规方程为:



其中,上式中的对角矩阵维度是(n+1)*(n+1)。在以前的博客讲正规方程的时候讲过当 时, 不存在,幸运的是正规化帮助我们解决了这个问题,即在正则化线性回归中,如果 ,则  

是存在的,也即里面的矩阵是可逆的。
### 关于正则化线性回归的概念 在线性回归中引入正则化是为了防止过拟合现象的发生。当模型过于复杂,即拥有过多的自由参数时,可能会导致训练数据上的表现非常好,但在未见过的数据上性能较差。为了缓这一情况,在损失函数中加入了一个惩罚项来约束权重系数的大小[^3]。 对于正则化线性回归而言,其目标是最小化如下形式的成本函数: \[ J(\theta)=\frac{1}{2m}\left[\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2+\lambda \sum_{j=1}^{n}\theta_j^2\right]\] 其中 \( h_\theta (x)\) 表示假设函数;\( m\) 是样本数量;\( n\) 代表特征数目;而 \( \lambda\) 则是用来控制正则强度的超参数[^2]。 ### 正则化线性回归的具体实现 #### Python代码实例 下面给出一段Python代码用于计算带有L2正则化线性回归成本以及相应的梯度向量: ```python import numpy as np def compute_cost(X, y, theta, lambda_reg): """ Compute cost and gradient for linear regression with regularization Parameters: X : array_like The input dataset of shape (m x n+1). y : array_like Value at given features. A vector of shape (m, ). theta : array_like Linear regression parameters. A vector of shape (n+1,). lambda_reg : float The regularization parameter. Returns: J : float The computed value for the regularized cost function. grad : ndarray The partial derivatives of the cost w.r.t to each element in theta. """ # Initialize some useful values m = len(y) # number of training examples predictions = X @ theta.T error = predictions - y reg_term = (lambda_reg / (2 * m)) * sum(theta[1:] ** 2) # Calculate Cost Function J = (1/(2*m))*np.sum(error**2)+reg_term # Gradient Descent & Regularization Term Excluding Bias Parameter grad = ((1/m)*X.T@error).T+(lambda_reg/m)*theta grad[0]=grad[0]-((lambda_reg/m)*theta[0]) return J, grad ``` 此段程序实现了带L2正则化线性回归成本函数及其导数的求过程。注意这里对偏置项不做任何正则处理[^4]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值