线性回归(Linear Regression)
线性回归是分析一个变量与另一(多)个变量之前关系的方法
- 因变量:y
- 自变量:x
- 关系:线性
分析:求解w,b
求解步骤:
1. 确定模型 Modle:
2. 选择损失函数MSE:
3. 求解梯度并更新w,b,(LR为学习率)
代码实现,一些代码已经给出注释了,可以参考一下,有些代码可以不用加。
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,运行可以看到生成的随机数还是和第一次一样的,这样的话,我们以后想要对模型方法进行改进或创新的话可以避免由于生成的随机参数不相同带来的负面影响。