张量应用之线性回归

线性回归(Linear Regression)

线性回归是分析一个变量与另一(多)个变量之前关系的方法

  • 因变量:y
  • 自变量:x
  • 关系:线性

     y = wx + b

分析:求解w,b

求解步骤:

1. 确定模型  Modle:

    y = wx + b

2. 选择损失函数MSE

    \frac{1}{m} \sum _{i=1}^{m}\textrm{}\left ( y_{i} - \hat{ y_{i}}\right )^{2}

3. 求解梯度并更新w,b,(LR为学习率)

   w = w - LR * w.grad

   b = b - LR * b.grad

   代码实现,一些代码已经给出注释了,可以参考一下,有些代码可以不用加。

import torch
import matplotlib.pyplot as plt
torch.manual_seed(10) #设置一个随机种子,以便重复实验结果
lr = 0.05 #设置学习率为0.05

#创建训练数据i
x = torch.rand(20, 1) * 10 #创建一个(20,1)的张量,其中每一个数据都是一个x
print(x)
y = 2*x + (5 + torch.randn(20, 1)) #加入高斯白噪音

#构建线性回归参数,初始化w,b
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)

for item in range(1000):

    #前向传播
    wx = torch.mul(w, x)

    y_pred = torch.add(wx, b)

    #计算MSE loss
    loss = (0.5 * (y - y_pred) ** 2).mean()#系数0.5是为消掉求导过程中的系数2,不加也没没什么关系

    #反向传播
    loss.backward()

    #更新参数
    w.data.sub_(lr * w.grad)  #w = w - lr*w.grad
    b.data.sub_(lr * b.grad)  # b = b - lr*b.grad

    # 清零张量的梯度   20191015增加
    w.grad.zero_()
    b.grad.zero_()

    #绘图
    if item % 20 == 0:

        plt.cla() #清楚之前的曲线,防止重叠
        plt.scatter(x.data.numpy(), y.data.numpy())#绘制散点图
        plt.plot(x.data.numpy(), y_pred.data.numpy(),'r-',lw = 5)
        plt.text(2,20,'Loss = %.4f' % loss.data.numpy(),fontdict={'size':20,'color': 'red'})
        plt.xlim=(1.5, 10)
        plt.ylim = (8, 28)
        plt.title("item: {}\nw: {} b: {}".format(item,w.data.numpy(),b.data.numpy()))
        plt.pause(0.5)


        if loss.data.numpy() < 1:
            break
    plt.show()

运行结果如下,由于设定loss<1时停止迭代,可以看到loss到了0.9837时就停止了

在这里我提一下torch.manual_seed()的作用。

在我们进行需要生成随机数据的实验中,每次实验都需要生成数据。设置随机种子是为了确保每次都能够生成固定相同的随机数,这就使得每次实验结果显示一致了,这样可以有利于对实验的比较和改进。使得每次运行该py文件的时候都能生成相同的随机数。

用代码示例一下:

torch.manual_seed(3)
t = torch.rand(5,1)
w = torch.randn((1))
b = torch.rand((1))
print("t:{}\nw:{}\nb:{}\n".format(t,w,b))

结果如下:

当我把种子数设置成其他数时

torch.manual_seed(5)

结果如下:

现在我再次设置成原来的随机种子数3,运行可以看到生成的随机数还是和第一次一样的,这样的话,我们以后想要对模型方法进行改进或创新的话可以避免由于生成的随机参数不相同带来的负面影响。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leo&&Eva

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值