当前位置: 首页 > news >正文

C++实现用户分组--学习

第一步实现:ETL的设计分三部分:数据抽取(Data Extraction)、数据的清洗转换(Data Transformation)、数据的加载(Data Loading).

构建一个数据容器类,其中包含转换后的MNIST手写数据。还实现了一个数据处理程序,该数据处理程序将提取并转换数据以供将来的算法实现使用。

#ifndef __DATA_H
#define __DATA_H#include <iostream>
#include <vector>
#include "stdint.h"
#include "stdio.h"// 数据类
class data
{std::vector<uint8_t>* feature_vector; // 特征向量uint8_t label; // 标签int enum_label; // 枚举标签 A->1, B->2, C->3, D->4, E->5, F->6, G->7, H->8, I->9, J->10public:data(); // 构造函数~data(); // 析构函数void set_feature_vector(std::vector<uint8_t> *); // 设置特征向量void append_to_feature_vector(uint8_t); // 向特征向量追加数据void set_label(uint8_t); // 设置标签void set_enum_label(int); // 设置枚举标签int get_feature_vector_size(); // 获取特征向量大小uint8_t get_label(); // 获取标签uint8_t get_enumerated_label(); // 获取枚举标签std::vector<uint8_t>* get_feature_vector(); // 获取特征向量};#endif

这段代码定义了一个名为 data 的类,用于处理特征向量和标签。首先,代码使用了头文件保护机制,通过 #ifndef#define 和 #endif 来防止重复包含头文件 data.hpp

在 data 类中,有三个私有成员变量:feature_vector 是一个指向 std::vector<uint8_t> 的指针,用于存储特征向量;label 是一个 uint8_t 类型的变量,用于存储标签;enum_label 是一个整数,用于存储枚举标签,注释中说明了不同字符对应的整数值(例如,A 对应 1,B 对应 2,依此类推)。

在公共成员函数部分,data 类提供了一些方法来操作和访问这些成员变量:

  • void set_feature_vector(std::vector<uint8_t> *):设置特征向量的指针。
  • void append_to_feature_vector(uint8_t):向特征向量中追加一个 uint8_t 类型的值。
  • void set_label(uint8_t):设置标签。
  • void set_enum_label(int):设置枚举标签。

此外,还有一些方法用于获取成员变量的值:

  • int get_feature_vector_size():获取特征向量的大小。
  • uint8_t get_label():获取标签。
  • uint8_t get_enumerated_label():获取枚举标签。
  • std::vector<uint8_t>* get_feature_vector():获取特征向量的指针。

这些方法使得 data 类能够灵活地操作和访问特征向量和标签,适用于需要处理大量数据的场景。

#include "data.hpp"data::data(){feature_vector = new std::vector<uint8_t>;
}data::~data()
{delete feature_vector;
}void data::set_feature_vector(std::vector<uint8_t> *vect)
{feature_vector = vect;
}void data::append_to_feature_vector(uint8_t val)
{feature_vector->push_back(val);
}void data::set_label(uint8_t val)
{label = val;
}void data::set_enum_label(int val)
{enum_label = val;
}int data::get_feature_vector_size()
{return feature_vector->size();
}uint8_t data::get_label()
{return label;
}
uint8_t data::get_enumerated_label()
{return enum_label;
}std::vector<uint8_t>* data::get_feature_vector()
{return feature_vector;
}

这段代码实现了 data 类的构造函数、析构函数以及多个成员函数。首先,代码包含了头文件 data.hpp,以确保类的声明可用。

构造函数 data::data() 初始化了 feature_vector,为其分配了一个新的 std::vector<uint8_t> 对象。析构函数 data::~data() 则负责释放该内存,防止内存泄漏。

set_feature_vector 方法接受一个指向 std::vector<uint8_t> 的指针,并将其赋值给 feature_vectorappend_to_feature_vector 方法向 feature_vector 中追加一个 uint8_t 类型的值。

set_label 和 set_enum_label 方法分别设置 label 和 enum_label 的值。

get_feature_vector_size 方法返回 feature_vector 的大小。get_label 和 get_enumerated_label 方法分别返回 label 和 enum_label 的值。最后,get_feature_vector 方法返回 feature_vector 的指针。

总体来说,这段代码实现了 data 类的基本功能,使其能够管理和操作特征向量和标签。

2.处理数据

