基于pytorch的线性回归预测

#f(x)=w*x+b x代表学历 f(x)代表收入
#找到合适的w和b,使得(f(x)-y)^2越小越好 即求解参数w和b

import torch
import torch.nn as nn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#打开文件
data=pd.read_csv(r'D:/pycharmworkspace/ISLR-master/Income1.csv')
plt.scatter(data.Education,data.Income)
plt.xlabel('Education')
plt.ylabel('Income')

#数据预处理
#values将数据以列表形式返回 reshape(-1,1)-1代表未指定 1代表指定1列 astype将数据类型转换成统一的float32类型
# torch.from_numpy将numpy数据转换成tensor数据
X=torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32))
Y=torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32))
#创建模型
#output = w*input + b   nn.Linear会随机初始化w和b 1个输入 1个输出
model = nn.Linear(1,1)
#损失函数:均方误差即预测值和真实值之间差的平方取均值
loss_fn = nn.MSELoss()
#优化:随机梯度下降算法 torch里的optim中有SGD优化算法
#model.parameters()是要优化model里的w和b参数 lr=0.0001是学习速率
opt = torch.optim.SGD(model.parameters(),lr=0.0001)
#对全部数据训练5000次
for epoch in range(5000):
    #zip把X,Y合成了两列
    for x,y in zip(X,Y):
        #利用模型进行预测
        y_pred = model(x)
        #进行误差计算
        loss = loss_fn(y,y_pred)
        #梯度会累积所以需要清零
        opt.zero_grad()
        #反向传播求解梯度
        loss.backward()
        #优化模型参数
        opt.step()
#显示训练好的w和b
print(model.weight,model.bias)
#取出预测结果的值并转换成numpy
plt.plot(X.numpy(),model(X).data.numpy(),c='red')
plt.show()

结果如图所示
基于pytorch的线性回归预测_第1张图片

# 分解写法 上述是用nn.Linear来构建模型 现在我要自己写
# requires_grad=True可以追踪张量
w = torch.randn(1, requires_grad=True)
b = torch.randn(1, requires_grad=True)
learning_rate = 0.0001
for epoch in range(5000):
    for x, y in zip(X, Y):
        #模型 matmul是矩阵乘法
        y_pred = torch.matmul(x,w)+b
        #计算误差
        loss = (y - y_pred).pow(2).mean()
        #w梯度置为0
        if not w.grad is None:
            w.grad.data.zero_
        #b梯度置为0
        if not b.grad is None:
            b.grad.data.zero_
        #反向传播求解梯度
        loss.backward()
        with torch.no_grad():
            w.data -= w.grad.data * learning_rate
            b.data -= b.grad.data * learning_rate
 

你可能感兴趣的:(pytorch)