PyTorch实现Logistic回归对多元高斯分布进行分类实战(附源码)

需要源码请点赞关注收藏后评论区留言~~~

Logistic常用于解决二分类问题,为了便于描述,我们分别从两个多元高斯分布中生成数据X1,X2.这两个多元高斯分布分别表示两个类别,分别设置其标签为y1,y2.

注意 后面要打乱样本和标签的顺序,将数据重新随机排列是十分重要的步骤,否则算法的每次迭代只会学习到同一个类别的信息,容易造成模型过拟合

优化算法

Logistic回归通常采用梯度下降法优化目标函数,PyTorch的torch.optim包实现了大多数常用的优化算法,使用起来非常简单,首先构建一个优化器,在构建时,首先需要将待学习的参数传入,然后传入优化器需要的参数,比如学习率等等

构造完优化器,就可以迭代的对模型进行训练,有两个步骤,其一是调用损失函数的backward()方法计算模型的梯度,然后再调用优化器的step()方法更新模型的参数,需要注意的是,首先应当调用优化器的zero_grad()方法清空参数的梯度

效果如下 

可以明显的看出多元高斯分布生成的样本聚成了两个簇,并且簇的中心分别处于不同的位置,右上方簇的样本分别更加稀疏,而左下方的样本分别紧凑,读者可以自行调整代码中第5-6行的参数 观察其变化

PyTorch实现Logistic回归对多元高斯分布进行分类实战(附源码)_第1张图片

 部分源码如下

import self as self
import  torch
from cv2.ml import LogisticRegression
from torch import  nn
from matplotlib import  pyplot as plt
import  numpy as np
from torch.distributions import  MultivariateNormal
mu1=-3*torch.ones(2)
mu2=3*torch.ones(2)
sigma1=torch.eye(2)*0.5
sigma2=torch.eye(2)*2


x1=m1.sample((100,))
x2=m2.sample((100,))


y=torch.zeros((200,1))
y[100:]=1

x=torch.cat([x1,x2],dim=0)
idx=np.random.permutation(len(x))
x=x[idx]
y=y[idx]


plt.scatter(x1.numpy()[:,0],x1.numpy()[:,1])
plt.scatter(x2.numpy()[:,0],x2.numpy()[:,1])
plt.show()
D_in,D_out=2,1
linear=nn.Linear(D_in,D_out,bias=True)
output=linear(x)
print(x.shape,linear.weight.shape,linear.bias.shape,output.shape)

def my_linear(x,w,b):
    return torch.mm(x,w.t())+b
print(torch.sum((output-my_linear(x,linear.weight,linear.bias))))
sigmoid=nn.Sigmoid()
scores=sigmoid(output)
def my_sigmoid(x):
    x=1/(1+torch.exp(-x))
    return x
loss=nn.BCELoss()
loss(sigmoid(output),y)
def my_loss(x,y):
    loss=-torch.mean(torch.log(x)*y+torch.log(1-x)*(1-y))
    return loss
from torch import  optim
import torch.nn as nn
class LogisticRegression(nn.Module):
    super(LogisticRegression,self).__init__()
    self.linear=nn.Linear()
optimizer=optim.SGD(lr=0.03)
batch_size=10
iters=10
for _ in range(iters):
    for i in range(int(len(x)/batch_size)):
        input=x[i*batch_size:(i+1)*batch_size]
        target=y[i*batch_size:(i+1)*batch_size]
        optimizer.zero_grad()
        output=lr_model(input)

你可能感兴趣的:(深度学习,pytorch,回归,分类,python,深度学习)