首页 > python教程

pytorch实现逻辑回归

时间:2021-05-07 python教程 查看: 797

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

一、pytorch实现逻辑回归

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

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

# 使用逻辑回归完成一个二分类任务
# 数据准备
import torch
import matplotlib.pyplot as plt

x1 = torch.randn(365)+1.5   # randn():输出一个形状为size的标准正态分布Tensor
x2 = 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 nn
class 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 = 5000
features = [[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()

附上分类结果:

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

展开全文
上一篇:python 时间 T 去掉 带上ms 毫秒 时间格式的操作
下一篇:python基于tkinter点击按钮实现图片的切换
输入字:
相关知识
Python 实现图片色彩转换案例

我们在看动漫、影视作品中,当人物在回忆过程中,体现出来的画面一般都是黑白或者褐色的。本文将提供将图片色彩转为黑白或者褐色风格的案例详解,感兴趣的小伙伴可以了解一下。

python初学定义函数

这篇文章主要为大家介绍了python的定义函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助

图文详解Python如何导入自己编写的py文件

有时候自己写了一个py文件,想要把它导入到另一个py文件里面,所以下面这篇文章主要给大家介绍了关于Python如何导入自己编写的py文件的相关资料,需要的朋友可以参考下

python二分法查找实例代码

二分算法是一种效率比较高的查找算法,其输入的是一个有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否则返回NONE,下面这篇文章主要给大家介绍了关于python二分法查找的相关资料,需要的朋友可以参考下