pytorch + python实现一维线性回归

原理:给定数据集 ,线性回归希望能够优 化出一个好的函数 f(x) 使得能够与 yi 尽可能接近。

如何才能学习到参数w和b呢?很简单,只需要确定如何衡量 f(x) 与y之间的差 别,可以用它们之间的距离差异来衡量误差,取平方是因为距离有正有负,我们希望能够将它们全部变成正的。这也就是著名的均方误差,要做的事情就是希望能够找到w*和b*使得

均方误差非常直观,也有着很好的几何意义,对应了常用的欧几里得距离,基于均方误差最小化来进行模型求解的办法也称为"最小二乘法'。

求解办法其实非常简单,如果求这个连续函数的最小值,那么只需要求它的偏导 数,让它的偏导数等于0来估计它的参数,即:

通过求解式 (3.6) 和式 (3.7) ,我们就可以得到:J 的最优解:

代码:

import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from torch.autograd import Variable

#数据集
x_train = np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],
                    [9.779],[6.182],[7.59],[2.167],[7.042],
                    [10.791],[5.313],[7.997],[3.11]],dtype=np.float32)
y_train = np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],
                    [3.366],[2.596],[2.53],[1.221],[2.827],
                   [3.465],[1.65],[2.904],[1.3]],dtype=np.float32)
plt.plot(x_train,y_train,'ro',label='Original data')
plt.show()

x_train = torch.from_numpy(x_train)#将x_train转换为tensor型
y_train = torch.from_numpy(y_train)

#定义模型
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression,self).__init__()
        self.linear = nn.Linear(1,1) #输入和输出都是一维的

    def forward(self,x):
        out = self.linear(x)
        return out

if torch.cuda.is_available():
    model = LinearRegression().cuda()#GPU上运行
else:
    model = LinearRegression()#CPU上运行

#定义损失函数和优化函数
criterion = nn.MSELoss()#用均方误差作为优化函数
optimizer = optim.SGD(model.parameters(), lr = 1e-3)#用梯度下降法进行优化

#训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    if torch.cuda.is_available():
        inputs = Variable(x_train).cuda()
        target = Variable(y_train).cuda()
    else:
        inputs = Variable(x_train)#将x_train转为Variable
        target = Variable(y_train)

    #forward
    out = model(inputs)#得到网络传播的结果
    loss = criterion(out,target)#得到损失函数
    #backward
    optimizer.zero_grad()#将梯度归零
    loss.backward()#反向传播
    optimizer.step()#更新参数

    #每20次将损失函数的值打印出来,以确保模型的误差越来越小
    if (epoch+1) % 20 == 0:
        print ('Epoch[{}/{}], loss:{:.6E}'
            .format(epoch+1,num_epochs,loss.item()))
#预测结果
model.eval()#将模型变成测试模式,Dropout和BatchNormalization在训练和测试时是不一样需转换
predict = model(Variable(x_train))#将测试数据放入网络做向前传播
predict = predict.data.numpy()
plt.plot(x_train.numpy(),y_train.numpy(),'ro',label='Original data')#画出结果
plt.plot(x_train.numpy(),predict,label='Fitting Line')
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值