目录
解决分类问题的思想
不是让y=0-9这种实数,而是要计算属于每一个分类的概率,在各分类概率值中找最大值,概率值最大的这个分类即为结果。
分类为题计算p(y_hat=1) 输出的是概率
找一个函数把函数的实数值映射到[0,1]区间上的值。即将线性的值转为非线性的值。
-
当x趋近于正无穷时,y趋近于1.
-
当x趋近于0时,y趋近于0.5
-
当x趋近于负无穷时,y趋近于0
Sigmoid函数条件
-
函数值在[0,1]区间
-
在定义域内是单调函数(增函数)
-
满足饱和函数
Sigmoid函数中最出名的就是Logistic函数,在pytorch中,Sigmoid函数默认是Logistic函数。
线性模型和逻辑回归模型的学习模型对比
线性模型和逻辑回归模型的学习模型对比
线性模型和逻辑回归模型的损失函数对比
计算分布之间的差异。输出分布;y_hat表示的是p(class=1),1-y_hat=p(class=0)。
分布之间差异度量:
-
KL散度
-
cross-entropy:交叉熵 交叉熵损失函数公式为:
-
BCE损失函数,其中ce为交叉熵,小批量的损失函数
因为σ函数里面无参数,所以不用初始化,他没有参数可供训练,将来直接调用即可。
signmoid这个函数定义在nn模块下的functional包下。relu也在该包下
代码实现
1.准备数据
import torch
import numpy as np
import matplotlib.pyplot as plt
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0],[0],[1]])
2.定义模型
class LogisticRegreesionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegreesionModel, self).__init__() #super第一个参数是类名,后面调用父类的init()
self.linear = torch.nn.Linear(1,1) #Linear是pytorch的一个类,构造一个对象,Linear包括权重和偏置,Linear也是继承nn.Module的,可以实现反向传播
def forward(self, x):
y_pred = F.sigmoid(self.linear(x))
return y_pred
model = LogisticRegreesionModel() #实例化,这个model是callable的,是可以被调用,求出y-hat
3.建立损失函数和优化器
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
4.模型训练
import torch.nn.functional as F
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item())
optimizer.zero_grad() #梯度归零
loss.backward() #反馈,计算梯度
optimizer.step() #根据梯度和预先设置的学习率进行更新w和b的值
5.模型应用
x=np.linspace(0,10,200)
x_t = torch.Tensor(x).view((200,1))
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()