线性回归算法

一、数学原理

线性回归的核心假设:因变量与自变量之间存在线性关系,即通过线性组合拟合数据分布。

1. 简单线性回归(单特征)

当自变量只有1个时(记为xxx),因变量(记为yyy)的线性关系可表示为:
y=wx+b+ε y = wx + b + \varepsilon y=wx+b+ε

其中:

  • (w):权重(斜率),表示(x)对(y)的影响程度;
  • (b):偏置(截距),表示(x=0)时(y)的基准值;
  • ε\varepsilonε:误差项(不可控噪声),假设满足:ε∼N(0,σ2)\varepsilon \sim N(0, \sigma^2)ε∼N(0,σ2)(均值为0的正态分布)。

模型的预测值为:y^=wx+b\hat{y} = wx + by^=wx+b(忽略误差项)。

2. 多元线性回归(多特征)

当自变量有(p)个时(记为x1,x2,...,xpx_1, x_2, ..., x_px1,x2,...,xp),线性关系扩展为:
y=w1x1+w2x2+...+wpxp+b+ε y = w_1x_1 + w_2x_2 + ... + w_px_p + b + \varepsilon y=w1x1+w2x2+...+wpxp+b+ε

用矩阵表示更简洁:令XXX为n×(p+1)n \times (p+1)n×(p+1)的设计矩阵(nnn为样本数,第1列全为1,对应偏置bbb),θ=[b,w1,w2,...,wp]T\theta = [b, w_1, w_2, ..., w_p]^Tθ=[b,w1,w2,...,wp]T为参数向量,则:
y=Xθ+ε y = X\theta + \varepsilon y=Xθ+ε

预测值:y^=Xθ\hat{y} = X\thetay^=Xθ。

二、公式推导(最小二乘法)

目标:找到最优参数θ\thetaθ,使预测值y^\hat{y}y^与真实值yyy的误差最小。最常用的度量是残差平方和(RSS) ,即损失函数L(θ)L(\theta)L(θ):

1. 简单线性回归推导

损失函数:
L(w,b)=∑i=1n(y^i−yi)2=∑i=1n(wxi+b−yi)2 L(w, b) = \sum_{i=1}^n (\hat{y}i - y_i)^2 = \sum{i=1}^n (wx_i + b - y_i)^2 L(w,b)=i=1∑n(y^i−yi)2=i=1∑n(wxi+b−yi)2

为最小化(L(w, b)),分别对(w)和(b)求偏导并令其为0:

  • 对(b)求偏导:
    ∂L∂b=2∑i=1n(wxi+b−yi)=0 \frac{\partial L}{\partial b} = 2\sum_{i=1}^n (wx_i + b - y_i) = 0 ∂b∂L=2i=1∑n(wxi+b−yi)=0

    化简得:nb+w∑xi=∑yi  ⟹  b=yˉ−wxˉnb + w\sum x_i = \sum y_i \implies b = \bar{y} - w\bar{x}nb+w∑xi=∑yi⟹b=yˉ−wxˉ(xˉ\bar{x}xˉ、yˉ\bar{y}yˉ为样本均值)。

  • 对(w)求偏导:
    ∂L∂w=2∑i=1n(wxi+b−yi)xi=0 \frac{\partial L}{\partial w} = 2\sum_{i=1}^n (wx_i + b - y_i)x_i = 0 ∂w∂L=2i=1∑n(wxi+b−yi)xi=0

    将b=yˉ−wxˉb = \bar{y} - w\bar{x}b=yˉ−wxˉ代入,化简得:
    w=∑i=1n(xi−xˉ)(yi−yˉ)∑i=1n(xi−xˉ)2=cov(x,y)var(x) w = \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^n (x_i - \bar{x})^2} = \frac{\text{cov}(x, y)}{\text{var}(x)} w=∑i=1n(xi−xˉ)2∑i=1n(xi−xˉ)(yi−yˉ)=var(x)cov(x,y)

2. 多元线性回归推导

损失函数(矩阵形式):
L(θ)=(y^−y)T(y^−y)=(Xθ−y)T(Xθ−y) L(\theta) = (\hat{y} - y)^T(\hat{y} - y) = (X\theta - y)^T(X\theta - y) L(θ)=(y^−y)T(y^−y)=(Xθ−y)T(Xθ−y)

展开后:
L(θ)=θTXTXθ−2θTXTy+yTy L(\theta) = \theta^T X^T X \theta - 2\theta^T X^T y + y^T y L(θ)=θTXTXθ−2θTXTy+yTy

