关系拟合|线性回归 | 代码+详细注释(以Pytorc框架为例)

一、什么是线性回归?

要知道回归问题的输出是一个连续值,与分类的离散值不同,回归问题常见于现实的很多方面,例如比较知名的房屋价格预测等。线性回归的基本要素主要分为特征值目标值,例如以房屋价格预测这个问题,最终的价格取决于房屋状况,地段,市场等。如果我们将房屋状况,地段,市场这3个要素分别设为x1,x2,x3,那么最终的房屋价格(y)表达式:

y=x1w1+x2w2+x3w3+b

其中w1,w2,w3分别为房屋状况,地段,市场的权重值(weight),b为偏差值(bias)。

二、代码示例:

本次示例为手写数据集,主要是为了表达出线性回归的效果。

建议开始学习之前,对pytorch的相关函数的功能有些了解,虽然本文已全部注释相关代码的功能。

Pytorch开发文档|传送门

1.导入相关包(已经注明相关包的功能及作用)

import torch                    #pytorch
import torch.nn.functional as F #激励函数
import matplotlib.pyplot as plt #可视化

2.手写数据集(可自己随机定义)

x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1) #在[-1,1]区间内随机生成100个数,并按列排序
y=x.pow(2)+0.2*torch.rand(x.size()) #0.2*torch.rand(x.size())此操作主要是为了增加噪点,更加贴近真实数据

输出结果:x和y的数据集大小均为 100 x 1 的张量

3.建立神经网络

class Net(torch.nn.Module):    #继承torch的Module
  def __init__(self,feature,n_hiddens,output):     #可自定义初始化变量
    super(Net,self).__init__()                    
    self.hidden=torch.nn.Linear(feature,n_hiddens) #隐藏层
    self.predict=torch.nn.Linear(n_hiddens,output) #输出层 
  def forward(self,data):    #Module 中的 forward 功能
    data=F.relu(self.hidden(data)) # 激励函数(隐藏层的线性值)
    data=self.predict(data)        # 输出值
    return data

net=Net(feature=1,n_hiddens=10,output=1) #实例化
print(net) #查看net结构

"""
Net (
  (hidden): Linear (1 -> 10)
  (predict): Linear (10 -> 1)
)
"""

可以看见整个net结构,是由1个特征值映射到10层隐藏层中,再由10层隐藏层映射到1个目标值

4.训练网络

optimizer=torch.optim.SGD(net.parameters(),lr=0.2) #优化函数,传入net的所有参数,学习率设定为0.2

loss_func=torch.nn.MSELoss() #误差计算公式(本次采用均方差)

#plt.ion()
#plt.show()

#训练过程
for t in range(100):
  prediction=net(x)            #给net传入特征向量,此处会调用forward,输出预测值
  loss=loss_func(prediction,y) #计算预测值和真实值的误差   
  optimizer.zero_grad()        #清空上一步的残余更新值
  loss.backward()              #反向传播,计算参数更新值(简单的说就是梯度迭代)
  optimizer.step()             #将更新的值给到net的parameters()

  #可视化整个训练过程,感兴趣可留言  
  #if t % 5 == 0:
    #plt.cla()
    #print(prediction)
    #plt.scatter(x.data.numpy(), y.data.numpy())
    #plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
    #plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
    #plt.pause(0.1)

 训练结果:

 三.结语

本文的线性回归是基于pytorch的简洁实现,核心代码函数都已经被封装好了,具体想知道线性回归是如何从零开始实现,其中的核心函数是如何实现的,请参考我的另一篇博文。

线性回归的底层原理:https://blog.csdn.net/qq_37767529/article/details/123738113

本文全部代码:https://github.com/SallBryant/Nerual-Net-Simple-example/blob/main/Linear-simple.ipynb

分享自己所学的知识,向开源分享的人学习,他们是榜样,为大家学习知识降低了门槛。花时间来创作博客的动力来源于莫凡大佬的传教!链接:https://mofanpy.com/tutorials/machine-learning/torch/regression/ 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值