白板推导系列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-逻辑回归相关推荐

  1. 机器学习-白板推导系列(三十)-生成模型(Generative Model)

    机器学习-白板推导系列(三十)-生成模型(Generative Model) 30.1 生成模型的定义 前面所详细描述的模型以浅层的机器学习为主.本章将承上启下引出后面深度机器学习的部分.本小节,主要 ...

  2. 机器学习-白板推导系列笔记(十二)-变分推断(VI)

    此文章主要是结合哔站shuhuai008大佬的白板推导视频: VI变分推断_126min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.背景 对于概率模型 从频率派角度来看就会是一个优化问题 从贝 ...

  3. 机器学习-白板推导系列笔记(二十八)-BM

    此文章主要是结合哔站shuhuai008大佬的白板推导视频:玻尔兹曼机_147min 全部笔记的汇总贴:机器学习-白板推导系列笔记 参考花书20.1 一.介绍 玻尔兹曼机连接的每个节点都是离散的二值分 ...

  4. 机器学习-白板推导-系列(九)笔记:概率图模型: 贝叶斯网络/马尔可夫随机场/推断/道德图/因子图

    文章目录 0 笔记说明 1 背景介绍 1.1 概率公式 1.2 概率图简介 1.2.1 表示 1.2.2 推断 1.2.3 学习 1.2.4 决策 1.3 图 2 贝叶斯网络 2.1 条件独立性 2. ...

  5. 机器学习-白板推导系列笔记(十三)-MCMC

    此文章主要是结合哔站shuhuai008大佬的白板推导视频:MCMC_218min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.蒙特卡洛方法 蒙特卡洛方法(Monte Carlo Method) ...

  6. 机器学习-白板推导系列笔记(二十一)-RBM

    此文章主要是结合哔站shuhuai008大佬的白板推导视频:受限玻尔兹曼机_155min 全部笔记的汇总贴:机器学习-白板推导系列笔记 玻尔兹曼机介绍:白板推导系列笔记(二十八)-玻尔兹曼机 一.背景 ...

  7. 【白板推导系列笔记】降维-PCA-最大投影方差最小重构代价

    作者:shuhuai008 链接:[机器学习][白板推导系列][合集 1-33]_哔哩哔哩_bilibili PCA的核心就是对原始特征空间的重构(将一组可能线性相关的变量,通过正交变换变换成一组线性 ...

  8. 机器学习-白板推导-系列(五)笔记:降维(PCA/SVD/PCoA/PPCA)

    文章目录 0 笔记说明 1 背景 1.1 样本均值 1.2 样本协方差矩阵 2 主成分分析PCA 2.1 最大投影方差 2.2 最小重构距离 2.3 总结 3 SVD分解HX 4 主坐标分析PCoA ...

  9. 机器学习-白板推导-系列(十)笔记:EM算法

    文章目录 0 笔记说明 1 算法收敛性证明 2 公式导出 2.1 ELBO+KL Divergence 2.2 ELBO+Jensen Inequlity 2.3 最后的工作 3 从狭义EM到广义EM ...

  10. 机器学习-白板推导系列笔记(三十四)-MDP

    此文章主要是结合哔站shuhuai008大佬的白板推导视频:马尔科夫决策过程_107min 全部笔记的汇总贴:机器学习-白板推导系列笔记 一.背景介绍 Random Variable:XYX⊥YX\; ...

最新文章

  1. [Ext JS 4] 实战Chart 协调控制(单一的坐标,两个坐标)
  2. 【Python】8000字:Python时间系列之datetime模块
  3. 模拟FCFS调度算法(先来先服务)没错,是篇好文章!
  4. myeclipse10.1破解方法
  5. LeetCode MySQL 578. 查询回答率最高的问题
  6. 数据挖掘基础学习一:VMware虚拟机Ubuntu上安装Python和IPython Notebook(Jupyter Notebook)完整步骤及需要注意的问题(以ubuntu-18.04.3为例)
  7. Python:集合、三元运算符
  8. IT销售素质 --善于学习
  9. 数学归纳法与算法设计
  10. C++标准库——advance() distance() iter_swap()
  11. pytorch中的Variable详解
  12. Voxengo音频插件合集:Voxengo Total Bundle Mac
  13. 怎么录制自己手机上的视频
  14. 蓝天白云青山绿水还有清风吹斜阳......
  15. Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
  16. 获取iframe里面的数据
  17. Rust 常见问题之一:Blocking waiting for file lock on package cache
  18. 去重的几种方法(部分)
  19. 羊皮卷二我要用心中的爱来迎接今天(中英对照)
  20. 【深度之眼Python基础+数据科学入门训练营】第四章 组合数据类型

热门文章

  1. 对象的当前状态使该操作无效
  2. javascript 对象(四)
  3. GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断...
  4. 关于跨域的处理的几种方法的整理
  5. KMP模式匹配 三(弦)
  6. 如何制作透明背景的图片
  7. java多线程中的死锁情况读书笔记
  8. mybatis--面向接口编程
  9. winform自定义用户控件
  10. css 修改占位符(placeholder)默认颜色、字体