热身:numpy

5 阅读2分钟

热身:numpy

创建时间:2020年12月03日 | 最后更新:2025年9月29日 | 最后验证:2024年11月05日

本示例实现一个三阶多项式模型,通过最小化欧式距离平方和,拟合区间 ([-π, π]) 内的正弦函数 (y=\sin(x))。

该实现完全基于 numpy 手动完成:

  • 前向传播计算预测值
  • 损失函数计算误差
  • 反向传播计算梯度

numpy 数组是通用的 n 维数组结构,不具备深度学习相关特性(如梯度、计算图),仅用于通用数值计算。

运行输出

99 1521.5331709235904
199 1055.6860659741556
299 734.025808775661
399 511.6903321504441
499 357.85088512326877
599 251.2982670697485
699 177.42500692574205
799 126.15943179375957
899 90.54975279396302
999 65.79253860993082
1099 48.565346525778224
1199 36.567770779591754
1299 28.205467913747064
1399 22.372377901115023
1499 18.300461749181125
1599 15.455913322803369
1699 13.46739650684751
1799 12.076375015597545
1899 11.102699099018622
1999 10.420739527101187
Result: y = 0.039703970632201595 + 0.8703698909474221 x + -0.006849595610977857 x^2 + -0.09526900241783073 x^3

完整代码

import numpy as np
import math

# 创建输入和输出数据
x = np.linspace(-math.pi, math.pi, 2000)  # 在[-π, π]区间生成2000个均匀分布的点
y = np.sin(x)                             # 生成正弦函数的真实值

# 随机初始化权重参数
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()

learning_rate = 1e-6  # 学习率
for t in range(2000):  # 迭代2000次
    # 前向传播:计算预测值y
    # 多项式公式:y = a + b*x + c*x² + d*x³
    y_pred = a + b * x + c * x ** 2 + d * x ** 3

    # 计算并打印损失(每100次迭代打印一次)
    # 损失函数:均方误差和(所有样本的预测值与真实值差的平方和)
    loss = np.square(y_pred - y).sum()
    if t % 100 == 99:
        print(t, loss)

    # 反向传播:计算a、b、c、d关于损失的梯度
    grad_y_pred = 2.0 * (y_pred - y)  # 损失对y_pred的梯度
    grad_a = grad_y_pred.sum()        # 损失对a的梯度(y_pred对a的偏导为1)
    grad_b = (grad_y_pred * x).sum()  # 损失对b的梯度(y_pred对b的偏导为x)
    grad_c = (grad_y_pred * x ** 2).sum()  # 损失对c的梯度(y_pred对c的偏导为x²)
    grad_d = (grad_y_pred * x ** 3).sum()  # 损失对d的梯度(y_pred对d的偏导为x³)

    # 梯度下降更新权重
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d

# 打印最终拟合的多项式公式
print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

脚本运行耗时

0 分 0.232 秒

总结

  1. 该示例通过 numpy 纯手动实现了三阶多项式拟合正弦函数,核心是手动推导并计算每个参数的梯度,再用梯度下降更新参数;
  2. 损失函数采用均方误差和,梯度计算严格遵循微积分链式法则,是深度学习最基础的梯度下降实现方式;
  3. numpy 仅提供数值计算能力,无自动微分、计算图等深度学习特性,所有反向传播逻辑需开发者手动实现。