一、数学原理
线性回归的核心假设:因变量与自变量之间存在线性关系,即通过线性组合拟合数据分布。
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),后续可扩展学习。