PyTorch实现Logistic Regression

本文通过两种方式使用PyTorch实现Logistic回归:一是基础实现,包括手动计算梯度和更新参数;二是利用PyTorch的高级特性,如torch.nn模块和自动优化器,构建和训练模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.PyTorch基础实现Logistic regression

import torch
from torch.autograd import Variable
 
torch.manual_seed(2)
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0], [4.0]]))
y_data = Variable(torch.Tensor([[0.0], [0.0], [1.0], [1.0]]))
 
# 初始化
w = Variable(torch.Tensor([-1]), requires_grad=True)
b = Variable(torch.Tensor([0]), requires_grad=True)
 
epochs = 100
costs = []
lr = 0.1
 
print('before training,predict of x = 1.5 is :')
print('Y_pred = ', float(w.data * 1.5 + b.data > 0))

 
# 模型训练
for epoch in range(epochs):
    # 计算梯度
    A = 1 / (1 + torch.exp(-(w * x_data + b)))
    # 逻辑损失函数
    J = - torch.mean(y_data * torch.log(A) + (1 - y_data) * torch.log(1 - A))
    # 自动反向传播
    J.backward()
 
    # 参数更新
    w.data = w.data - lr * w.grad.data
    w.grad.data.zero_()
    b.data = b.data - lr * b.grad.data
    b.grad.data.zero_()
 
# 模型测试
print('after trainning,predict of x = 1.5 is :')
print('Y_pred = ', float(w.data * 1.5 + b.data > 0))
print(w.data, b.data)

2. 用PyTorch类实现Logistic regression,torch.nn.module写网络结构

import torch
# from torch import nn
# 第一创建数据
from torch.autograd import Variable  # 导入Variable函数进行自动求导,有了Variable PyTorch才能实现自动求导功能
 
torch.manual_seed(2)
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0], [4.0]]))
y_data = Variable(torch.Tensor([[0.0], [0.0], [1.0], [1.0]]))
 
 
# 定义网络模型
# 先建立一个基类Model,都是从父类torch.nn.Module中继承过来,PyTorch写网络的固定写法
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()  # 初始父类
        self.linear = torch.nn.Linear(1, 1)  # 输入维度和输出维度都为1
 
    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred
 
model = Model()  # 实例化
 
# 定义Loss和优化方法
criterion = torch.nn.BCEWithLogitsLoss()  # 损失函数,封装好的逻辑损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 进行优化梯度下降
# before training
hour_var = Variable(torch.Tensor([[2.5]]))
y_pred = model(hour_var)
print("predict (before training) given", 4, "is", float(model(hour_var).data[0][0] > 0.5))
 
epochs = 40
for epoch in range(epochs):
    # 计算grads and cost
    y_pred = model(x_data)  # x_data 输入数据进入模型中
    loss = criterion(y_pred, y_data)
    # print(loss.data)
    optimizer.zero_grad()  # 梯度清零
    loss.backward()  # 反向传播
    optimizer.step()  # 优化迭代
 
# after trining
hour_var = Variable(torch.Tensor([[4.0]]))
y_pred = model(hour_var)  # 预测结果
print("predict (after training) given", 4, "is", float(model(hour_var).data[0][0] > 0.5))

