《PyTorch深度学习实践》学习笔记:逻辑斯蒂回归


一、Logistic function

逻辑斯蒂回归属于分类问题,与之前学习的线性回归问题不同,输出的是分类的概率值,在训练过程中,计算它属于每一个分类的所有概率,其中概率最大的那一种分类,就是我们要的输出结果。
在这里插入图片描述
在之前我们的学习中,最终预测的是一个实数,而针对分类问题,我们要把输出的实数映射成一个0到1的概率,这个映射的过程就是本节课所学的逻辑斯蒂回归。

逻辑斯蒂函数在数学界被分为——饱和函数。饱和函数是函数的导数先增大后减小,形状如同正态分布一样。

计算概率的方式:将原本计算的实数y_pred作为变量输入到逻辑斯蒂函数中,输出的就是映射之后的概率值。

一系列sigmoid函数:
Sigmid Founction需要满一下三个条件:

  • 函数值有极限
  • 是单调增函数
  • 是饱和函数
    在这里插入图片描述
    最具典型的就是Logistic function,后续也把Logistic function称为了sigmoid函数。

逻辑斯蒂回归模型:
在这里插入图片描述
损失函数:
在这里插入图片描述
交叉熵损失函数:
在这里插入图片描述
举例说明:
在这里插入图片描述
用上述的式子来表示两个分布之间的差异性的大小,希望这个值越大越好。计算交叉熵的话,应该有一个负号,此时是越小越好。

交叉熵是对数似然函数的相反数。 对数似然的值我们希望它越大越好,交叉熵的值我们希望它越小越好。

补充知识:
在这里插入图片描述
KL 散度 = 交叉熵 - 熵
在这里插入图片描述
逻辑斯蒂回归与线性回归不同之处在于:
在这里插入图片描述

  • 多了一个sigmoid函数。

  • 另外一个不同的地方就是损失函数不同:
    在这里插入图片描述
    在这里插入图片描述
    关于loss是否求平均的问题,如果求平均,之后loss的导数也是平均后的,这样loss相对不平均会小,然后loss进行更新的时候会与学习率有关,从而影响学习率的选择。
    不求平均,loss的导数值大,loss更新与学习率相关。
    很多时候loss不求平均,会在求导数的时候进行平均。

此外这里还有一点注意的是,这里的BCELoss是二分类的交叉熵损失,在pytorch的官网上还提供了多分类的交叉熵损失。
在这里插入图片描述
在这里插入图片描述
具体的参数信息可以在官网上进行查看。
在这里插入图片描述

二、练习代码

import torch
from torch import nn
import torch.nn.functional as f
import matplotlib.pyplot as plt
import numpy as np

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

class Logisticmodel(nn.Module):
    def __init__(self):
        super(Logisticmodel, self).__init__()
        self.linear = nn.Linear(1,1)
    def forward(self,x):
        y_pred = self.linear(x)
        y_pred = torch.sigmoid(y_pred)
        return y_pred

model = Logisticmodel()
# 交叉熵损失
creation = nn.BCELoss()    # 二分类的交叉熵,默认会求均值
# 优化器
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)

step = 1000
epoch_list = []
loss_list = []
for epoch in range(1,step+1):
    y_pred = model(x_data)
    loss = creation(y_pred,y_data.float())
    print(epoch,loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    epoch_list.append(epoch)
    loss_list.append(loss.item())

# 画图
plt.plot(epoch_list,loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

# 把模型学出来的参数进行一个测试
x = np.linspace(0,10,200)
x = np.float32(x)
x_t = torch.tensor(x).view(200,1) # 将x转变为(200,1)的tensor对象
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='b')
plt.xlabel('Hours')
plt.ylabel('Probablity of Pass')
plt.grid()
plt.show()

运行结果:
在这里插入图片描述
在这里插入图片描述
参考博文:https://blog.csdn.net/Learning_AI/article/details/121083825

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值