线性回归模型
在线性回归中,我们需要建立一个线性模型来描述输入特征和输出之间的关系。具体来说,我们可以用以下公式表示线性回归模型:
f ( x ) = w T x + b f(x) = w^Tx + b f(x)=wTx+b
其中, x x x 是输入特征向量, w w w 是权重向量, b b b 是偏差项。这个模型可以看做是一个对输入特征加权求和后再加上一个常数偏置的过程。我们可以将这个模型用向量和矩阵的形式表示为:
f ( X ) = X w + b f(X) = Xw+b f(X)=Xw+b
其中, X X X 是输入特征矩阵,每一行代表一个样本的特征向量, w w w 和 b b b 分别是权重向量和偏差项。
损失函数
在线性回归中,我们通常使用最小二乘法来求解模型参数。最小二乘法的思想是通过最小化残差平方和的方法来求解模型参数。具体来说,我们定义残差为真实输出值与预测输出值之间的差距,残差平方和就是所有样本的残差平方之和。最小二乘法就是通过最小化残差平方和来求解模型参数。
对于一个输入特征矩阵 X X X 和一个输出向量 y y y,我们可以定义线性回归的损失函数为:
J ( w , b ) = 1 2 n ∑ i = 1 n ( f ( x ( i ) ) − y ( i ) ) 2 J(w,b) = \frac{1}{2n}\sum_{i=1}^{n}(f(x^{(i)})-y^{(i)})^2 J(w,b)=2n1i=1∑n(f(x(i))−y(i))2
其中, n n n 是样本数量, x ( i ) x^{(i)} x(i) 和 y ( i ) y^{(i)} y(i) 分别表示第 i i i 个样本的特征向量和真实输出值, f ( x ( i ) ) f(x^{(i)}) f(x(i)) 是模型对第 i i i 个样本的预测输出值。
参数更新
在求解模型参数时,我们通常使用梯度下降算法来优化损失函数。梯度下降算法是一种基于负梯度方向更新参数的优化算法。具体来说,在每次迭代中,我们计算损失函数对权重向量和偏差项的偏导数,并按照负梯度方向更新参数。具体公式如下:
w : = w − α ∇ w J ( w , b ) b : = b − α ∇ b J ( w , b ) \begin{aligned} w &:= w - \alpha \nabla_w J(w,b)\\ b &:= b - \alpha \nabla_b J(w,b) \end{aligned} wb:=w−α∇wJ(w,b):=b−α∇bJ(w,b)
其中, α \alpha α 是学习率,它控制着每次迭代更新的步长大小, ∇ w J ( w , b ) \nabla_w J(w,b) ∇wJ(w,b) 和 ∇ b J ( w , b ) \nabla_b J(w,b) ∇bJ(w,b) 分别是损失函数对权重向量和偏差项的偏导数。我们可以用以下公式计算它们的值:
∇ w J ( w , b ) = 1 n X T ( X w + b − y ) ∇ b J ( w , b ) = 1 n ∑ i = 1 n ( f ( x ( i ) ) − y ( i ) ) \begin{aligned} \nabla_w J(w,b) &= \frac{1}{n}X^T(Xw+b-y)\\ \nabla_b J(w,b) &= \frac{1}{n}\sum_{i=1}^{n}(f(x^{(i)})-y^{(i)}) \end{aligned} ∇wJ(w,b)∇bJ(w,b)=n1XT(Xw+b−y)=n1i=1∑n(f(x(i))−y(i))
其中, X T X^T XT 是输入特征矩阵 X X X 的转置。
正则化
在实际应用中,我们通常需要对线性回归模型进行正则化,以避免过拟合。常见的正则化方法包括 L1 正则化、L2 正则化等。这里我们以 L2 正则化为例,对线性回归模型进行正则化。
具体来说,我们通过在损失函数中添加 L2 正则化项来限制模型的复杂度。L2 正则化项的定义如下:
R ( w ) = λ 2 ∥ w ∥ 2 2 R(w) = \frac{\lambda}{2}\Vert w \Vert_2^2 R(w)=2λ∥w∥22
其中, ∥ w ∥ 2 \Vert w \Vert_2 ∥w∥2 表示权重向量的 L2 范数,也就是所有权重的平方和再开根号, λ \lambda λ 是正则化系数,它控制着正则化的强度。
我们可以将带有 L2 正则化的损失函数定义为:
J ( w , b ) = 1 2 n ∑ i = 1 n ( f ( x ( i ) ) − y ( i ) ) 2 + R ( w ) J(w,b) = \frac{1}{2n}\sum_{i=1}^{n}(f(x^{(i)})-y^{(i)})^2 + R(w) J(w,b)=2n1i=1∑n(f(x(i))−y(i))2+R(w)
对上式求偏导并代入梯度下降算法的更新公式中可得:
w : = w − α ( ∇ w J ( w , b ) + λ w ) b : = b − α ∇ b J ( w , b ) \begin{aligned} w &:= w - \alpha (\nabla_w J(w,b)+\lambda w)\\ b &:= b - \alpha \nabla_b J(w,b) \end{aligned} wb:=w−α(∇wJ(w,b)+λw):=b−α∇bJ(w,b)
其中, ∇ w J ( w , b ) \nabla_w J(w,b) ∇wJ(w,b) 和 ∇ b J ( w , b ) \nabla_b J(w,b) ∇bJ(w,b) 分别是不带正则化项的损失函数对权重向量和偏差项的偏导数。
简单优化算法
在线性回归中,我们通常使用梯度下降算法来优化损失函数。梯度下降算法是一种基于负梯度方向更新参数的优化算法,它可以用于最小化损失函数。
梯度下降算法的基本思想是通过迭代地更新参数,逐渐接近损失函数的最小值。每次迭代,我们计算损失函数关于参数的偏导数,得到梯度,然后按照负梯度方向更新参数,使得损失函数逐渐减小。
具体来说,在每次迭代中,我们根据以下公式更新参数:
θ : = θ − α ∇ J ( θ ) \theta := \theta - \alpha \nabla J(\theta) θ:=θ−α∇J(θ)
其中, θ \theta θ 表示参数, α \alpha α 表示学习率, ∇ J ( θ ) \nabla J(\theta) ∇J(θ) 表示损失函数关于参数的梯度。
在梯度下降算法中,学习率 α \alpha α 的选择非常重要。如果学习率过大,可能会导致每次迭代跳过最优解;如果学习率过小,可能会导致收敛速度过慢。通常情况下,我们需要通过尝试不同的学习率来找到一个合适的值。
除了梯度下降算法,还有其他一些简单的优化算法可以用于线性回归,例如随机梯度下降算法(Stochastic Gradient Descent,SGD)和批量梯度下降算法(Batch Gradient Descent,BGD)。这些算法在梯度的计算和参数更新上有所不同,但基本思想都是相似的:通过迭代地更新参数,逐渐接近损失函数的最小值。
代码实现
下面是使用 Python 实现的简单线性回归算法的代码:
# By Dr.Cup
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 使用梯度下降算法拟合线性模型
eta = 0.1 # 学习率
n_iterations = 1000
m = 100
theta = np.random.randn(2, 1)
X_b = np.c_[np.ones((100, 1)), X] # 添加偏置项 x0 = 1(即将每个样本都添加一个特征值为 1 的维度)
for iteration in range(n_iterations):
gradients = 2 / m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - eta * gradients
# 可视化展示结果
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
y_predict = X_new_b.dot(theta)
plt.plot(X, y, "b.")
plt.plot(X_new, y_predict, "r-", linewidth=2, label="Predictions")
plt.xlabel("x1")
plt.ylabel("y")
plt.legend(loc="upper left")
plt.show()
当我们进行机器学习任务时,经常需要通过拟合模型来预测数据。在这个代码段中,我们展示了如何使用梯度下降算法来拟合一个简单的线性回归模型。
我们首先生成了一组随机数据,其中自变量 X 是一个形状为 (100, 1) 的随机数组,因变量 y 基于线性关系 y = 4 + 3X + 噪声 生成。接下来,我们使用梯度下降算法来拟合线性模型。梯度下降算法是一种优化算法,通过迭代更新模型参数来最小化预测值与真实值之间的误差。在每次迭代中,我们计算梯度(即参数的导数)并根据学习率来更新模型参数。我们重复这个过程一定的迭代次数,使模型逐渐拟合数据。
最后,我们使用 matplotlib 库将原始数据点和拟合的线性模型进行可视化展示。蓝色点表示原始数据,红色线表示模型预测的结果。通过观察图形,我们可以直观地了解模型的拟合效果(如下图所示)。
上面的代码段展示了一个简单的线性回归案例,介绍了梯度下降算法的基本原理,并通过可视化方式呈现了模型拟合的效果。如果还有其他问题,请随时提出,欢迎批评指正!