对θ\thetaθ求导(利用矩阵求导法则:∂aTθ∂θ=a\frac{\partial a^T \theta}{\partial \theta} = a∂θ∂aTθ=a,∂θTAθ∂θ=(A+AT)θ\frac{\partial \theta^T A \theta}{\partial \theta} = (A + A^T)\theta∂θ∂θTAθ=(A+AT)θ):
∂L∂θ=2XTXθ−2XTy \frac{\partial L}{\partial \theta} = 2X^T X \theta - 2X^T y ∂θ∂L=2XTXθ−2XTy

令导数为0,解得最优参数:
θ=(XTX)−1XTy \theta = (X^T X)^{-1} X^T y θ=(XTX)−1XTy

(注:要求(X^T X)可逆,即特征无完全共线性)。

三、代码复现(手动实现)

用Python的numpy手动实现简单线性回归和多元线性回归,验证推导结果。

1. 简单线性回归实现
python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# 1. 生成模拟数据(y = 2x + 3 + 噪声)
np.random.seed(42)
x = np.random.rand(100, 1) * 10  # 100个样本,x∈[0,10]
y = 2 * x + 3 + np.random.randn(100, 1) * 2  # 加入高斯噪声

# 2. 手动计算w和b
x_mean = np.mean(x)
y_mean = np.mean(y)

# 分子:sum((x_i - x_mean)(y_i - y_mean))
numerator = np.sum((x - x_mean) * (y - y_mean))
# 分母:sum((x_i - x_mean)^2)
denominator = np.sum((x - x_mean) ** 2)

w = numerator / denominator
b = y_mean - w * x_mean

print(f"手动计算的w: {w[0]:.4f}, b: {b[0]:.4f}")  # 接近真实值2和3

# 3. 预测与可视化
y_pred = w * x + b
plt.scatter(x, y, label="真实数据")
plt.plot(x, y_pred, color='r', label=f"拟合线: y={w[0]:.2f}x+{b[0]:.2f}")
plt.legend()
plt.show()
2. 多元线性回归实现
python 复制代码
import numpy as np

# 1. 生成模拟数据(y = 1*x1 + 2*x2 + 3*x3 + 4 + 噪声)
np.random.seed(42)
n = 100  # 样本数
p = 3    # 特征数
X = np.random.rand(n, p) * 10  # 3个特征
# 加入偏置项对应的列(全为1)
X_design = np.hstack([np.ones((n, 1)), X])  # 形状:(100, 4)
theta_true = np.array([4, 1, 2, 3])  # [b, w1, w2, w3]
y = X_design @ theta_true + np.random.randn(n) * 1.5  # 矩阵乘法@

# 2. 手动计算theta:theta = (X^T X)^(-1) X^T y
X_T = X_design.T
theta = np.linalg.inv(X_T @ X_design) @ X_T @ y

print(f"真实theta: {theta_true}")
print(f"手动计算theta: {theta.round(4)}")  # 接近真实值

四、用sklearn实现线性回归

sklearn的LinearRegression封装了高效的线性回归实现(基于最小二乘法),支持多元回归,自动处理偏置项。

步骤示例
python 复制代码
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score  # 评估指标:R²(越接近1越好)
import numpy as np

# 1. 准备数据(复用多元回归的模拟数据)
np.random.seed(42)
n, p = 100, 3
X = np.random.rand(n, p) * 10
y = 4 + 1*X[:,0] + 2*X[:,1] + 3*X[:,2] + np.random.randn(n)*1.5

# 2. 模型训练
model = LinearRegression()  # 自动添加偏置项
model.fit(X, y)  # 传入特征X(无需手动加全1列)

# 3. 查看参数
print(f"偏置b: {model.intercept_.round(4)}")  # 对应theta[0]
print(f"权重w: {model.coef_.round(4)}")        # 对应theta[1:4]

# 4. 预测与评估
y_pred = model.predict(X)
print(f"R²得分: {r2_score(y, y_pred):.4f}")  # 接近1,拟合良好

总结

  • 线性回归通过最小二乘法求解最优参数,核心是最小化残差平方和;
  • 简单线性回归有显式解析解(基于均值和协方差),多元回归通过矩阵运算求解;
  • 手动实现可加深对原理的理解,实际应用中优先使用sklearn(高效且处理边缘情况,如特征共线性)。

若数据存在多重共线性((X^T X)不可逆),可引入正则化(如Ridge、Lasso),后续可扩展学习。

相关推荐
LYFlied2 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_07282 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术2 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone3 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang201220133 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu3 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入3 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems95273 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo3 小时前
leetcode 3074
数据结构·算法·leetcode
Yzzz-F3 小时前
算法竞赛进阶指南 动态规划 背包
算法·动态规划