线性回归
线性回归是统计学和机器学习中的一种基本预测模型,用于分析和建模目标变量(连续型数据)与一个或多个自变量(解释变量)之间的关系。
线性回归概述
线性回归模型假设目标变量 y
与自变量 X
之间存在线性关系。这种关系可以用以下公式表示:
y = β 0 + β 1 X 1 + β 2 X 2 + … + β n X n + ϵ y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_n X_n + \epsilon y=β0+β1X1+β2X2+…+βnXn+ϵ
其中:
y
是目标变量。X_1, X_2, \ldots, X_n
是自变量。- β_0, β_1,β_n 是回归系数,需要通过数据估计。
- ε 是误差项,表示模型无法解释的随机变异。
线性回归类型
- 简单线性回归:只有一个自变量和一个因变量。
- 多元线性回归:包含两个或更多自变量。
损失函数
线性回归通常使用最小二乘法来估计模型参数,即最小化实际观测值和模型预测值之间的平方差之和。损失函数定义为:
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
其中:
n
是样本数量。y_i
是第i
个观测值。- y_i是模型预测值。
参数估计
最小二乘法通过求解以下方程来估计参数:
∂ MSE ∂ β j = 0 \frac{\partial \text{MSE}}{\partial \beta_j} = 0 ∂βj∂MSE=0
这通常通过矩阵运算实现:
β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^T X)^{-1} X^T y β^=(XTX)−1XTy
其中:
X
是设计矩阵,包含自变量的值。y
是目标变量的向量。- β 是估计的参数向量。
梯度下降法
梯度下降是一种优化算法,用于最小化损失函数。在每次迭代中,参数按照梯度的反方向更新:
β ( t + 1 ) = β ( t ) − α ∇ β MSE ( β ( t ) ) \beta^{(t+1)} = \beta^{(t)} - \alpha \nabla_\beta \text{MSE}(\beta^{(t)}) β(t+1)=β(t)−α∇βMSE(β(t))
其中:
- α是学习率。
- β 是损失函数相对于参数的梯度。
正则化
为了防止过拟合,线性回归模型可以加入正则化项,如岭回归(L2正则化)和Lasso回归(L1正则化):
-
岭回归:
Loss = MSE + λ ∑ j = 1 n β j 2 \text{Loss} = \text{MSE} + \lambda \sum_{j=1}^{n} \beta_j^2 Loss=MSE+λj=1∑nβj2 -
Lasso回归:
Loss = MSE + λ ∑ j = 1 n ∣ β j ∣ \text{Loss} = \text{MSE} + \lambda \sum_{j=1}^{n} |\beta_j| Loss=MSE+λj=1∑n∣βj∣
其中 λ 是正则化强度参数。
应用
线性回归广泛应用于各种预测任务,如房价预测、股票价格分析、销售预测等。尽管线性回归模型简单,但它提供了对数据关系的基本理解,并且可以作为更复杂模型的基准。
线性回归模型的实现和应用通常依赖于统计软件或机器学习库,如Python的scikit-learn库,它提供了简单而强大的接口来训练和评估线性回归模型。
最后介绍一下sklearn库中的接口
import numpy as np
import matplotlib.pyplot as pltw = np.linspace(-10,20,100)
# print(w)
def loss(w):return (w-3.5)**2-4.5*w+10
def dloss(w):return 2*(w-3.5)-4.5plt.plot(w,loss(w)) # 当该直线与x轴相交,表示损失为0,拟合曲线与所有已知点重合,
# 且该曲线无法出现小于0的值,因为该曲线是由均方误差算的# 梯度下降
# 学习率
learning_rate = 0.01
# 初始化一个w值
np.random.seed(1)
w = np.random.randint(-10,20) # 随机给一个w值:-5
e = loss(w) # 初始化的w为-5时的loss值
x = [w]
y = [e]# 用循环来多级下降
for i in range(100):w = w-learning_rate*dloss(w)e = loss(w)x.append(w)y.append(e)# 单次下降
# # 第一次梯度下降
# w = w-learning_rate*dloss(w)
# e = loss(w)
# x.append(w)
# y.append(e)
# # 第二次梯度下降
# w = w-learning_rate*dloss(w)
# e = loss(w)
# x.append(w)
# y.append(e)
# # 第三次
# w = w-learning_rate*dloss(w)
# e = loss(w)
# x.append(w)
# y.append(e)plt.scatter(x,y)
plt.show()