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…

C#中获取FTP服务器文件

1、从ftp下载pdf的方法 public static void DownloadPdfFileFromFtp(string ftpUrl,string user,string password string localPath) { // 创建FtpWebRequest对象 FtpWebRequest request (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method WebRequestMethods.Ftp…

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

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

深入了解ASPICE标准:提升汽车软件开发与质量管理的利器

随着汽车行业的快速发展和技术创新,汽车软件的开发和质量管理的重视程度不断提升。ASPICE(Automotive Software Process Improvement and Capability Determination)标准作为一种专门针对汽车软件开发过程的改进和能力评定的框架,…

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

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

8.Redis之hash类型

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

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

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

包和依赖管理:Python的pip和conda使用指南

包和依赖管理:Python的pip和conda使用指南 对于Python新手来说,包和依赖管理可能是一个令人困惑的概念。但不用担心,本文将用浅显易懂的语言,详细介绍如何使用Python的两个主要包管理工具:pip和conda。我们还会探讨在安…

为 AWS 子账户添加安全组修改权限

文章目录 步骤 1:创建 IAM 策略步骤 2:附加策略到子账户步骤 3:验证权限 本文档将操作如何为 AWS 子账户(IAM 用户或角色)添加修改安全组的权限,包括 AuthorizeSecurityGroupIngress 和 RevokeSecurityGr…

解决uniApp 中不能直接使用 Axios 的问题

最近在使用 uniapp 进行小程序开发的时候,发现 uniapp 不能直接使用 axios,需要自己进行封装一个 http 库使用,于是有了这个项目。 项目地址:https://www.npmjs.com/package/uni-app-wxnetwork-tool 该包的功能介绍: u…

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

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

软考 系统架构设计师之考试感悟2

接前一篇文章:软考 系统架构设计师之考试感悟 今天是2024年5月25号,是个人第二次参加软考系统架构师考试的正日子。和上次一样,考了一天,身心俱疲。天是阴的,心是沉的,感觉比上一次更加沉重。仍然有诸多感悟…

express框架下后端获取req.body报错undefined

express框架下后端获取req.body报错undefined_express服务器post中data为undefine-CSDN博客 /*** 特殊说明:Express是一个单线程服务器器程序【必须存在指定的顺序调用,否则无法达到预期的效果】*//*** 第一步:创建一个Express实例对象,并且在匹配路由之…

【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深度神经网络结合…