#ifndef __DATA_HANDLER_H
#define __DATA_HANDLER_H#include<fstream>
#include "stdint.h"
#include"data.hpp"
#include<vector>
#include<string>
#include<map>
#include<unordered_set>// 数据处理类
class data_handler
{std::vector<data *> *data_array; // 数据数组std::vector<data *> *training_data; // 训练数据std::vector<data *> *testing_data; // 测试数据std::vector<data *> *validation_data; // 验证数据int num_classes; // 类别数量int feature_vector_size; // 特征向量大小std::map<uint8_t, int> class_map; // 类别映射const double TRAIN_SET_PERCENTAGE = 0.75; // 训练集比例const double TEST_SET_PERCENTAGE = 0.20; // 测试集比例const double VALIDATION_SET_PERCENTAGE = 0.05; // 验证集比例public:data_handler(); // 构造函数~data_handler(); // 析构函数void read_feature_vector(std::string path); // 读取特征向量void read_label_vector(std::string path); // 读取标签向量void split_data(); // 分割数据void count_classes(); // 统计类别数量uint32_t convert_to_little_endian(const unsigned char* bytes); // 转换为小端序std::vector<data *> *get_training_data(); // 获取训练数据std::vector<data *> *get_testing_data(); // 获取测试数据std::vector<data *> *get_validation_data(); // 获取验证数据};#endif

这个类名为 data_handler,用于处理数据集的读取、分割和分类等操作。以下是对该类的详细解释:

成员变量

  1. std::vector<data *> *data_array

    • 指向一个 std::vector 容器的指针,该容器存储了所有的数据对象的指针。
  2. std::vector<data *> *training_data

    • 指向一个 std::vector 容器的指针,该容器存储了训练数据集的数据对象的指针。
  3. std::vector<data *> *testing_data

    • 指向一个 std::vector 容器的指针,该容器存储了测试数据集的数据对象的指针。
  4. std::vector<data *> *validation_data

    • 指向一个 std::vector 容器的指针,该容器存储了验证数据集的数据对象的指针。
  5. int num_classes

    • 存储数据集中类别的数量。
  6. int feature_vector_size

    • 存储特征向量的大小。
  7. std::map<uint8_t, int> class_map

    • 一个映射,用于将类别标签(uint8_t 类型)映射到整数值。
  8. const double TRAIN_SET_PERCENTAGE

    • 常量,表示训练数据集所占的比例,值为 0.75。
  9. const double TEST_SET_PERCENTAGE

    • 常量,表示测试数据集所占的比例,值为 0.20。
  10. const double VALIDATION_SET_PERCENTAGE

    • 常量,表示验证数据集所占的比例,值为 0.05。

构造函数和析构函数

  1. data_handler()

    • 构造函数,用于初始化 data_handler 对象。
  2. ~data_handler()

    • 析构函数,用于释放 data_handler 对象所占用的资源。

成员函数

  1. void read_feature_vector(std::string path)

    • 从指定路径读取特征向量数据。
  2. void read_label_vector(std::string path)

    • 从指定路径读取标签数据。
  3. void split_data()

    • 将数据集分割为训练集、测试集和验证集。
  4. void count_classes()

    • 统计数据集中各个类别的数量。
  5. uint32_t convert_to_little_endian(const unsigned char* bytes)

    • 将字节数组转换为小端格式的 uint32_t 类型。
  6. std::vector<data *> *get_training_data()

    • 返回指向训练数据集的指针。
  7. std::vector<data *> *get_testing_data()

    • 返回指向测试数据集的指针。
  8. std::vector<data *> *get_validation_data()

