详解使用pytorch实现线性回归时,线性回归方程,损失函数,梯度下降优化算法之间的关系

article/2025/9/21 15:02:26

One-dimensional linear regression
给定数据集(点集),我们希望优化出一个好的函数f(x),使得f(xi)= wxi+b。有均方差损失函数可得E(w,b)。如下图:均方差损失函数得自变量是w和b
为什么要求出outputs(即f(xi))?因为梯度下降需要用到梯度,求梯度要求偏导(详见最优化之梯度下降法 计算公式及举例),求偏导必然要求函数值E(w,b),故必须求得f(xi)。

from __future__ import print_function
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from IPython import display# Hyper-parameters 超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据
input_size = 1         #输入维度
output_size = 1        #输出维度
num_epochs = 100       #迭代次数
learning_rate = 0.01   #学习率 : 决定了参数移动到最优值的速度快慢。#如果学习率过大,很可能会越过最优值;反而如果学习率过小,优化的效率可能过低,长时间算法无法收敛。#所以学习率对于算法性能的表现至关重要。#给出一些点(存在数组中)
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],[9.779], [6.182], [7.59], [2.167], [7.042],[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],[3.366], [2.596], [2.53], [1.221], [2.827],[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)# Convert numpy arrays to torch tensors
#将numpy的array转换为pytorch的tensor,他们都可以表示多维数组,
#区别在于numpy只能在CPU上运行,而pytorch可以在GPU运行。
# x_train = torch.from_numpy(x_train)
# y_train = torch.from_numpy(y_train)# Linear regression model
# model = nn.Linear(input_size, output_size)#定义一个 LinearRegression 类 继承 父类nn.Module
#self指的是类实例对象本身
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression,self).__init__()self.linear=nn.Linear(input_size,output_size)def forward(self,x):out=self.linear(x)return out# if torch.cuda.is_available():
#     model = LinearRegression().cuda()
# else:
#     model = LinearRegression()model = LinearRegression()# Loss and optimizer
#均方误差(Mean Square Error)函数计算的是预测值与真实值之差的期望值,
#可用于评价数据的变化程度,其得到的值越小,则说明模型的预测值具有越好的精确度。
#SGD:Stochastic Gradient Descent ,使用随机梯度下降的优化方法
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)# Train the model
# range返回一个序列的数,num_epochs = 100 ,所以循环100次
# 判断是否可以使用GPU计算
# 将tensor 转换为 variable。variable是神经网络里特有的一个概念,它提供了自动求导功能。
# variable 和 tensor 的区别在于,variable会放入一个计算图中,进行前向传播,反向传播,自动求导。
for epoch in range(num_epochs):inputs = torch.from_numpy(x_train)target = torch.from_numpy(y_train)# Forward passoutputs = model(inputs)             #前向传播,为什么要求出outputs?因为梯度下降需要用到梯度,求梯度要求偏导,求偏导要求函数值loss = criterion(outputs, target)   #损失函数,均方差函数E(w,b),自变量为 w,b# Backward and optimizeoptimizer.zero_grad()               #梯度归零,否则梯度会累加在一     起,造成结果不收敛loss.backward()                     #反向传播,均方差函数E(w,b),用梯度下降求出新的w,boptimizer.step()                    #更新参数w,b#每隔5个,输出损失函数的值看看,确保模型误差越来越小。
#每隔5个,绘制一张图像,图像中包括Original data(原始数据)和Fitted line(拟合线)if (epoch + 1) % 5 == 0:predicted = model(torch.from_numpy(x_train)).detach().numpy()plt.plot(x_train, y_train, 'ro', label='Original data')plt.plot(x_train, predicted, label='Fitted line')plt.xlim((0, 12))plt.ylim((0, 6))plt.legend()plt.savefig('1.png')plt.show()display.clear_output(wait=True)plt.pause(1)print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.show()# Save the model checkpoint (保存模型的参数,保存对象是模型的状态.P31)
torch.save(model.state_dict(), 'model.ckpt')

(DATA.csv)One-dimensional linear regression

