逻辑回归(Logistic regression)
回归方法是对数值型连续随机变量进行预测和建模的监督学习算法。其特点是标注的数据集具有数值型的目标变量。回归的目的是预测数值型的目标值。
逻辑回归对应线性回归,旨在解决分类问题,即将模型的输出转换为0/1值。逻辑回归直接对分类的可能性进行建模,无需事先假设数据的分布。
最理想的转换函数是单位阶跃函数(也称Heaviside函数),但单位阶跃函数是不连续的,没法在实际计算中使用。故而,在分类过程中更常使用对数几率函数(即sigmoid函数):
因此,回归模型为:
将该模型的损失函数定义为:
(其中, y ^ \hat{y} y^表示任意输入一个数据,经过Sigmoid之后这个数据点属于第二类的概率,那么其属于第一类的概率就是 1 − y ^ 1-\hat{y} 1−y^;y 表示真实的 label,只能取 {0, 1} 这两个值。)
PyTorch实现逻辑回归
import torch
from torch import nn
from torch.autograd import Variable
#构造数据
n_data = torch.ones(100,2)
x0 = torch.normal(2*n_data)
y0 = torch.zeros(100)
x1 = torch.normal(-2*n_data)
y1 = torch.ones(100)
x = torch.cat((x0,x1)).type(torch.FloatTensor)
y = torch.cat((y0,y1)).type(torch.FloatTensor)
#定义LogisticRegression
class LogisticRegression(nn.Module):
def __init__(self):
super(LogisticRegression,self).__init__()
self.lr = nn.Linear(2,1)
self.sm = nn.Sigmoid()
def forward(self,x):
x = self.lr(x)
x = self.sm(x)
return x
logistic_model = LogisticRegression()
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(logistic_model.parameters(),lr = 1e-3,momentum=0.9)
#训练过程
for epoch in range(10000):
x_data = Variable(x)
y_data = Variable(y)
out = logistic_model(x_data)
loss = criterion(out,y_data)
print_loss = loss.data.item()
mask = out.ge(0.5).float()
correct = (mask == y_data).sum()
acc = correct.item()/x_data.size(0)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1)%20 == 0:
print('*'*10)
print('epoch {}'.format(epoch+1))
print('loss is {:.4f}'.format(print_loss))
print('acc is {:.4f}'.format(acc))
#参数输出
w0,w1 = logistic_model.lr.weight[0]
w0 = float(w0.item())
w1 = float(w1.item())
b = float(logistic_model.lr.bias.item())
print('w0:{}\n'.format(w0),'w1:{}\n'.format(w1),'b:{0}'.format(b))
参考:
https://github.com/KeKe-Li/tutorial/blob/master/assets/src/RAM/RAM.0.3.md
https://blog.csdn.net/qjk19940101/article/details/79573623