Pytorc学习第一课-线性回归和逻辑回归

主要学习Pytorch的基本使用步骤和基本逻辑:

线性回归:
首先 生成数据集:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

x=torch.randn(100,1)*10 #生成1001维的随机数
y=x+3* torch.randn(100,1) #生成y,添加一些扰动

plt.plot(x.numpy(),y.numpy(),'o') #画图看一下

在这里插入图片描述
然后 建立学习的class

def LR(nn.Module)
	def __init__(self,input_size,output_size):
		#定义输入和输出的维度
		super().__init__()
		self.linear=nn.Linear(input_size,output_size)
	def forward(x):
		pred=self.linear(x)
		return pred

最后定义 loss, optimizer等进行学习:

model=LR(1,1) # 输入1维,输出1维
cirterion =nn.MSELoss() #设置loss,loss为MSE
optimizer=nn.optim.SGD(model.parameters(),lr=0.001) #设置优化器,为SGD

epoch=100
for i in range(epoch):
	y_pred=model.forward(x)
	loss=cirterion(y_pred,y)
	
	optimizer.zero_grad() #将梯度清零,不然会累积
	loss.backward() #计算w和b的当前的梯度
	optimizer.step() # 对w和b进行更新

最后可以画图看看结果:

def get_parameters(model):
	[w,b]=model.parameters();
	return (w[0][0].item(),b[0].item)

def plot_fit(title):
	w1,b1=get_parameters(model)
	x1=np.array([-30,30])
	y1=w1*x1+b1
	plt.close()
	plt.plot(x1,y1,'r')
	plt.plot(x.numpy(),y.numpy(),'o')
	plt.savefig(title)

plot_fit('fit_result,jpg')

在这里插入图片描述

逻辑回归
和线性回归的逻辑基本是一模一样的,除了在forward的时候需要加一个sigmoid函数去进行概率分类:

#首先导入数据库,用sklearn的datasets
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from sklearn import datasets
import numpy as np

#生成一百个点,有两个中心点的cluster,每一个cluster的std为0.4,分别给出点的坐标x和类别y,其中x为2维,y为1维
n_pt=100
centers=[[-0.5,0.5],[0.5,-0.5]]
x,y=datasets.make_blobs(n_pt,random_state=123,centers=centers,cluster_std=0.4)

x_data=torch.Tensor(x)
y_data=torch.Tensor(y)

然后建立结构:

class Model(nn.Module):
	def __init()__(self,input_size,output_size):
		super().__init__()
		self.linear=nn.Linear(input_size,output_size)
	def forward(self,x):
		pred=torch.sigmoid(self.linear(x)) #整体和 线性回归完全一致,在 最后pred的时候,加了一个sigmoid进行概率判断
		return pred
	def pred(self,x):
		pred=self.forward(x)
		if pred>0.5:
			return 1
		else:
			return 0

最后进行训练:

model=Model(2,1)

criterion=nn.BCELoss()
optimizer=torch.optim.SGD(model.paramerters(),lr=0.01)

epoch=1000
losses=[]
for i in range(epoch):
	y_pred=model.forward(x_data)
	loss=criterion(y_pred,y_data)
	
	optimizer.zero_grad() #梯度清零
	loss.backward() # 计算梯度
	losses.append(loss)
	optimizer.step() # 更新参数

plt.plot(losses)

在这里插入图片描述
最后看一下数据分离的情况:

def get_parameters(model):
	[w,b]=model.parameters()
	w1,w2=w.view(2)
	b=b[0]
	return (w1.item(),w2.item(),b.item())

def scatter_plot():
    plt.scatter(x[y==0,0],x[y==0,1],10)
    plt.scatter(x[y==1,0],x[y==1,1],10)
    
def plot_fit(title):
    plt.title=title
    # 0=w1x1+w2x2+b
    w1,w2,b=get_parameters(model)
    x1=np.array([-2,2])
    x2=(w1*x1+b)/(-w2)
    scatter_plot()
    plt.plot(x1,x2,'r')

plot_fit('after_optimize')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值