from __future__ import print_function
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import csv
import pandas as pd
import time
from IPython import display
import torch.autograd.variable as variable# Hyper-parameters 超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据
input_size = 1         #输入维度
output_size = 1        #输出维度
num_epochs = 2000       #迭代次数
learning_rate = 0.0001   #学习率 : 决定了参数移动到最优值的速度快慢。#如果学习率过大,很可能会越过最优值;反而如果学习率过小,优化的效率可能过低,长时间算法无法收敛。#所以学习率对于算法性能的表现至关重要。#给出一些点(存在数组中)
with open('D:/PyCharm/untitled6/data.csv','r') as csvfile:reader = csv.reader(csvfile)x_data = [row[0]for row in reader]x_data = list(map(float, x_data))x_data_npy = np.asarray(x_data).reshape(-1,1)with open('D:/PyCharm/untitled6/data.csv','r') as csvfile1:reader = csv.reader(csvfile1)y_data = [row[1] for row in reader]y_data = list(map(float, y_data))y_data_npy = np.asarray(y_data).reshape(-1, 1)x_train=np.array(x_data_npy,dtype=np.float32)
y_train=np.array(y_data_npy,dtype=np.float32)# Convert numpy arrays to torch tensors
#将numpy的array转换为pytorch的tensor,他们都可以表示多维数组,
#区别在于numpy只能在CPU上运行,而pytorch可以在GPU运行。
# x_train = torch.from_numpy(x_train)
# y_train = torch.from_numpy(y_train)# Linear regression model
# model = nn.Linear(input_size, output_size)#定义一个 LinearRegression 类 继承 父类nn.Module
#self指的是类实例对象本身
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression,self).__init__()self.linear=nn.Linear(input_size,output_size)def forward(self,x):out=self.linear(x)return out# if torch.cuda.is_available():
#     model = LinearRegression().cuda()
# else:
#     model = LinearRegression()model = LinearRegression()# Loss and optimizer
#均方误差(Mean Square Error)函数计算的是预测值与真实值之差的期望值,
#可用于评价数据的变化程度,其得到的值越小,则说明模型的预测值具有越好的精确度。
#SGD:Stochastic Gradient Descent ,使用随机梯度下降的优化方法
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)# Train the model
# range返回一个序列的数,num_epochs = 100 ,所以循环100次
# 判断是否可以使用GPU计算
# 将tensor 转换为 variable。variable是神经网络里特有的一个概念,它提供了自动求导功能。
# variable 和 tensor 的区别在于,variable会放入一个计算图中,进行前向传播,反向传播,自动求导。
for epoch in range(num_epochs):# if torch.cuda.is_available():#     inputs = torch.from_numpy(x_train).cuda()#     target = torch.from_numpy(y_train).cuda()# else:#     inputs = torch.from_numpy(x_train)#     target = torch.from_numpy(y_train)inputs = torch.from_numpy(x_train)target = torch.from_numpy(y_train)# Forward passoutputs = model(inputs)             #前向传播loss = criterion(outputs, target)   #损失函数# Backward and optimizeoptimizer.zero_grad()               #梯度归零,否则梯度会累加在一起,造成结果不收敛loss.backward()                     #反向传播optimizer.step()                    #更新参数#每隔5个,输出损失函数的值看看,确保模型误差越来越小。
#每隔5个,绘制一张图像,图像中包括Original data(原始数据)和Fitted line(拟合线)if (epoch + 1) % 100 == 0:predicted = model(torch.from_numpy(x_train)).detach().numpy()plt.plot(x_train, y_train, 'ro', label='Original data')plt.plot(x_train, predicted, label='Fitted line')plt.xlim((0, 100))plt.ylim((0, 150))plt.legend()plt.savefig('1.png')plt.show()display.clear_output(wait=True)plt.pause(1)print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, loss.item()))# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.show()# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')

polynomial regression

from __future__ import print_function
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as pltdef make_features(x):# 将原来长度为3的tensor数组,变成大小为(3,1)的矩阵(列向量)x = x.unsqueeze(1)#range(1,4),0123,从1开始到3.#torch.cat((A,B), 1),第二个参数,0代表行(竖着拼),1代表列(横着拼)return torch.cat([x ** i for i in range(1,4)], 1)#将原来长度为3的tensor数组,变成大小为(3,1)的矩阵(列向量)
w_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])def f(x):return x.mm(w_target) + b_target[0] #x.mm()是作矩阵乘法def get_batch(batch_size=32):random = torch.randn(batch_size)  #生成32个随机数x = make_features(random)   #首先生成(32,1)的矩阵,然后拼接为(32,3)的矩阵'''Compute the actual results'''y = f(x)   #矩阵相乘,即(32,3)的矩阵乘以(3,1)的列向量,得到y是(32,1)的列向量return np.array(x), np.array(y)class poly_model(nn.Module):def __init__(self):super(poly_model, self).__init__()self.poly = nn.Linear(3, 1) #因为每一个神经元其实模拟的是wx+b的计算过程,无法模拟幂运算,#所以显然我们需要将x,x的平方,x的三次方,所以输入变为3.def forward(self, x):out = self.poly(x)return outmodel = poly_model()criterion = nn.MSELoss() #均方误差损失函数
optimizer = torch.optim.SGD(model.parameters(), lr = 1e-3) #随机梯度下降优化方法epoch = 0
while True:batch_x,batch_y = get_batch()output = model(torch.from_numpy(batch_x))loss = criterion(output,torch.from_numpy(batch_y))print_loss = loss.item()optimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 50 == 0:print('Epoch [{}], Loss: {:.4f}'.format(epoch + 1,loss.item()))epoch+=1if print_loss < 1e-3:breakprint('Epoch [{}], Loss: {:.4f}'.format(epoch + 1, loss.item()))#%% 绘制真值和拟合结果曲线
#np.linspace(-1,1,30)  起始点-1,结束点1,取30个元素
x = np.linspace(-1,1,30)
x_sample = torch.from_numpy(x)
x_sample = x_sample.unsqueeze(1)  #转换为列向量
x_sample = torch.cat([x_sample ** i for i in range(1,4)] , 1)  #3个列向量拼接为一个(3,3)矩阵
x_sample = x_sample.float()
y_actural = f(x_sample) #获得真值
y_predict = model(x_sample) #获得拟合结果
plt.plot(x,y_actural.numpy(),'ro',x,y_predict.data.cpu().numpy())
plt.legend(['real point','fit'])
plt.show()# Save the model checkpoint(保存模型的参数,保存对象是模型的状态.P31)
torch.save(model.state_dict(), 'model.ckpt')

