问题:
根据输入的学习时间,来预测考试是否能合格,输出能通过考试的概率
Logistic函数:
又叫sigmoid函数,logistic函数是最典型的sigmoid函数,函数表达式和函数图如下
将变量映射到[0,1]之间
概率值用logistic函数值来表示,函数中输入的x是原来的y_pred。
logistic函数的导数符合正态分布
sigmoid函数:
特点:
①:饱和性
②:单调递增
③:有极限值
其他sigmoid函数:
与线性模型的区别:
表达式改变如图:
损失函数的改变:
由MSE函数改为BCE函数
MSE函数输出真实数值与预测数值的差异,BCE函数则输出概率值,需要比较分布差异
对公示的理解:当真实输出值为1,则(1-y)log(1-y_hat) = 0,那么loss = -ylog(y_hat),此时要使损失值最小,y_hat就要越接近1,即越接近真实值,当真实输出为0同理。
例子如下:
logistic代码实现:
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
x_data = torch.tensor([[1.0],[2.0],[3.0]]) #x设置为tensor类型数据
y_data = torch.tensor([[0.0],[0.0],[1.0]]) #y设置为tensor类型数据
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()
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01) #定义梯度优化器为随机梯度下降
for epoch in range(10000): #训练过程
y_pred = model (x_data) #向前传播,求y_pred
loss = criterion (y_pred,y_data) #根据y_pred和y_data求损失
print(epoch,loss)
optimizer.zero_grad() #将优化器数值清零
loss.backward() #反向传播,计算梯度
optimizer.step() #根据梯度更新参数
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.tlabel = ("Probability of Pass")
plt.show()