使用numpy拟合三角函数

在学习Pytorch之前,我们将首先使用numpy实现拟合sin函数。Numpy和Pytorch中的tensor(张量)异曲同工,它提供了一个n维数组对象,以及许多用于操作这些数组的函数,但是它不能完成图形计算,深度学习等的复杂计算任务。这里通过设置一个三次多项式,手动地实现向前和向后传播网络来拟合sin函数。话不多说直接上代码:

#导入相关模块
import numpy as np
import math

x = np.linspace(-math.pi, math.pi, 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):
    # 三次函数输出 y = a + b x + c x^2 + d x^3
    y_pred = a + b * x + c * x ** 2 + d * x ** 3

    #设置平方差为损失函数,每迭代100次就打印出loss值
    loss = np.square(y_pred - y).sum()
    if t % 100 == 0:
        print(t, loss)

    # 反向传播计算abcd的梯度
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x ** 2).sum()
    grad_d = (grad_y_pred * x ** 3).sum()

    #更新权重
    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')

以上代码可以在jupyter notebook运行,训练过程和结果如下:


result.png

可视化代码和效果如下,三次函数拟合效果还是有点差强人意:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8, 8))
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
y_pred = a + b*x + c*x**2 + d*x**3
plt.plot(x,y,linewidth = 0.8,label = "y")
plt.plot(x,y_pred,linewidth = 0.8,label = "y_pred")
plt.legend()
plt.show()
curve.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容