使用python和numpy实现函数的拟合

2020-11-11  本文已影响0人  风中逍锋

给出一个数组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)

原始数据如图所示:


原始数据.png

得到的结果如图所示:


拟合结果.png

补充:

使用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)

原始数据画图:


原始数据

函数拟合结果:


函数拟合结果
上一篇 下一篇

猜你喜欢

热点阅读