1.手动LogisticRegression模型的训练和预测

通过这个示例,可以了解逻辑回归模型的基本原理和训练过程,同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。

过程:

  1. 生成了一个模拟的二分类数据集:通过随机生成包含两个特征的数据data_x,并基于一定规则生成对应的二分类标签数据data_y
  2. 创建了一个手动实现的逻辑回归模型LogisticRegressionManually,其中包括:
    • 初始化函数__init__:初始化模型的权重参数w和偏置参数b
    • 前向传播函数forward:计算给定输入数据的预测值。
    • 损失函数loss_func:定义了交叉熵损失函数,用于评估模型的预测性能。
    • 训练函数train:在每个epoch中,遍历数据集的每个样本,计算预测值、损失值、梯度,并利用梯度下降法更新模型参数。
  3. 实例化LogisticRegressionManually类,然后调用train方法对模型进行训练。
  4. 在训练过程中,打印每个epoch的损失值。

演示:

# 生成模拟的二分类数据集,其中X数据是随机生成的,Y数据根据一定规则生成。import torch
import torch.nn.functional as Fn_items = 1000
n_features = 2
learning_rate = 0.001
epochs = 100# 置了随机种子,以确保每次运行代码时生成的随机数相同,从而使结果具有可重现性。
torch.manual_seed(123) 
# 生成了一个大小为(1000, 2)的张量data_x,其中包含1000个样本,每个样本具有2个特征。这里使用torch.randn生成标准正态分布的随机数作为数据,并将数据类型转换为float。
data_x = torch.randn(size=(n_items, n_features)).float()
# 成了标签数据data_y,通过对第一个特征乘以0.5和第二个特征乘以1.5的差值进行判断,如果差值大于0就将标签设为1,否则为0。这样生成了一个二分类标签数据集,同样将数据类型转换为float。
data_y = torch.where(torch.subtract(data_x[:, 0]*0.5, data_x[:, 1]*1.5) > 0, 1., 0.).float()# print(data_x)
# print(data_y)

# 在每个epoch中,遍历数据集的每个样本,计算预测值、损失值、梯度,利用梯度下降法更新模型参数。通过这种方式训练模型可以逐渐优化模型参数,以达到更好的预测效果。class LogisticRegressionManually(object):# 初始化函数__init__def __init__(self):# w是一个大小为(n_features, 1)的张量,用于存储权重参数,并且设置了requires_grad=True表示需要计算梯度;self.w = torch.randn(size=(n_features, 1), requires_grad=True)# b是一个大小为(1, 1)的张量,用于存储偏置参数,并且设置了requires_grad=Trueself.b = torch.zeros(size=(1, 1), requires_grad=True)# 前向传播函数forwarddef forward(self, x):# 过矩阵乘法计算预测值y_hat:将参数w转置后与输入数据x相乘,并加上偏置b后通过F.sigmoid函数进行激活,最终返回激活后的预测值。y_hat = F.sigmoid(torch.matmul(self.w.transpose(0, 1), x) + self.b)return y_hat# 损失函数loss_func@staticmethoddef loss_func(y_hat, y):# 定义了交叉熵损失函数。通过计算实际标签y和预测值y_hat之间的交叉熵损失来评估模型的预测性能。return -(torch.log(y_hat)*y + (1-y)*torch.log(1-y_hat))# 训练函数traindef train(self):# 在每个epoch中,遍历数据集中的每个样本for epoch in range(epochs):for step in range(n_items):# 利用模型的前向传播函数forward计算当前样本的预测值y_hat。y_hat = self.forward(data_x[step])# 获取当前样本的真实标签yy = data_y[step]# 调用损失函数loss_func计算预测值与真实标签之间的损失。loss = self.loss_func(y_hat, y)# 利用反向传播计算损失对模型参数的梯度loss.backward()# 进入torch.no_grad()上下文管理器,保证在该范围内的操作不会被记录用于自动微分。with torch.no_grad():# 更新权重参数w和偏置参数b,通过梯度下降法更新参数,learning_rate是学习率。self.w.data -= learning_rate * self.w.gradself.b.data -= learning_rate * self.b.grad# 清零梯度,以便进行下一次参数更新时重新计算梯度。self.w.grad.data.zero_()self.b.grad.data.zero_()print("Epoch: %03d, Loss: %.3f" % (epoch, loss.item()))

lrm = LogisticRegressionManually()
lrm.train()

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/16045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秋招突击——算法打卡——5/25、5/26——寻找两个正序数组的中位数

题目描述 自我尝试 首先,就是两个有序的数组进行遍历,遍历到一半即可。然后求出均值,下述是我的代码。但这明显是有问题的,具体错误的代码如下。计算复杂度太高了,O(n),所以会超时&…

数据结构--《二叉树》

二叉树 1、什么是二叉树 二叉树(Binar Tree)是n(n>0)个结点的优先集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树构成。 这里给张图,能更直观的感受二叉树&#xff1…

GDPU JavaWeb mvc模式

