逻辑回归简述
逻辑回归虽然也叫做回归但是处理的却是分类任务,逻辑回归的模型可以看下图
能够看到逻辑回归模型与线性模型及其接近,只不过在最终多了一个sigmoid函数。它输出的最终结果也与线性回归的结果有巨大差异,在线性回归中我们会输出一个数值,而在逻辑回归中输出的则是一个属于某一类概率,这么做是有重要的现实意义的。我们以手写数字识别为例,系统需要识别0~9这十个数字
如果我们的识别结果是输出一个数值,比如输出1.2,识别结果为1,这个结果看似是合理的但这么做我们就隐式地确定了各数字之间的距离(e.g.在数值上1和7的距离显然比1和2的距离要大,但实际上我们都知道从数字的形状上来看1和7应该更为接近),这样显然是不合理的.
接下来我们谈一下相较于线性回归多出的那个sigmoid函数,它实际上是一类函数的统称(通常我们认为sigmoid函数是
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1)
既然输出的结果变了那么我们的损失函数自然也要跟着改变,线性回归的loss值是希望能让结果与目标之间的距离最小化,类似地我们这里使用二分类的交叉熵作为逻辑回归的loss:
l
o
s
s
=
−
(
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
)
loss=-(ylog\hat{y}+(1-y)log(1-\hat{y}))
loss=−(ylogy^+(1−y)log(1−y^))
更多关于逻辑回归的内容可以看这里
设计模型
模型设计方面和上一课的内容大相径庭唯一的变化只在于在forward方法中新增一个sigmoid函数,这里直接给出完整代码:
import torch
import torch.nn.functional as F
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[0.0],[0.0],[1.0]])
#模型设计
class LogisticRegressionModeal(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModeal,self).__init__()
self.linear=torch.nn.Linear(1,1)
def forward(self,x):
y_pred=F.sigmoid(self.linear(x))
return y_pred
model=LogisticRegressionModeal()
#构造损失和优化器
criterion=torch.nn.BCELoss(size_average=False)
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
print(model.parameters())
#训练轮次
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()
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,10,200)
print(x)
x_t=torch.Tensor(x).view((200,1))
print(x_t)
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()
总结
本节课的内容并不多更像是上一节课内容的衍生,理解起来也没有什么困难