逻辑斯蒂回归是做分类用的,输出是概率的分布
复习:线性回归
回归与分类的区别:
分类输出y_hat可以是通过的概率(【0,1】),也可以是结果,通过或挂科。
分类输出为概率,在训练时,logistic要把输出值从是实数空间映射到【0,1】
在pytorch中把logistic 叫做sigmoid
Logstic回归模型:
论文中常把logistic函数写成(x)
损失函数:
线性回归模型中loss=(y_hat-y)**2在几何上表示两点距离差异
logistic回归模型中,输出是概率的分别,loss要比较概率之间的分布差异,(KL散度,cross-entrpoy交叉熵)
交叉熵举例:
比较D分布和T分布差异性的大小,越大越好
loss越小越好
BCE二分类损失函数如上
y是样本真实值,y_hat是预测值,y=1时22,y_hat趋近于一则损失越小,否则越大
mini-batch loss 把BCE加起来求均值即可
linear函数与线性回归函数相同,因此code也相同,因为里没有参数,也不需要更新,直接在linear后加一个sigmod,最前面加一份functional即可
损失不同:从原来的MSE编程BCE(binary cross entropy)
完整代码:
1 prepare dataset
2designmodel using Class
3construct loss and optimizer
4training cycle
c
大部分网络模型都是这四步:
代码:
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
#prepare dataset
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])
#design model using Class
class LogisticRegressionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = F.sigmoid(self.linear(x))
return y_pred
model = LogisticRegressionModel()#创建一个LogisticRegressioMoel类的实例
#construct loss and optimizer
#BCELoss类参数:size_average=True/False是否求均值、reduction=True/False是否降维
criterion = torch.nn.BCELoss(size_average=False)
#优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#trainging cycle
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
optimizer.zero_grad() # 在反向传播之前一定要释放梯度
loss.backward() # 反向传播Autograd
optimizer.step() # update
if (epoch % 100 == 0): #output epoch and loss
print('Epoch =' + '\t' + str(epoch) + '\t' + 'Loss =' + '\t' + str(format(loss.item(), '.4f')))
print('')
print('')
x = np.linspace(0, 10, 200) #0-10之间平均取200个点
x_test = torch.Tensor(x).view((200, 1))
y_test = model(x_test)
y = y_test.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(True)
plt.show()
输出:
Epoch = 0 Loss = 2.6060
Epoch = 100 Loss = 1.9397
Epoch = 200 Loss = 1.7697
Epoch = 300 Loss = 1.6271
Epoch = 400 Loss = 1.5065
Epoch = 500 Loss = 1.4037
Epoch = 600 Loss = 1.3155
Epoch = 700 Loss = 1.2390
Epoch = 800 Loss = 1.1721
Epoch = 900 Loss = 1.1133