逻辑回归与线性回归(Pytorch)

 一、逻辑回归      

 逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。

逻辑回归是一种常用的分类算法,用于预测二分类问题。它基于线性回归模型,通过将线性回归的结果映射到一个概率值来进行分类。

逻辑回归的基本原理是使用sigmoid函数(也称为逻辑函数)将线性回归的结果转换为概率值。sigmoid函数的公式为:f(x) = 1 / (1 + e^(-x)),其中x为线性回归的结果。sigmoid函数的取值范围在0到1之间,可以表示为样本属于某个类别的概率。

逻辑回归的训练过程是通过最大似然估计来确定模型的参数。通常使用梯度下降算法或者牛顿法来最小化损失函数,使得模型的预测结果与实际标签尽可能接近。

逻辑回归有以下几个特点:

  1. 简单而高效:逻辑回归是一种线性模型,计算速度快,适用于大规模数据集。
  2. 可解释性强:逻辑回归可以通过系数来解释特征对分类结果的影响程度。
  3. 预测概率:逻辑回归可以输出样本属于某个类别的概率,而不仅仅是分类结果。

逻辑回归实现同样是四个步骤:

  1. 准备数据集
  2. 设计模型
  3. 定义损失函数和优化器
  4. 模型训练

代码:

import numpy as np
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = F.sigmoid(self.linear(x))  # sigmid函数
        return y_pred

model = LinearModel()

criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)


for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print('epoch:', epoch, 'loss:', loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step() # 通过step()函数进行参数更新



x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1))
y_t = model(x_t)
y = y_t.data.numpy()#tensor转化为numpy形式

plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of passing')
plt.title('Logistic_Regression')
plt.grid()  #添加网格线
plt.show()


生成图:

Sigmoid函数是一种常见的S型函数,通常用于将变量映射到0和1之间

  • sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射 …
    该饱和函数的上、下界为(0,1)。
  • 具有以下优缺点:
    优点:平滑、易于求导。

二、线性回归

  线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。 与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。

步骤

  1. 准备数据集
  2. 设计模型(计算预测值y_hat):从nn.Module模块继承
  3. 构造损失函数和优化器:使用PytorchAPI
  4. 训练过程:Forward、Backward、update

代码:

import torch
import matplotlib.pyplot as plt

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])


class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()  # 调用父类构造函数
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)  # 调用linear对象,输入x进行预测
        return y_pred

model = LinearModel()  #实例化LinearModel()

criterion = torch.nn.MSELoss(reduction='sum')  # 定义损失函数,这里使用均方误差作为损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 定义优化器,这里使用随机梯度下降法作为优化器
losses=[]

for epoch in range(100):
    y_pred = model(x_data)  # 前向传播,计算预测值
    loss = criterion(y_pred, y_data)  # 计算损失值
    print('epoch:', epoch, 'loss:', loss.item())
    optimizer.zero_grad()  # 梯度清零
    loss.backward()  # 反向传播,计算梯度
    optimizer.step()  # 通过step()函数进行参数更新
    losses.append(loss.item())  #将每个批次的损失值添加到名为losses的列表中。


print('w:', model.linear.weight.item())
print('b:', model.linear.bias.item())

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred:', y_test.data)

plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('SGD')
plt.show()



  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值