Python手把手教你实现线性回归

1. 手动实现线性回归

import torch
import numpy as np
import matplotlib.pyplot as plt

learning_rate = 0.01                         # 学习率,例如w = w + w'*learning_rate

# 1 准备数据,真实数据x与y  准备参数
x = torch.rand([500, 1])                     # 只要是rand就是几行几列的0或1的随机取值,除非用rndint指定范围取值的几行几列
y_true = 3 * x + 0.8                         # 假设真实值时已知的,然后我们并不知道真实值,所以通过拟合得到一个接近的w与b

# 2 通过最先设置的w与b参与第一次计算y_predict
w = torch.rand([1, 1], requires_grad=True)
b = torch.tensor(0, requires_grad=True, dtype=torch.float32)

# 3  通过循环上千次步数,每次步数都逼近一次w与b,也就是更新w,b参数,倒数是通过反向传播求导得到,
for i in range(3000):
    y_predict = torch.matmul(x, w) + b        # 矩阵相乘
    loss = (y_true - y_predict).pow(2).mean() # 计算loss函数,mean为均值

    if w.grad is not None:
        w.grad.data.zero_()                   # 对参数w与b的grad进行归零操作然后再反向传播
    if b.grad is not None:
        b.grad.data.zero_()

    loss.backward()                           # 反向传播,得到w的倒数
    w.data = w.data - learning_rate * w.grad  #更新参数
    b.data = b.data - learning_rate * b.grad
    print("w ,b ,loss", w.item(), b.item(), loss.item(),i)

#真实数据用点红色-scatter(),预测数据用直线蓝色-plot()
plt.figure(figsize=(20,8))
plt.scatter(x,y_true,5,'r')
y_predict = torch.matmul(x, w) + b
plt.plot(x,y_predict.detach().numpy())
plt.show()

运行结果展示:

 2. 线性回归进阶版

#线性回归进阶版
import torch
from torch import nn
from torch import optim
import numpy as np
from matplotlib import pyplot as plt

#1定义数据
x = torch.rand([500,1])
y_true = x*3 +0.8

#2定义模型
class Lr(nn.Module):
    def __init__(self,intput_dim,output_dim):   #输入输出数据维度
        super(Lr,self).__init__()
        self.linear = nn.Linear(intput_dim,output_dim)
    def forward(self,x):
        out = self.linear(x)
        return out

intput_dim = 1
output_dim = 1
lerning_rate = 0.01
#3实例化模型
model = Lr(intput_dim,output_dim)
criterion = nn.MSELoss()                           #损失函数
optimizer = optim.SGD(model.parameters(),lr=lerning_rate)  #优化器 lr就是学习率

#4训练模型
for i in range(4000):
    y_predict = model(x) #获得预测值
    loss = criterion(y_true,y_predict) #计算损失
    optimizer.zero_grad() #梯度归零
    loss.backward()      #计算梯度
    optimizer.step()     #更新参数,此刻进行循环,切参数已经进入到model中

#5模型评估
#或model.train(False)        #model.train(model=True) 表示设置模型为训练模式,可能会继续改变参数值
mode.eval()                  #mode.eval()或model.train(False) 表示设置模型为预测模式,不会继续改变参数值
plt.figure(figsize=(20,8))
plt.scatter(x,y_true,5,'r') #打印真实值,点类型
y_predict = model(x)
plt.plot(x,y_predict.detach().numpy()) #打印预测值,直线
plt.show()

    

运行结果展示: 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值