人工智能与机器学习:Python从零实现线性回归模型(2026最新版) 📈
大家好!线性回归(Linear Regression)是机器学习最基础、最重要的算法之一。它是监督学习中的回归任务,目标是找到一条直线(或超平面),让预测值与真实值误差最小。
今天我们完全不用scikit-learn,纯手写NumPy实现两种经典方法:
- 闭式解(Normal Equation) —— 一步求最优解
- 梯度下降(Gradient Descent) —— 迭代优化(理解神经网络基础)
看完这篇,你不仅能跑通代码,还能彻底理解损失函数、参数更新、最小二乘法的数学本质。
1. 线性回归数学本质
模型公式(单特征简单线性回归):
y = θ₀ + θ₁x + ε
- θ₀:截距(bias)
- θ₁:斜率(weight)
- ε:误差(噪声)
损失函数(均方误差 MSE):
J(θ) = (1/(2m)) Σ (h(x⁽ⁱ⁾) – y⁽ⁱ⁾)²
目标:找到 θ 使 J(θ) 最小。
2. 闭式解(Normal Equation)—— 一步到位
公式:θ = (XᵀX)⁻¹ Xᵀ y
优点:精确、无需调学习率
缺点:特征多时矩阵求逆计算量大(O(n³))
3. 梯度下降 —— 迭代优化(神经网络核心思想)
参数更新规则:
θⱼ := θⱼ – α (∂J/∂θⱼ)
其中 α 是学习率。
4. 完整Python从零实现代码(直接复制运行)
import numpy as np
import matplotlib.pyplot as plt
# ==================== 1. 生成模拟数据 ====================
np.random.seed(42)
m = 100
X = 2 * np.random.rand(m, 1) # 特征(0~2之间)
y = 4 + 3 * X + np.random.randn(m, 1) # 真实值 + 噪声
# 绘制数据散点图
plt.figure(figsize=(8, 6))
plt.scatter(X, y, color='blue', alpha=0.6)
plt.xlabel('X 特征')
plt.ylabel('y 目标值')
plt.title('模拟线性回归数据')
plt.show()
# ==================== 2. 闭式解(Normal Equation) ====================
X_b = np.c_[np.ones((m, 1)), X] # 添加偏置列(全1)
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("闭式解最优参数 θ0(截距)= {:.4f}, θ1(斜率)= {:.4f}".format(theta_best[0][0], theta_best[1][0]))
# 预测新数据
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
y_predict = X_new_b.dot(theta_best)
print("预测值:", y_predict.flatten())
# 绘制拟合直线
plt.figure(figsize=(8, 6))
plt.scatter(X, y, color='blue', alpha=0.6)
plt.plot(X_new, y_predict, 'r-', linewidth=2, label='拟合直线')
plt.legend()
plt.title('闭式解线性回归拟合结果')
plt.show()
# ==================== 3. 梯度下降实现 ====================
def gradient_descent(X_b, y, theta, learning_rate=0.1, n_iterations=1000):
m = len(y)
theta_history = [theta.copy()]
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - learning_rate * gradients
theta_history.append(theta.copy())
return theta, theta_history
# 初始化参数
theta = np.random.randn(2, 1)
theta_gd, _ = gradient_descent(X_b, y, theta)
print("梯度下降最优参数 θ0= {:.4f}, θ1= {:.4f}".format(theta_gd[0][0], theta_gd[1][0]))
# 预测并绘图
y_predict_gd = X_new_b.dot(theta_gd)
plt.figure(figsize=(8, 6))
plt.scatter(X, y, color='blue', alpha=0.6)
plt.plot(X_new, y_predict_gd, 'g-', linewidth=2, label='梯度下降拟合')
plt.legend()
plt.title('梯度下降线性回归拟合结果')
plt.show()
运行结果示例(实际运行会得到接近真实值 4 和 3 的参数):
- 闭式解:θ₀ ≈ 4.2151,θ₁ ≈ 2.7701
- 梯度下降:结果几乎完全一致
5. 关键知识点总结
- 线性假设:数据大致呈线性关系
- 最小二乘法:让误差平方和最小
- 闭式解适合小数据集
- 梯度下降适合大数据集、在线学习、神经网络
- 过拟合:特征太多时需正则化(后续Lasso/Ridge)
- 评估指标:MSE、MAE、R²
6. 下一步进阶建议
- 实现多元线性回归(多个特征)
- 添加L2正则化(Ridge回归)
- 用sklearn验证结果(对比学习)
- 扩展到逻辑回归(分类任务)
想看多元线性回归完整代码、带损失函数下降曲线动画、还是结合真实数据集(房价预测)的实战版?
直接评论回复 “1”“2”“3”,我下一篇文章立刻奉上!
把这篇收藏 + 转发给正在学AI的小伙伴吧 —— 从零手写线性回归,是迈向神经网络和大模型的第一步!🚀
(所有代码基于NumPy 2.x + Matplotlib 3.8 在Python 3.12环境下实测通过,欢迎复制运行)