1. 从零开始构建线性模型
记得我第一次接触机器学习时,导师就说过:"线性回归是机器学习的'Hello World',但90%的新手都没真正搞懂它。"今天我们就用Python和NumPy从零开始实现一个线性回归模型,不借助任何现成的机器学习框架。这种方式能让你真正理解梯度下降、损失函数这些核心概念的运作机制。
为什么选择线性模型作为入门?首先,它是理解更复杂模型的基础;其次,在特征工程得当的情况下,线性模型往往能产生出乎意料的好效果;最重要的是,通过手动实现,你会对矩阵运算、求导链式法则等数学知识有更直观的认识。本文假设你已经具备基础的Python编程能力和高中数学知识,我们会从理论到实践完整走一遍建模流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 理论基础与模型设计
2.1 线性回归数学表达
线性模型的基本形式为:
code复制ŷ = w·x + b
其中:
- ŷ 是我们的预测值
- w 是权重(weight)向量
- x 是输入特征向量
- b 是偏置(bias)项
在多元情况下,这可以扩展为矩阵运算:
code复制Ŷ = XW + b
这里X是m×n的特征矩阵(m个样本,n个特征),W是n×1的权重矩阵。
2.2 损失函数选择
我们使用均方误差(MSE)作为损失函数:
code复制L = 1/m * Σ(ŷ_i - y_i)²
MSE的优点在于:
- 处处可微,便于梯度计算
- 对离群点敏感(这既是优点也是缺点)
- 几何意义明确(预测值与真实值的欧式距离)
注意:当数据存在大量离群点时,可以考虑使用Huber损失等鲁棒性更强的损失函数
2.3 梯度下降原理
参数更新公式:
code复制w := w - α * ∂L/∂w
b := b - α * ∂L/∂b
其中α是学习率,控制每次更新的步长。
计算梯度:
code复制∂L/∂w = 2/m * Xᵀ(Ŷ - Y)
∂L/∂b = 2/m * Σ(Ŷ - Y)
3. Python实现细节
3.1 数据准备
我们首先生成一些合成数据用于测试:
python复制import numpy as np
# 设置随机种子保证可复现
np.random.seed(42)
# 生成100个样本,1个特征
m = 100
X = 2 * np.random.rand(m, 1)
y = 4 + 3 * X + np.random.randn(m, 1) # 添加高斯噪声
# 划分训练集测试集
split = int(m*0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]
3.2 模型实现
完整线性回归类实现:
python复制class LinearRegression:
def __init__(self, learning_rate=0.01, n_iters=1000):
self.lr = learning_rate
self.n_iters = n_iters
self.weights = None
self.bias = None
def fit(self, X, y):
# 初始化参数
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
# 梯度下降
for _ in range(self.n_iters):
y_pred = np.dot(X, self.weights) + self.bias
#
