python怎样用pytorch做多项式回归?
Admin 2021-05-19 群英技术资讯 1321 次浏览
pytorch是一个python优先的深度学习框架,用于自然语言应用程序,为了让大家了解pytorch的使用,下面给大家分享使用pytorch实现多项式回归的方法,有这方面学习需要的朋友可以参考学习。
一元线性回归模型虽然能拟合出一条直线,但精度依然欠佳,拟合的直线并不能穿过每个点,对于复杂的拟合任务需要多项式回归拟合,提高精度。多项式回归拟合就是将特征的次数提高,线性回归的次数使一次的,实际我们可以使用二次、三次、四次甚至更高的次数进行拟合。由于模型的复杂度增加会带来过拟合的风险,因此需要采取正则化损失的方式减少过拟合,提高模型泛化能力。希望大家可以自己动手,通过一些小的训练掌握pytorch(案例中有些观察数据格式的代码,大家可以自己注释掉)
# 相较于一元线性回归模型,多项式回归可以很好的提高拟合精度,但要注意过拟合风险
# 多项式回归方程 f(x) = -1.13x-2.14x^2+3.12x^3-0.01x^4+0.512
import torch
import matplotlib.pyplot as plt
import numpy as np
# 数据准备(测试数据)
x = torch.linspace(-2,2,50)
print(x.shape)
y = -1.13*x - 2.14*torch.pow(x,2) + 3.15*torch.pow(x,3) - 0.01*torch.pow(x,4) + 0.512
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
# 此时输入维度为4维
# 为了拼接输入数据,需要编写辅助数据,输入标量x,使其变为矩阵,使用torch.cat拼接
def features(x): # 生成矩阵
# [x,x^2,x^3,x^4]
x = x.unsqueeze(1)
print(x.shape)
return torch.cat([x ** i for i in range(1,5)], 1)
result = features(x)
print(result.shape)
# 目标公式用于计算输入特征对应的标准输出
# 目标公式的权重如下
x_weight = torch.Tensor([-1.13,-2.14,3.15,-0.01]).unsqueeze(1)
b = torch.Tensor([0.512])
# 得到x数据对应的标准输出
def target(x):
return x.mm(x_weight) + b.item()
# 新建一个随机生成输入数据和输出数据的函数,用于生成训练数据
def get_batch_data(batch_size):
# 生成batch_size个随机的x
batch_x = torch.randn(batch_size)
# 对于每个x要生成一个矩阵
features_x = features(batch_x)
target_y = target(features_x)
return features_x,target_y
# 创建模型
class PolynomialRegression(torch.nn.Module):
def __init__(self):
super(PolynomialRegression, self).__init__()
# 输入四维度 输出一维度
self.poly = torch.nn.Linear(4,1)
def forward(self, x):
return self.poly(x)
# 开始训练模型
epochs = 10000
batch_size = 32
model = PolynomialRegression()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),0.001)
for epoch in range(epochs):
print("{}/{}".format(epoch+1,epochs))
batch_x,batch_y = get_batch_data(batch_size)
out = model(batch_x)
loss = criterion(out,batch_y)
optimizer.zero_grad()
loss.backward()
# 更新梯度
optimizer.step()
if (epoch % 100 == 0):
print("Epoch:[{}/{}],loss:{:.6f}".format(epoch,epochs,loss.item()))
if (epoch % 1000 == 0):
predict = model(features(x))
print(x.shape)
print(predict.shape)
print(predict.squeeze(1).shape)
plt.plot(x.data.numpy(),predict.squeeze(1).data.numpy(),"r")
loss = criterion(predict,y)
plt.title("Loss:{:.4f}".format(loss.item()))
plt.xlabel("X")
plt.ylabel("Y")
plt.scatter(x,y)
plt.show()
拟合结果:




以上就是关于pytorch实现多项式回归的介绍,上述代码仅供大家参考学习,希望对大家学习和理解pytorch的使用有帮助,更多使用pytorch的内容可以关注其他文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章我们来了解python序列的相关内容,下文将给大家介绍python序列的入门知识,包括序列的概念,序列的类型,序列的方法及特性等等,对新手学习和理解python序列有帮助,大家可以了解看看吗,接下来就跟随小编一起学习一下吧!
今天给大家分享的是关于python实现K折交叉验证的内容,本文有实例和详细注释供大家参考,对大家理解python实现K折交叉验证有一定的帮助,接下来跟随小编一起看看吧。
这篇文章主要为大家介绍了Python内建类型int源码学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
Python内置函数-eval() 函数。 eval() 函数用来执行一个字符串表达式,并返回表达式的值。
在Scala中,集合有三大类:List、Set以及Map,所有的集合都扩展自Iterable特质。Scala集合分为可变的(mutable)和不可变(immutable)的集合。其中,可变集合可以在适当的地方被更新或扩展,意味着可以对集合进行修改、添加、移除元素;不可变集合类,相比之下,初始化后就永远不会改变。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008