    • 返回指向验证数据集的指针。

总结

data_handler 类提供了一系列方法,用于读取数据、分割数据集、统计类别数量以及获取训练集、测试集和验证集。通过这些方法,可以方便地管理和处理数据集,适用于机器学习和数据分析等场景。

相关文章:

C++实现用户分组--学习

第一步实现&#xff1a;ETL的设计分三部分&#xff1a;数据抽取(Data Extraction)、数据的清洗转换(Data Transformation)、数据的加载(Data Loading). 构建一个数据容器类&#xff0c;其中包含转换后的MNIST手写数据。还实现了一个数据处理程序&#xff0c;该数据处理程序将提…...

鸿蒙华为商城APP案例

模拟器运行效果如下&#xff1a; 鸿蒙版APP-华为商城-演示视频...

回首遥望-C++内存对齐的思考

这一章节主要巩固一下学习C/C时内存对齐相关的内容&#xff01; 文章目录 什么是内存对齐&#xff1f;为什么要有内存对齐&#xff1f;如何进行内存对齐&#xff1f;致谢&#xff1a; 什么是内存对齐&#xff1f; 这里不提及一堆啰嗦概念&#xff0c;就结合实际出发&#xff0…...

力扣 LeetCode 704. 二分查找(Day1:数组)

解题思路&#xff1a; 二分查找主要分为[ left , right ]左闭右闭和[ left , right )左闭右开两种 此处采取[ left , right ]左闭右闭写法 注意&#xff1a; 1. right的初始化取值 2. while中取等 3. right mid -1 ; class Solution {public int search(int[] nums, i…...

【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解

目录 前言 正文 1.AUTOSAR标准描述 1.1 EcuM_CheckWakeup用来干什么 1.2 EcuM_CheckWakeup在哪里被调用 1.3 EcuM_CheckWakeup的使用场景 1.3.1 GPT中断检测唤醒源 1.3.2 EcuM轮询GPT检测唤醒源 1.3.3 ICU中断检测唤醒源 1.3.4 其他 2.AUTOSR工具相关配置 3.唤醒源…...

Zabbix基础信息概述

1.Zabbix概述 Zabbix 是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix 使用灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于邮件的告警&#xff0c;这样可以快速反馈服务器的问题。基于已存储的数据&#xff0c;Zabbix 提供了出色的报告和数据可…...

SpringBoot(十二)SpringBoot配置redis

接下来我要实现的webscoket即时聊天中需要使用到redis,我先在项目中配置一下redis。 我这里再windows中做测试,关于redis的安装请移步《Redis(三)Windows系统安装redis》 一:在pom.xml中添加依赖 <!-- springboot redis start --><dependency><grou…...

Pycharm安装

Pycharm安装 返回主目录Pycharm安装1. Pycharm下载PyCharm官网下载地址下载安装包 2. Pycharm安装第一步&#xff1a;双击安装包第二步&#xff1a;进入安装程序第三步&#xff1a;选择安装路径第四步&#xff1a;选择安装选项第五步&#xff1a;安装第六步&#xff1a;完成安装…...

OpenAI大改下代大模型方向,scaling law撞墙?AI社区炸锅了

有研究预计&#xff0c;如果 LLM 保持现在的发展势头&#xff0c;预计在 2028 年左右&#xff0c;已有的数据储量将被全部利用完。届时&#xff0c;基于大数据的大模型的发展将可能放缓甚至陷入停滞。 来自论文《Will we run out of data? Limits of LLM scaling based on hum…...

技术整合与生态构建:Lyft与Mobileye引领自动驾驶新纪元

在科技日新月异的今天&#xff0c;自动驾驶技术正逐渐从科幻电影走进现实生活&#xff0c;成为出行服务领域的一股不可忽视的力量。近日&#xff0c;北美网约车巨头Lyft与自动驾驶技术领先者Mobileye宣布联手合作&#xff0c;共同推动自动驾驶汽车出行服务的广泛商业化进程。此…...

利用huffman树实现对文件A先编码后解码

利用huffman树实现对文件A先编码后解码&#xff0c;范围为ASCII码0-255的值&#xff0c;如何解决特殊符号问题是一个难点&#xff0c;注意应使用unsigned char存储数据&#xff0c;否则ASCII码128-255的值可能会出问题&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #includ…...

第三十九章 基于VueCli自定义创建项目

目录 1. 选择创建模式 2. 选择需要的功能 3. 选择历史模式还是哈希模式 ​4.CSS预处理器 5. 选择ESLint规则 6. 开始创建项目 ​7. 自定义项目最终结构 1. 选择创建模式 输入创建的项目名&#xff0c;创建项目&#xff1a; 这里选择自定义模式&#xff1a; 2. 选择需要…...

网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施

在数字媒体时代&#xff0c;视频点播已成为用户获取信息和娱乐的重要方式。EasyPlayer.js作为一款流行的点播播放器&#xff0c;以其强大的功能和易用性受到广泛欢迎。然而&#xff0c;在使用过程中&#xff0c;用户可能会遇到视频地址无法播放的问题&#xff0c;这不仅影响用户…...

LLaMA-Factory学习笔记(1)——采用LORA对大模型进行SFT并采用vLLM部署的全流程

该博客是我根据自己学习过程中的思考与总结来写作的&#xff0c;由于初次学习&#xff0c;可能会有错误或者不足的地方&#xff0c;望批评与指正。 1. 安装 1.1 LLaMA-Factory安装 安装可以参考官方 readme &#xff08;https://github.com/hiyouga/LLaMA-Factory/blob/main/…...

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…...

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…...

战略共赢 软硬兼备|云途半导体与知从科技达成战略合作

2024年11月5日&#xff0c;江苏云途半导体有限公司&#xff08;以下简称“云途”或“云途半导体”&#xff09;与上海知从科技有限公司&#xff08;以下简称“知从科技”&#xff09;达成战略合作&#xff0c;共同推动智能汽车领域高端汽车电子应用的开发。 云途半导体与知从科…...

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…...

elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案

没有使用selectableRange 禁用时分秒&#xff0c;是因为他会禁止每天的时分秒。 我们需要解决的是当开始时间、结束时间是同一天时&#xff0c; 开始时间不能超过结束时间。 如果直接清空&#xff0c;用户体验不好。所以用watch监听赋值&#xff0c;当前操作谁&#xff0c;它不…...

Oracle 聚集因子factor clustering

文章目录 聚集因子(Factor clustering)举例说明查询聚集因子聚集因子的优化结论 最近发现突然忘记聚集因子的原理了&#xff0c;故整理记录一下 聚集因子(Factor clustering) 在Oracle中&#xff0c;聚集因子&#xff08;Clustering Factor&#xff09;用于衡量数据在表中存储…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...