博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
罗杰斯蒂回归
阅读量:3938 次
发布时间:2019-05-23

本文共 2635 字,大约阅读时间需要 8 分钟。

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 numpyimport torchimport torchvisionimport 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_predcriterion = 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]))

转载地址:http://kkywi.baihongyu.com/

你可能感兴趣的文章
SQL 排序Row_Number ,Rank ,Dense_Rank ,Ntile
查看>>
使用SQL Server (Not) In子查詢注意事項
查看>>
一个委托包含委托链(Combine),getinvocationlist的例子
查看>>
Delegate类的BeginInvoke()异步委托方法
查看>>
SQL Server 聚集索引(clustered index)和非聚集索引(nonclustered index)
查看>>
SQL Server Union等操作时解决不同数据库字符集冲突的问题
查看>>
Linq GroupJoin(二)
查看>>
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>
DataGridView或 DataTable导出到excel
查看>>
Ilist To DataTable
查看>>
SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY
查看>>
簡單工廠模式
查看>>
c# 读写txt文件
查看>>
Javascript Json对象与字符串转换
查看>>
Entity Framework对数据库表的CRUD操作
查看>>
练手:Linq的循环
查看>>