白板推导系列Pytorch-逻辑回归
白板推导系列Pytorch-逻辑回归
逻辑回归的从零实现
导入需要的包
import torch
import matplotlib.pyplot as plt
import torch.nn as nn
from torch.autograd import Variable
生成数据集
def create_dataset(n_samples=1000):n_data = torch.ones(n_samples//2, 2)x0 = torch.normal(2 * n_data, 1) # 生成均值为2.标准差为1的随机数组成的矩阵 shape=(100, 2)y0 = torch.zeros(n_samples//2)x1 = torch.normal(-2 * n_data, 1) # 生成均值为-2.标准差为1的随机数组成的矩阵 shape=(100, 2)y1 = torch.ones(n_samples//2)x=torch.cat((x0,x1),0).type(torch.FloatTensor)y=torch.cat((y0,y1),0).type(torch.FloatTensor)return x,y
定义Sigmoid和交叉熵损失函数
def sigmoid(x):return 1/(1+torch.exp(-x))def loss(y,y_pred):return -(y*torch.log(y_pred)+(1-y)*torch.log(1-y_pred))
定义模型
class LogisticRegression:def __init__(self,lr=1e-4,batch_size=64,n_epoch=100) -> None:self.lr = lrself.batch_size = batch_sizeself.n_epoch = n_epoch# 训练def fit(self,X_data,y_data):self.weight = torch.normal(2,0.01,size=(X_data.shape[1],),requires_grad=True)dataset = Data.TensorDataset(X_data,y_data)train_iter = Data.DataLoader(dataset,batch_size=self.batch_size)history = {'loss':[],'acc':[]}for epoch in range(self.n_epoch):for X,y in train_iter:y_pred = torch.matmul(X,self.weight)y_pred = sigmoid(y_pred)l = loss(y,y_pred).sum()if l>0:l.backward()self.weight.data -= self.weight.grad.data*self.lrself.weight.grad.data.zero_()print('epoch {}'.format(epoch+1),end=' ')l,acc = self.score(X_data,y_data)history['loss'].append(l)history['acc'].append(acc)return history# 评估def score(self,X_data,y_data):with torch.no_grad():y_pred = torch.matmul(X_data,self.weight)y_pred = sigmoid(y_pred)all_loss = loss(y_data,y_pred).sum().item()mask = (y_pred>=0.5).view(len(y_pred,))correct = (mask==y_data).sum().item()acc = correct/len(y_pred)print("loss is {:.4f} acc is {:.4f}".format(all_loss,acc))return all_loss,acc# 预测def predict(self,X_data):with torch.no_grad():y_pred = torch.matmul(X_data,self.weight)y_pred = sigmoid(y_pred)return (y_pred>=0.5).view(len(y_pred,))
模型训练与评估
X,y = create_dataset(1000)
lr = LogisticRegression()
history = lr.fit(X[:800],y[:800])
lr.score(X[800:],y[800:])
绘制损失曲线和准确率曲线
def plot_history(history,loss=True,acc=True):if loss:plt.plot(torch.arange(len(history['loss'])),history['loss'])plt.show()if acc:plt.plot(torch.arange(len(history['acc'])),history['acc'])plt.show()plot_history(history)
逻辑回归的简单实现
导入需要的包
import torch
import matplotlib.pyplot as plt
import torch.nn as nn
from torch.autograd import Variable
生成数据集
def create_dataset(n_samples=1000):n_data = torch.ones(n_samples//2, 2)x0 = torch.normal(2 * n_data, 1) # 生成均值为2.标准差为1的随机数组成的矩阵 shape=(100, 2)y0 = torch.zeros(n_samples//2)x1 = torch.normal(-2 * n_data, 1) # 生成均值为-2.标准差为1的随机数组成的矩阵 shape=(100, 2)y1 = torch.ones(n_samples//2)x=torch.cat((x0,x1),0).type(torch.FloatTensor)y=torch.cat((y0,y1),0).type(torch.FloatTensor)return x,y
X,y = create_dataset(1000)
plt.scatter(X[:,0],X[:,1],c=y)
定义模型
class LogisticRegression(nn.Module):def __init__(self):super(LogisticRegression,self).__init__()self.lr=nn.Linear(2,1) #相当于通过线性变换y=x*T(A)+b可以得到对应的各个系数self.sm=nn.Sigmoid() #相当于通过激活函数的变换def forward(self, x):x=self.lr(x)x=self.sm(x)return x
定义损失函数和优化器
net = LogisticRegression()
criterion=nn.BCELoss() #选用BCE损失函数,该损失函数是只用于2分类问题的损失函数
optimizer=torch.optim.SGD(net.parameters(),lr=1e-3,momentum=0.9) #采用随机梯度下降的方法
定义训练过程
def train(net,X_data,y_data,batch_size,epoch):if torch.cuda.is_available():net = net.cuda()X_data=Variable(X_data).cuda()y_data=Variable(y_data).cuda()else:X_data=Variable(X_data)y_data=Variable(y_data)# 创建数据加载器dataset = Data.TensorDataset(X_data,y_data)train_iter = Data.DataLoader(dataset,batch_size=batch_size)net.train()history = {"loss":[],"acc":[]}#开始训练for i in range(epoch):all_loss = 0for X,y in train_iter:#根据逻辑回归模型拟合出的y值y_pred = net(X) #计算损失函数loss = criterion(y_pred,y.view(len(y),-1))#梯度清零optimizer.zero_grad()#反向传播loss.backward()#梯度更新optimizer.step()all_loss += loss.data.item()print('epoch {}'.format(i+1),end=' ')loss,acc = evaluate(net,X_data,y_data,batch_size)history['loss'].append(loss)history['acc'].append(acc)return history
定义模型评估
def evaluate(net,X_data,y_data,batch_size):if torch.cuda.is_available():net = net.cuda()X_data=Variable(X_data).cuda()y_data=Variable(y_data).cuda()else:X_data=Variable(X_data)y_data=Variable(y_data)# 创建数据加载器dataset = Data.TensorDataset(X_data,y_data)test_iter = Data.DataLoader(dataset,batch_size=batch_size)net.eval()correct = 0all_loss = 0for X,y in test_iter:y_pred = net(X)loss = criterion(y_pred,y.view(len(y),-1))correct += ((y_pred>=0.5).view(len(y_pred),)==y).sum().item()all_loss += lossacc = correct/len(y_data)print("loss is {:.4f} acc is {:.4f}".format(all_loss,acc))return all_loss,acc
训练
history = train(net,X[:800],y[:800],256,100)
plot_history(history)
白板推导系列Pytorch-逻辑回归相关推荐
- 机器学习-白板推导系列(三十)-生成模型(Generative Model)
机器学习-白板推导系列(三十)-生成模型(Generative Model) 30.1 生成模型的定义 前面所详细描述的模型以浅层的机器学习为主.本章将承上启下引出后面深度机器学习的部分.本小节,主要 ...
- 机器学习-白板推导系列笔记(十二)-变分推断(VI)
此文章主要是结合哔站shuhuai008大佬的白板推导视频: VI变分推断_126min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.背景 对于概率模型 从频率派角度来看就会是一个优化问题 从贝 ...
- 机器学习-白板推导系列笔记(二十八)-BM
此文章主要是结合哔站shuhuai008大佬的白板推导视频:玻尔兹曼机_147min 全部笔记的汇总贴:机器学习-白板推导系列笔记 参考花书20.1 一.介绍 玻尔兹曼机连接的每个节点都是离散的二值分 ...
- 机器学习-白板推导-系列(九)笔记:概率图模型: 贝叶斯网络/马尔可夫随机场/推断/道德图/因子图
文章目录 0 笔记说明 1 背景介绍 1.1 概率公式 1.2 概率图简介 1.2.1 表示 1.2.2 推断 1.2.3 学习 1.2.4 决策 1.3 图 2 贝叶斯网络 2.1 条件独立性 2. ...
- 机器学习-白板推导系列笔记(十三)-MCMC
此文章主要是结合哔站shuhuai008大佬的白板推导视频:MCMC_218min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.蒙特卡洛方法 蒙特卡洛方法(Monte Carlo Method) ...
- 机器学习-白板推导系列笔记(二十一)-RBM
此文章主要是结合哔站shuhuai008大佬的白板推导视频:受限玻尔兹曼机_155min 全部笔记的汇总贴:机器学习-白板推导系列笔记 玻尔兹曼机介绍:白板推导系列笔记(二十八)-玻尔兹曼机 一.背景 ...
- 【白板推导系列笔记】降维-PCA-最大投影方差最小重构代价
作者:shuhuai008 链接:[机器学习][白板推导系列][合集 1-33]_哔哩哔哩_bilibili PCA的核心就是对原始特征空间的重构(将一组可能线性相关的变量,通过正交变换变换成一组线性 ...
- 机器学习-白板推导-系列(五)笔记:降维(PCA/SVD/PCoA/PPCA)
文章目录 0 笔记说明 1 背景 1.1 样本均值 1.2 样本协方差矩阵 2 主成分分析PCA 2.1 最大投影方差 2.2 最小重构距离 2.3 总结 3 SVD分解HX 4 主坐标分析PCoA ...
- 机器学习-白板推导-系列(十)笔记:EM算法
文章目录 0 笔记说明 1 算法收敛性证明 2 公式导出 2.1 ELBO+KL Divergence 2.2 ELBO+Jensen Inequlity 2.3 最后的工作 3 从狭义EM到广义EM ...
- 机器学习-白板推导系列笔记(三十四)-MDP
此文章主要是结合哔站shuhuai008大佬的白板推导视频:马尔科夫决策过程_107min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.背景介绍 Random Variable:XYX⊥YX\; ...
最新文章
- [Ext JS 4] 实战Chart 协调控制(单一的坐标,两个坐标)
- 【Python】8000字:Python时间系列之datetime模块
- 模拟FCFS调度算法(先来先服务)没错,是篇好文章!
- myeclipse10.1破解方法
- LeetCode MySQL 578. 查询回答率最高的问题
- 数据挖掘基础学习一:VMware虚拟机Ubuntu上安装Python和IPython Notebook(Jupyter Notebook)完整步骤及需要注意的问题(以ubuntu-18.04.3为例)
- Python:集合、三元运算符
- IT销售素质 --善于学习
- 数学归纳法与算法设计
- C++标准库——advance() distance() iter_swap()
- pytorch中的Variable详解
- Voxengo音频插件合集:Voxengo Total Bundle Mac
- 怎么录制自己手机上的视频
- 蓝天白云青山绿水还有清风吹斜阳......
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
- 获取iframe里面的数据
- Rust 常见问题之一:Blocking waiting for file lock on package cache
- 去重的几种方法(部分)
- 羊皮卷二我要用心中的爱来迎接今天(中英对照)
- 【深度之眼Python基础+数据科学入门训练营】第四章 组合数据类型