罗杰斯蒂回归

1.和线性模型的区别

我们估计的一个目标是一个连续的输出,这时候就是一个回归的任务。
分类问题就是估计是已知的有限的集合当中选择一个的问题。那么我们如果我们这时候使用一个将输出转化为离散数值的情况。
这样做是不好的,因为我们假定将ABC三种输出分别对应成为123,那么将存在这样的一种问题:
1.原来的输出ABC之间的差异只是有差异,但是并不一定是完全相等的,例如我们可能存在A和B是特别相似的但是B和C的差异是十分巨大的。所以我们不能简单的将其对应为数字。
2.还有一个问题就是A和B之间是没法确定其有明确的大小关系的,所以我们不能将其简单的对应为一个数字。
还有很多问题,之后将会补充。。
所以我们现在不能使用这种对应,所以我们在分类问题当中我们输出的是一个概率,例如他是A的概率P(A)、他是B的概率P(B)、他是C的概率P©。之后我们再从这些分类当中找出一个最大值就可以知道这个是什么了。

2.解决引入数据集的问题

我们使用
trian_set = torchvision.datasets.MNIST(root=’./data’,train=True,download=True)
引入数据集的时候出现了这个错误,提示我们网页不可达。
在这里插入图片描述
我们试一下发现这个网页确实打不开,所以一定是要做一个本地了。
MNIST数据集资源是在csdn下载的,之后我们在代码中转到定义,改成我们本地的一个源,改一下他的url。
在这里插入图片描述
先做一个本地的源:

改成这个样子
在这里插入图片描述

保存一下重新启动。再测试一下成功了。
在这里插入图片描述

3.分类的问题

3.1二分类的问题

二分类的时候我们其实只算一个就行了,不用算两个因为其中的两个的加和就是1。如果最后的得出的概率是十分接近0.5的那么我们就没有十足的把握做出判断例如0.51.这时候就会输出一个待定,或是直接输出一个值。

3.2罗杰斯特回归

以前的输出是一个实数,现在的输出变成了一个概率,所以就变成了(0,1)的一个区间。我们罗杰斯特方法其实就是将实数映射到一个(0,1)。
在这里插入图片描述

在这里插入图片描述

可以看到函数超过某一个阈值之后变化是十分缓慢的。这种函数在数学当中叫做饱和函数。罗杰斯特其实是由于正态分布所产生的函数。sigmoid函数其实不仅仅罗杰斯特函数一家。还有很多家,都满足(0,1)、单调递增、饱和函数。因为其中罗杰斯特函数是sigmoid中的典型代表。所以在很多情况下,我们都将两者等同起来。
在这里插入图片描述

可以看到两种模型的主要区别就是多了一个罗杰斯特函数做变换的过程。
在这里插入图片描述

3.3损失函数的变化

我们注意这里的损失函数也会发生变化了,我i们本身输出的是一个数值,所以我们可以使用方差来表示一个损失函数。但是我们这次得到的结果是一个概率,所以没有所谓的数轴上的距离这个数学意义了,所以我们使用原来的损失函数就不好了。
在这里插入图片描述

这里我们应当选择可以计算两种分布的差异性大小的损失函数,有下面两种:
kl散度:(待补充)
交叉熵:借助实际的例子我们可以理解交叉熵函数可以反应两种分布的差异
在这里插入图片描述
注:概率都是小于1的所以log函数的值是一个负值,所以需要加一个符号来调成一个正的。

4.代码实现


import numpy
import torch
import torchvision
import torch.nn.functional as func
#trian_set = torchvision.datasets.MNIST(root='./data',train=True,download=True)
# test_set =torchvision.datasets.MNIST(root='./data',train=False,download=True)
#这里的train表示你是需要一个训练集还是一个测试集
#download表示是不是没有了要去下载。torchvision中的数据集大多都是这种操作。
#CIFAR 是十种彩色图片,
# trian_set = torchvision.datasets.CIFAR10(root='./data',train=True,download=True)
# test_set =torchvision.datasets.CIFAR10(root='./data',train=False,download=True)
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[0],[0],[1]])
class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear=torch.nn.Linear(1,1)
        #因为sigmoid是没有任何参数的,所以我们不需要额外定义参数。
    
    def forward(self,x):
        y_pred=func.sigmoid(self.linear(x))
        #这里其实就是在定义forward函数的时候增加了一部sigmoid的计算。
        return y_pred

criterion = torch.nn.BCELoss(size_average=True)
model= LogisticRegressionModel()
#这里的bce是交叉熵损失函数的问题
#这里求均值的时候其实还会影响到学习率的选择问题,因为是不是求平均会影响梯度的大小
opitmizer =torch.optim.SGD(model.parameters(),lr=0.01)
#优化器是不变的
for epoch in range(1000):
    y_hat=model(x_data)
    loss=criterion(y_hat,y_data)
    print(epoch,loss.item())
    criterion.zero_grad()
    loss.backward()
    opitmizer.step()
x_test=torch.Tensor([4.0])
y_test=model(x_test)
print('4.0的情况为',str(y_test[0][0]))
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BuptBf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值