标题逻辑回归
import torch
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)
sigmal1=torch.eye(2)*0.5
sigmal2=torch.eye(2)*2
#从2个高斯分布中取100个样本
m1=MultivariateNormal(mu1,sigmal1)
m2=MultivariateNormal(mu2,sigmal2)
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))
print(idx)
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
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
#print(torch.sum(sigmoid(output)-my_sigmoid(output)))
#损失函数
loss=nn.BCELoss()
loss(sigmoid(output),y)
import torch.nn as nn
class LogisticRegression(nn.Module):
def __init__(self,D_in):
super(LogisticRegression,self).__init__()
self.linear=nn.Linear(D_in,1)
self.sigmoid=nn.Sigmoid()
pass
def forward(self,x):
x=self.linear(x)
output=self.sigmoid(x)
return output
pass
lr_model=LogisticRegression(2)
loss(lr_model(x),y)
#优化算法
from torch import optim
optimizer=optim.SGD(lr_model.parameters(),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)
l=loss(output,target)
l.backward()
optimizer.step()
pass
pass
#主函数
pred_neg=(output <= 0.5).view(-1)
pred_pos=(output > 0.5).view(-1)
#plt.scatter(x[pred_neg,0],x[pred_neg ,1])
#plt.scatter(x[pred_pos,0],x[pred_pos ,1])
w=lr_model.linear.weight[0]
b=lr_model.linear.bias[0]
def draw_decision(x,b,x0):
x1=(-b-w[0]*x0)/w[1]
plt.plot(x0.detach().numpy(),x1.detach().numpy(),'r')
pass
draw_decision(w,b,torch.linspace(x.min(),x.max(),50))
plt.show()
高斯分布200个样本点示例
逻辑回归聚类效果