人工智能与机器学习:Python从零实现性回归模型

人工智能与机器学习:Python从零实现线性回归模型(2026最新版) 📈

大家好!线性回归(Linear Regression)是机器学习最基础、最重要的算法之一。它是监督学习中的回归任务,目标是找到一条直线(或超平面),让预测值与真实值误差最小。

今天我们完全不用scikit-learn,纯手写NumPy实现两种经典方法:

  1. 闭式解(Normal Equation) —— 一步求最优解
  2. 梯度下降(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. 下一步进阶建议

  1. 实现多元线性回归(多个特征)
  2. 添加L2正则化(Ridge回归)
  3. sklearn验证结果(对比学习)
  4. 扩展到逻辑回归(分类任务)

想看多元线性回归完整代码带损失函数下降曲线动画、还是结合真实数据集(房价预测)的实战版?

直接评论回复 “1”“2”“3”,我下一篇文章立刻奉上!

把这篇收藏 + 转发给正在学AI的小伙伴吧 —— 从零手写线性回归,是迈向神经网络和大模型的第一步!🚀

(所有代码基于NumPy 2.x + Matplotlib 3.8 在Python 3.12环境下实测通过,欢迎复制运行)

文章已创建 4992

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部