import numpy as np
import matplotlib.pyplot as plt
######### 产生的测试数据,不带有任何含义
x = np.random.normal(1, 1, [1000])
d = x ** 2 + x + np.random.normal(0, 0.3, [1000])
# x, d 是数据,样本点
plt.scatter(x, d)
plt.show()
######### 构建模型
def model(x, a, b, c):
"""构建模型:二次模型"""
return x * x * a + x * b + c
def L(x, d, a, b, c):
y = model(x, a, b, c)
return np.mean((y-d)**2)
def grad(x, d, a, b, c):
"""求导"""
y = model(x, a, b, c)
dLdy = 2 * (y - d)
dLda = np.mean(dLdy * x * x)
dLdb = np.mean(dLdy * x)
dLdc = np.mean(dLdy)
return dLda, dLdb, dLdc
######### 求解过程
a, b, c = 0, 0, 0 # 初始值,一般是随机数
eta = 0.01 # 学习率,超参数之一
for step in range(100):
ga, gb, gc = grad(x, d, a, b, c)
a = a - eta * ga
b = b - eta * gb
c = c - eta * gc
print(f"{step}, {(a,b,c)}, {L(x, d, a, b, c)}")
xplt = np.linspace(-2, 4, 1000)
yplt = model(xplt, a, b, c)
plt.scatter(x, d)
plt.plot(xplt, yplt, lw=2, c="r")
plt.show()
原始数据如下:
拟合结果如下: