给出一个数组x,然后基于一个二次函数,加上一些噪音数据得到另一组数据y。
将得到的数组x,y,构建一个机器学习模型,采用梯度下降法,通过多次迭代,学习到函数的系数。使用python和numpy进行编程,具体实现的代码如下:
import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt
np.random.seed(100)
x=np.linspace(-1,1,100).reshape(100,1)
y=3*np.power(x,2)+2+0.2*np.random.rand(x.size).reshape(100,1)
plt.scatter(x,y)
plt.show()
w1=np.random.rand(1,1)
b1=np.random.rand(1,1)
lr=0.001
for i in range(800):
y_pred=np.power(x,2)*w1+b1
loss=0.5*(y_pred-y)**2
loss=loss.sum()
grad_w=np.sum((y_pred-y)*np.power(x,2))
grad_b=np.sum((y_pred-y))
w1-=lr*grad_w
b1-=lr*grad_b
plt.plot(x,y_pred,'r-',label='predict')
plt.scatter(x,y,color='blue',marker='o',label='true')
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w1,b1)
原始数据如图所示:
得到的结果如图所示:
补充:
使用pytorch深度学习框架中的Antograd实现函数拟合
import torch as t
import torch
%matplotlib inline
from matplotlib import pyplot as plt
t.manual_seed(100)
dtype=t.float
x=t.unsqueeze(torch.linspace(-1,1,100),dim=1)
y=3*x.pow(2)+2+0.2*torch.rand(x.size())
plt.scatter(x.numpy(),y.numpy())
plt.show()
w=t.randn(1,1,dtype=dtype,requires_grad=True)
b=t.zeros(1,1,dtype=dtype,requires_grad=True)
lr=0.001
for ii in range(800):
y_pred=x.pow(2).mm(w)+b
loss=0.5*(y_pred-y)**2
loss=loss.sum()
loss.backward()
with t.no_grad():
w-=lr*w.grad
b-=lr*b.grad
w.grad.zero_()
b.grad.zero_()
plt.plot(x.numpy(),y_pred.detach().numpy(),'r-',label='predict')
plt.scatter(x.numpy(),y.numpy(),color='blue',marker='o',label='true')
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w,b)
原始数据画图:
函数拟合结果: