赞
踩
还是之前的那个例子,之前是抽象的进行讲解,本节拆分细讲!
线性回归细讲
#!/usr/bin/python3.6 # -*- coding: utf-8 -*- # @Time : 2021/1/6 11:04 # @Author : ptg # @Email : zhxwhchina@163.com # @File : 线性回归分解写法.py # @Software: PyCharm # 导入库 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd from torch import nn data = pd.read_csv('dataset.csv') # print(data) # 如果直接这样使用,返回的是andas.core.series.Series格式 X = data.Education # 所以需要使用array类型,在类型后加上一个values即可转化成array类型 X = data.Education.values.reshape(-1,1).astype(np.float32) """ 数据预处理 """ # 通过输入可以将以上的numpy转化成torch X = torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) print(X) Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32)) # 需要跟踪这个变量 w = torch.randn(1,requires_grad=True) b = torch.zeros(1,requires_grad=True) # 模型公式: w*input(x) + b # 创建模型 learning_rate = 0.0001 for epoch in range(5000): for x,y in zip(X,Y): y_pred = torch.matmul(x,w)+b loss = (y - y_pred).pow(2).mean() #差的平方求均值 # 下面的操作需要进行赋值零操作,不然梯度会累加 if not w.grad is None: w.grad.data.zero_()#就地改为0 if not w.grad is None: b.grad.data.zero_()#就地改为0 loss.backward() with torch.no_grad(): w.data -= w.grad.data*learning_rate b.data -= b.grad.data*learning_rate print("w",w) print("b",b) plt.scatter(data.Education,data.Income) plt.plot(X.numpy(),(X*w + b).data.numpy(),c='r') plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。