有监督学习:
回归问题:如果我们预测的结果是以连续数字进行表示,即我们将在连续函数中对多个输入变量建立映射关系时,则这样的问题称之为回归问题。
分类问题:如果我们预测的结果是以离散形式表示的,即我们将多个输入变量与多个不同的类别建立映射关系时,则这样的问题称之为分类问题。
在之前提到的耗时效益的问题,是回归问题,也就是输入和输出间又数值上的关系。
x | y |
---|---|
1 | 2 |
2 | 4 |
3 | 6 |
4 | ? |
但如果,将 y y y的值记为是否合格,此问题变变换成一个(二)分类问题。
x | y |
---|---|
1 | fail(0) |
2 | fail(0) |
3 | pass(1) |
4 | pass |
实际上是计算在4工时下是否合格的概率,即对概率的计算与比较,而非类别之间的数值比较。
分类问题中,实际上是对概率的计算与比较,而非类别之间的数值比较.(也即离散问题时)
二分类问题是非0即1的问题,由于隐藏条件的限制
P ( y ^ = 1 ) + P ( y ^ = 0 ) = 1 P(\widehat y=1)+P(\widehat y=0) = 1 P(y =1)+P(y =0)=1
对于二分类问题结果的预测,仅需要计算在0或1的条件下即可得到答案。
通常计算 P ( y ^ = 1 ) P(\widehat y=1) P(y =1)
在原先的回归问题中,所利用的模型为
y ^ = ω x + b \widehat y = \omega x+b y =ωx+b
此时的 y ^ ∈ R \widehat y \in R y ∈R,但当问题为分类问题时,所求结果的值域应当发生改变,变为一个概率即 y ^ ∈ [ 0 , 1 ] \widehat y \in [0,1] y ∈[0,1]
因此,需要引入逻辑函数(sigmod)来实现。
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+e−x1
本函数原名为logistics函数,属于sigmod类函数,由于其特性优异,代码中的sigmod函数就指的是本函数。其函数图像为
以及其他的sigmod函数:(但现在指向sigmod函数常指上面的那个函数)
sigmod函数的特点:
线性函数后加上了sigmod函数
损失函数由线性回归的MSE到BCE LossFunction
原先是计算两个标量数值间的差距,也就是数轴上的距离。
现在为了计算两个概率之间的差异,需要利用到交叉熵的理论。
简单的理解上,我们仅仅需要了解这个结论:
如下图所示, y ^ \widehat y y 与 y y y越接近,BCE Loss越小
import torch.nn.functional as F
import torch
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0.0],[0.0],[1.0]])
#改用LogisticRegressionModel 同样继承于Module
class LogisticRegressionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self, x):
#对原先的linear结果进行sigmod激活
y_pred = F.sigmoid(self.linear(x))
return y_pred
model = LogisticRegressionModel()
#构造的criterion对象所接受的参数为(y',y) 改用BCE
criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
print(epoch,loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred = ',y_test.data)
需要关注的是,此处的Tensor无法写成tensor,具体的区别:链接