搭建一个mvc框架的小实例。 简易计算器 有一个名为inputNumber.jsp的页面提供一个表单,用户可以通过表单输入两个数和运算符号提交给Servlet控制器;由名为ComputerBean.java生成的JavaBean负责存储运算数、运算符号和运算结果,由名为handleCo…

简单好用的文本识别方法--付费的好用,免费的更有性价比-记笔记

文章目录 先说付费的进入真题,免费的来喏!PixPin微信 先说付费的 直达网址!!! 进入真题,免费的来喏! PixPin 商店里就有 使用示例: 可以看到:贴在桌面上的图片可以复制图片中的文字,真的很…

Springboot+Vue+ElementUI开发前后端分离的员工管理系统01--系统介绍

项目介绍 springboot_vue_emp是一个基于SpringbootVueElementUI实现的前后端分离的员工管理系统 功能涵盖: 系统管理:用户管理、角色管理、菜单管理、字典管理、部门管理出勤管理:请假管理、考勤统计、工资发放、工资统计、离职申请、个人资…

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…

最重要的时间表示,柯桥外贸俄语小班课

в第四格 1、与表示“钟点”的数词词组连用 例: в шесть часов утра 在早上六点 в пять тридцать 在五点半 2、与表示“星期”的名词连用 例: в пятницу 在周五 в следующий понедельник …

String类为什么设计成不可变的?

目录 缓存 安全性 线程安全 hashCode缓存 性能 其实这个问题我们可以通过缓存、安全性、线程安全和性能几个维度去解析。 缓存 字符串是Java最常用的数据结构,我们都知道字符串大量创建是非常耗费资源的,所以Java中就将String设计为带有缓存的功能…

【python】python tkinter 计算器GUI版本(模仿windows计算器 源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

17.分类问题

机器学习分类问题详解与实战 介绍 在机器学习中,分类问题是一类常见的监督学习任务,其目标是根据输入特征将数据样本划分为预先定义的类别之一。分类问题广泛应用于各个领域,如图像识别、自然语言处理、金融风险评估等。本文将详细介绍机器…

Spring Cloud 项目中使用 Swagger

Spring Cloud 项目中使用 Swagger 关于方案的选择 在 Spring Cloud 项目中使用 Swagger 有以下 4 种方式: 方式一 :在网关处引入 Swagger ,去聚合各个微服务的 Swagger。未来是访问网关的 Swagger 原生界面。 方式二 :在网关处引…

RedHat9 | DNS剖析-配置辅助DNS服务器

一、实验环境 1、辅助域名DNS服务器 DNS通过划分为若干个区域进行管理,每一个区域由1台或多台DNS服务器负责解析,如果仅仅采用1台DNS服务器,在DNS服务器出现故障后,用户将无法完成解析。 辅助DNS服务器的优点 容灾备份&#x…

区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DNN-KDE深度神经网络结合…

MySQL数据处理增删改

数据处理增删改DML 由于约束,以下操作都有可能执行失败(后面讲约束) 插入数据 INSERT 基础添加:VALUES 值的顺序必须和表中字段顺序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加: 值的顺序和指定…

MT7628原厂Uboot修改交互串口

工作中,遇到用户用Skylab的SKW92A模组,在参考设计时,将UART接口预留错的情况,对于这种情况,需要将原厂SDK默认的交互串口UART0,改为UART1。在开发过程中,经常需要在Uboot阶段升级固件&#xff0…

【Linux部署】【pig前端部署】Linux安装- docker/docker-compose/nginx (使用docker优雅部署nginx)

🌸🌸 Linux安装- docker/docker-compose/nginx 优雅部署 🌸🌸 一、一键安装jdk yum install -y java-1.8.0-openjdk.x86_64验证 二、安装docker yum list docker-ce --showduplicates | sort -rsudo yum install -y yum-utils …

LabVIEW波纹补偿器无线监测系统

LabVIEW波纹补偿器无线监测系统 在石油化工、冶金及电力等行业中,波纹补偿器作为一种重要的补偿性元件,其安全稳定的运行对管道输送系统的可靠性至关重要。开发了一种基于LabVIEW的波纹补偿器无线监测系统,通过实时监测波纹补偿器的工作状态…

嵌入式单片机寄存器操作与实现方法

大家好,今天给大家分享一下,单片机中寄存器该如何操作与实现。 “芯片里面的寄存器访问方式一般是: 1.可使用地址访问,2.可使用指令访问,3.不可访问” 第一:挂载到内存地址总线上了的 挂载到内存地址总线上了的,可以使用分配到的地址访问 如下是STM32单片机存储器映像…

单条16g和双条8g哪个好

单条16g和双条8g各有优劣,具体选择要根据个人需求和电脑配置来决定。 以下是一些参考信息: •单条16g内存的价格比双条8g内存的价格低,而且16g的内存容量大,一条内存十分的方便。 •两条8g内存可以组成双通道,电脑运行速度要快一些。 •对于普通使用电脑的人群与热衷于…

Sourcetree安装教程及使用

1 Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端,它由Atlassian开发,提供了跨平台的支持,可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码,不需要在命令行中输入复杂的Git命令&#x…