http://chatgpt.dhexx.cn/article/9niqw1J8.shtml

相关文章

【Matlab学习手记】多元非线性回归

介绍两种方法做多元非线性回归&#xff1a;lsqcurvefit、Adagrad 法。 lsqcurvefit是Matlab提供的内置函数&#xff0c;用于基于最小二乘的曲线拟合问题&#xff1b;Adagrad是一种基于梯度的迭代方法&#xff0c;特点在步长不固定&#xff0c;随着迭代次数变化。 clear; clc;…

线性回归原理----简单线性回归、多元线性回归

回归分析是用来评估变量之间关系的统计过程。用来解释自变量X与因变量Y的关系。即当自变量X发生改变时&#xff0c;因变量Y会如何发生改变。 线性回归是回归分析的一种&#xff0c;评估的自变量X与因变量Y之间是一种线性关系&#xff0c;当只有一个自变量时&#xff0c;成为简…

线性回归算法 php实现,PHP实现多元线性回归模拟曲线算法步骤详解

这次给大家带来PHP实现多元线性回归模拟曲线算法步骤详解&#xff0c;PHP实现多元线性回归模拟曲线算法的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。 多元线性回归模型&#xff1a; y b1x1 b2x2 b3x3 ...... bnxn; 我们根据一组数据&#xff1a…

统计学考研笔记:回归方程计算题

题1: 利用某公司的年销售额Y与个人支配收入&#xff0c;商品价格&#xff0c;广告费的历年统计数据&#xff0c;研究Y关于&#xff0c;&#xff0c;的回归关系&#xff0c;得到回归方程为: Y 3573.879 6.687-25.051 9.316 (1981.741) (1.192) (24.515) (2.73…

一元一次线性回归详解

一元一次线性回归 作为机器学习的入门课程&#xff0c;线性回归是我们必须要学习的第一个算法。今天我们就来详细的讲解一下线性回归。 在讲解之前&#xff0c;我们先来解释以下几个问题。 可为线性&#xff1f;线性是指自变量x和因变量y之间是线性的关系&#xff0c;即图像…

线性回归之梯度下降详解

在了解梯度下降&#xff08;Gradient Descent&#xff09;之前&#xff0c;我们先要知道有关线性回归的基本知识&#xff0c;这样可以进一步的加深对梯度下降的理解&#xff0c;当然梯度下降&#xff08;Gradient Descent&#xff09;并不单单只能进行回归预测&#xff0c;它还…

【机器学习】线性回归——最小二乘法(理论+图解+公式推导)

&#x1f320; 『精品学习专栏导航帖』 &#x1f433;最适合入门的100个深度学习实战项目&#x1f433;&#x1f419;【PyTorch深度学习项目实战100例目录】项目详解 数据集 完整源码&#x1f419;&#x1f436;【机器学习入门项目10例目录】项目详解 数据集 完整源码&…

线性回归例题解析

前往我的主页以获得更好的阅读体验线性回归例题解析 - DearXuan的主页https://blog.dearxuan.com/2022/03/23/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E4%BE%8B%E9%A2%98%E8%A7%A3%E6%9E%90/ 例题 调查某市出租车使用年限和该年支出维修费用&#xff08;万元&#xff09;&#…

windows计算机管理快捷键,windows系统常见快捷键大全

