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

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

原始数据如图所示:

6cc7316d125f

原始数据.png

得到的结果如图所示:

6cc7316d125f

拟合结果.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)

原始数据画图:

6cc7316d125f

原始数据

函数拟合结果:

6cc7316d125f

函数拟合结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值