线性回归算法

一、数学原理

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

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),后续可扩展学习。

相关推荐
曹牧6 小时前
C#:数组不能使用Const修饰符
java·数据结构·算法
派大星爱吃猫6 小时前
希尔排序详解
算法·排序算法·希尔排序
kkkkk0211067 小时前
【Rust创作】Rust 错误处理:从 panic 到优雅控制
开发语言·算法·rust
爱学习的小鱼gogo7 小时前
pyhton 螺旋矩阵(指针-矩阵-中等)含源码(二十六)
python·算法·矩阵·指针·经验·二维数组·逆序
坚持编程的菜鸟8 小时前
LeetCode每日一题——二进制求和
c语言·算法·leetcode
Glink8 小时前
现在开始将Github作为数据库
前端·算法·github
WWZZ20259 小时前
快速上手大模型:机器学习6(过拟合、正则化)
人工智能·算法·机器学习·计算机视觉·机器人·slam·具身感知
ceclar1239 小时前
C++Lambda表达式
开发语言·c++·算法
2401_841495649 小时前
【强化学习】动态规划算法
人工智能·python·算法·动态规划·强化学习·策略迭代·价值迭代