熟练电脑键盘快捷键有助于提供办公效率&#xff0c;但是对于一些职场的电脑小白来说&#xff0c;什么都不会&#xff0c;几分钟的工作需要几个小时来完成&#xff0c;如何在职场上立足呢&#xff1f;下面小编给您整理了常见的windows快捷键大全&#xff0c;让你的高效办公&…

桌面计算机休眠快捷键,电脑休眠唤醒快捷键

设置电脑休眠唤醒快捷键的方法 1、在电脑桌面空白处点击右键。 2、在新建列表中选择新建快捷方式。 3、在键入对象的位置栏中&#xff0c;输入rundll32.exe? powrprof.dll,SetSuspendState Hibernate。创建一个休眠命令。 4、把快捷方式的名字改为休眠即可。 设置电脑休眠键的…

修改PyCharm的快捷键

有的电脑系统中&#xff0c;按下一些PyCharm组合键可能会无法起作用&#xff0c;这是因为可能和当前系统的其他软件快捷键发生了冲突。 大家有需要可以更改下默认的快捷键&#xff0c;下面以Ctrl空格的自动代码补齐快捷键为例&#xff0c;方法是选择File——Settings&#xff…

调整计算机屏幕亮度快捷键,笔记本亮度调节的快捷键

现在小伙伴们使用电脑的时间越来越多&#xff0c;长时间使用电脑&#xff0c;对我们的眼睛伤害很大。建议大家使用一两个小时的电脑就要停下来休息10分钟&#xff0c;眺望远方。除此之外&#xff0c;电脑屏幕亮度的控制也是很有必要的。但是笔记本亮度调节的快捷键怎么使用呢&a…

立创eda快捷键

默认的快捷键列表如下。共用快捷键文档类型快捷键功能所有Space(空格键)旋转所选图形所有鼠标右键长按右键拖动画布&#xff1b;操作过程中按一下右键释放操作’所有Left向左滚动或左移所选图形所有Right向右滚动或右移所选图形所有Up向上滚动或上移所选图形所有Down向下滚动或…

Pycharm 常用快捷键 for Mac

格式化代码&#xff1a; command option L多行合并一行&#xff1a;control shift J快速注释/取消注释&#xff1a;crtl /鼠标指针上方插入空行&#xff1a;command option enter鼠标指针下方插入空行&#xff1a;shift enter上下移动选中代码&#xff1a; shift opti…

常用Windows快捷键大全

0. 简要 要将电脑玩的溜&#xff0c;快捷键是必须要掌握的技能&#xff0c;本文汇总了一些常用的快捷键&#xff0c;相信加以练习&#xff0c;一定能提高你的工作效率。 笔者将常用快捷键分为四个系列&#xff0c;如下所示&#xff1a; Win 系列Ctrl 系列Alt 系列F 系列 本…

vscode 快捷键 删除当前行

vscode 快捷键删除当前行默认的是 ctrlshiftk 但是会与搜狗输入法的快捷键冲突 解决办法 1.更换其他输入法 2.修改搜狗输入法的快捷键 3.修改vscode 快捷键 &#xff0c;改成自己舒服的 修改vscode快捷键方法

计算机删除行快捷键,删除快捷键是什么?电脑删除快捷键有哪些?

在使用电脑的时候&#xff0c;除了鼠标之外&#xff0c;就是键盘最常用了。而在我们的日常操作中&#xff0c;为了操作更加方便&#xff0c;就有了快捷键。快捷键又称热键&#xff0c;指可以通过某些特定的按键和按键顺序及其组合来完成一项操作&#xff0c;多和Ctrl、Shift、A…

如何理解矩阵特征值

&#xff08;下面的回答只涉及实数范围&#xff09;。 关于特征值、特征向量可以讲的确实很多&#xff0c;我这里希望可以给大家建立一个直观的印象。 先给一个简短的回答&#xff0c;如果把矩阵看作是运动&#xff0c;对于运动而言&#xff0c;最重要的当然就是运动的速度和方…

矩阵特征值的求解例子

请点击上面公众号&#xff0c;免费订阅。  《实例》阐述算法&#xff0c;通俗易懂&#xff0c;助您对算法的理解达到一个新高度。包含但不限于&#xff1a;经典算法&#xff0c;机器学习&#xff0c;深度学习&#xff0c;LeetCode 题解&#xff0c;Kaggle 实战。期待您的到来&…

矩阵和特征值的本质

理解矩阵和特征向量的本质 原文地址 最近复习矩阵论中&#xff0c;又是一堆定理和证明突然发现学了这么常时间的矩阵论、线性代数&#xff0c;记住的只是一堆莫名其妙的定理而已&#xff0c;一些本质的东西都没有搞清楚。 比如&#xff0c;为什么要有矩阵&#xff0c;它仅仅是…