pytorch实现逻辑回归

时间:2021-05-22

本文实例为大家分享了pytorch实现逻辑回归的具体代码,供大家参考,具体内容如下

一、pytorch实现逻辑回归

逻辑回归是非常经典的分类算法,是用于分类任务,如垃圾分类任务,情感分类任务等都可以使用逻辑回归。

接下来使用逻辑回归模型完成一个二分类任务:

# 使用逻辑回归完成一个二分类任务# 数据准备import torchimport matplotlib.pyplot as pltx1 = torch.randn(365)+1.5 # randn():输出一个形状为size的标准正态分布Tensorx2 = torch.randn(365)-1.5#print(x1.shape) # torch.Size([365])#print(x2.shape) # torch.Size([365])data = zip(x1.data.numpy(),x2.data.numpy()) # 创建一个聚合了来自每个可迭代对象中的元素的迭代器。 x = [1,2,3]pos = []neg = []def classification(data): for i in data: if (i[0] > 1.5+0.1*torch.rand(1).item()*(-1)**torch.randint(1,10,(1,1)).item()): pos.append(i) else: neg.append(i)classification(data)# 将正、负两类数据可视化pos_x = [i[0] for i in pos]pos_y = [i[1] for i in pos]neg_x = [i[0] for i in neg]neg_y = [i[1] for i in neg]plt.scatter(pos_x,pos_y,c = 'r',marker = "*")plt.scatter(neg_x,neg_y,c = 'b',marker = "^")plt.show()# 构造正、负两类数据可视化结果如上图所示# 构建模型import torch.nn as nnclass LogisticRegression(nn.Module): def __init__(self): super(LogisticRegression, self).__init__() self.linear = nn.Linear(2,1) self.sigmoid = nn.Sigmoid() def forward(self,x): return self.sigmoid(self.linear(x))model = LogisticRegression()criterion = nn.BCELoss()optimizer = torch.optim.SGD(model.parameters(),0.01)epoch = 5000features = [[i[0],i[1]] for i in pos]features.extend([[i[0],i[1]] for i in neg]) #extend 接受一个参数,这个参数总是一个 list,并且把这个 list 中的每个元素添加到原 list 中features = torch.Tensor(features) # torch.Tensor 生成单精度浮点类型的张量label = [1 for i in range(len(pos))]label.extend(0 for i in range(len(neg)))label = torch.Tensor(label)print(label.shape)for i in range(500000): out = model(features) #print(out.shape) loss = criterion(out.squeeze(1),label) optimizer.zero_grad() loss.backward() optimizer.step() # 分类任务准确率 acc = (out.ge(0.5).float().squeeze(1)==label).sum().float()/features.size()[0] if (i % 10000 ==0): plt.scatter(pos_x, pos_y, c='r', marker="*") plt.scatter(neg_x, neg_y, c='b', marker="^") weight = model.linear.weight[0] #print(weight.shape) wo = weight[0] w1 = weight[1] b = model.linear.bias.data[0] # 绘制分界线 test_x = torch.linspace(-10,10,500) # 500个点 test_y = (-wo*test_x - b) / w1 plt.plot(test_x.data.numpy(),test_y.data.numpy(),c="pink") plt.title("acc:{:.4f},loss:{:.4f}".format(acc,loss)) plt.ylim(-5,3) plt.xlim(-3,5) plt.show()

附上分类结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章