### 回答1: PyTorch实现Logistic回归的步骤如下: 1. 导入必要的库和数据集。 2. 定义模型:Logistic回归模型通常由一个线性层和一个sigmoid函数组成。 3. 定义损失函数:Logistic回归使用二元交叉熵作为损失函数。 4. 定义优化器:使用随机梯度下降(SGD)作为优化器。 5. 训练模型:使用训练数据集训练模型,并在每个epoch后计算损失函数和准确率。 6. 测试模型:使用测试数据集测试模型,并计算准确率。 7. 可视化结果:使用matplotlib库可视化训练和测试的损失函数和准确率。 下面是一个简单的PyTorch实现Logistic回归的示例代码: ``` import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # 导入数据集 from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X = data.data y = data.target # 将数据转换为张量 X = torch.tensor(X, dtype=torch.float32) y = torch.tensor(y, dtype=torch.float32) # 定义模型 class LogisticRegression(nn.Module): def __init__(self): super(LogisticRegression, self).__init__() self.linear = nn.Linear(X.shape[1], 1) self.sigmoid = nn.Sigmoid() def forward(self, x): x = self.linear(x) x = self.sigmoid(x) return x model = LogisticRegression() # 定义损失函数和优化器 criterion = nn.BCELoss() optimizer = optim.SGD(model.parameters(), lr=.01) # 训练模型 losses = [] accuracies = [] for epoch in range(100): # 前向传播 y_pred = model(X) # 计算损失函数和准确率 loss = criterion(y_pred, y.view(-1, 1)) accuracy = ((y_pred > .5).float() == y.view(-1, 1)).float().mean() # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 记录损失函数和准确率 losses.append(loss.item()) accuracies.append(accuracy.item()) # 打印训练过程 print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, 100, loss.item(), accuracy.item())) # 测试模型 with torch.no_grad(): y_pred = model(X) accuracy = ((y_pred > .5).float() == y.view(-1, 1)).float().mean() print('Test Accuracy: {:.4f}'.format(accuracy.item())) # 可视化结果 plt.plot(losses) plt.title('Training Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() plt.plot(accuracies) plt.title('Training Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.show() ``` 在这个示例中,我们使用了乳腺癌数据集作为示例数据集。我们首先将数据集转换为张量,然后定义了一个Logistic回归模型。我们使用二元交叉熵作为损失函数,使用随机梯度下降(SGD)作为优化器。我们训练模型并记录损失函数和准确率,然后使用测试数据集测试模型并计算准确率。最后,我们使用matplotlib库可视化训练和测试的损失函数和准确率。 ### 回答2: Logistic回归是一种二元分类算法,其主要目的是根据给定的输入数据,预测其所属的类别。在本文中,我们将介绍如何使用PyTorch实现Logistic回归。 首先,我们需要导入必要的PyTorch库: import torch import torch.nn as nn import torch.optim as optim 然后,我们需要定义我们的数据集。这里我们假设我们有n个数据样本,每个样本包含m个特征和一个二元类别。我们可以将这些数据存储在两个PyTorch张量中:一个包含特征,一个包含类别标签。 x = torch.randn(n, m) # 特征张量 y = torch.randint(high=2, size=(n, 1)).float() # 类别标签张量 接下来,我们需要定义我们的Logistic回归模型。这里我们将使用一个包含单个线性层的简单神经网络,以及一个sigmoid激活函数。 class LogisticRegression(nn.Module): def __init__(self, input_size): super(LogisticRegression, self).__init__() self.linear = nn.Linear(input_size, 1) def forward(self, x): output = self.linear(x) output = torch.sigmoid(output) return output model = LogisticRegression(m) 接下来,我们需要定义我们的损失函数和优化器。对于Logistic回归,通常使用二元交叉熵作为损失函数,使用随机梯度下降作为优化器。 criterion = nn.BCELoss() optimizer = optim.SGD(model.parameters(), lr=0.1) 现在我们可以开始训练我们的模型了。首先,我们将定义训练的迭代次数。然后,我们将循环n_epochs次并在每次迭代中计算模型的损失和梯度,并使用优化器更新模型参数。 n_epochs = 1000 for epoch in range(n_epochs): # 前向传播 y_pred = model(x) # 计算损失 loss = criterion(y_pred, y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 输出当前损失 if epoch % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, n_epochs, loss.item())) 最后,我们可以使用训练好的模型预测新的数据。我们只需要将数据传递给模型,然后将输出映射到二元类别。 with torch.no_grad(): y_pred = model(new_data) prediction = (y_pred >= 0.5).float() print('Prediction:', prediction) 总的来说,使用PyTorch实现Logistic回归非常简单。我们只需要定义模型,损失函数和优化器,然后使用反向传播更新模型参数。当然,在实现Logistic回归模型时还有许多其他的考虑因素,例如数据预处理和超参数调整,但这些在这篇文章里并没有讨论。 ### 回答3: pytorch是一个开源的机器学习框架,它可以帮助我们快速实现各种机器学习算法。其中,logistic回归是一个经典的二分类算法,我们可以使用pytorch实现它。 首先,我们需要准备好数据集。通常情况下,我们会将数据集划分为训练集和测试集,用训练集来训练模型,用测试集来测试模型的性能。 然后,我们需要定义模型。对于logistic回归来说,模型通常只有一层线性层和一个sigmoid激活函数。这可以通过pytorch中的nn.Linear和nn.Sigmoid来实现。 接下来,我们需要定义损失函数和优化器。对于logistic回归来说,常用的损失函数是二元交叉熵损失函数。优化器可以选择随机梯度下降法。 然后,我们可以通过迭代训练集中的样本来训练模型。具体来说,对于每一个样本,我们需要调用模型来预测其所属类别,计算预测值和真实值之间的误差,并根据误差更新模型的参数。这可以通过pytorch中的backward和step方法来实现。 最后,我们可以使用测试集来测试模型的性能。具体来说,对于每一个样本,我们需要调用模型来预测其所属类别,并将预测结果和真实值进行比较,计算分类准确率。 以上就是用pytorch实现logistic回归的基本步骤。当然,实际应用中还有很多需要注意和优化的地方,比如数据预处理、超参数调整等等。但是掌握了基本的实现方法,我们就可以应用pytorch实现各种机器学习算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值