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

day23 机器学习管道 Pipeline

在机器学习中,数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤,我们可以使用 Pipeline(管道)来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念,并通过一个信贷数据集的案例,展示如何使用 Pipeline 构建高效的机器学习工作流。

一、基础概念

(一)Pipeline 的定义

在机器学习领域,Pipeline(管道或流水线)是一个用于组合多个 估计器(estimator)的 estimator。它按照一定的顺序执行每个估计器的 fittransform 方法,从而实现数据的预处理、特征提取和模型训练等功能。

(二)转换器(Transformer)与估计器(Estimator)

  • 转换器(Transformer):用于对数据进行预处理和特征提取。它实现了 transform 方法,例如归一化、标准化、特征选择等。转换器是无状态的,不会存储数据的状态信息,仅根据输入数据学习转换规则。

  • 估计器(Estimator):用于拟合数据并进行预测。它实现了 fitpredict 方法,例如分类器、回归器等。估计器是有状态的,会在训练过程中存储数据的状态信息,用于后续的预测。

(三)Pipeline 的优势

  1. 防止数据泄露:在交叉验证中,Pipeline 可以确保预处理步骤在每个折叠内独立执行,避免数据泄露。

  2. 简化超参数调优:可以同时调优预处理步骤和模型的参数。

  3. 代码复用性高:Pipeline 将操作和参数分离,便于复用和维护。

二、代码演示

(一)没有 Pipeline 的代码

以下是传统的机器学习代码示例,展示了手动完成数据预处理、特征提取和模型训练的完整流程:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 加载数据
data = pd.read_csv('data.csv')# 数据预处理
# 1. 标签编码
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# 2. 独热编码
data = pd.get_dummies(data, columns=['Purpose'])# 3. 处理缺失值
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()
for feature in continuous_features:mode_value = data[feature].mode()[0]data[feature].fillna(mode_value, inplace=True)# 4. 划分数据集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)
y = data['Credit Default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 5. 模型训练与评估
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrixrf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)print("默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred))

(二)使用 Pipeline 的代码

以下是使用 Pipeline 构建机器学习工作流的代码示例:

1. 导入库和加载数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsefrom sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.model_selection import train_test_split# 加载原始数据
data = pd.read_csv('data.csv')
print("原始数据加载完成,形状为:", data.shape)
2. 分离特征和标签,划分数据集
# 分离特征和标签
y = data['Credit Default']
X = data.drop(['Credit Default'], axis=1)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("\n数据集划分完成 (预处理之前)。")
print("X_train 形状:", X_train.shape)
print("X_test 形状:", X_test.shape)
print("y_train 形状:", y_train.shape)
print("y_test 形状:", y_test.shape)
3. 定义预处理步骤
# 识别不同类型的列
object_cols = X.select_dtypes(include=['object']).columns.tolist()
numeric_cols = X.select_dtypes(exclude=['object']).columns.tolist()# 有序特征
ordinal_features = ['Home Ownership', 'Years in current job', 'Term']
ordinal_categories = [['Own Home', 'Rent', 'Have Mortgage', 'Home Mortgage'],['< 1 year', '1 year', '2 years', '3 years', '4 years', '5 years', '6 years', '7 years', '8 years', '9 years', '10+ years'],['Short Term', 'Long Term']
]
ordinal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('encoder', OrdinalEncoder(categories=ordinal_categories, handle_unknown='use_encoded_value', unknown_value=-1))
])# 标称特征
nominal_features = ['Purpose']
nominal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])# 连续特征
continuous_features = [f for f in X.columns if f not in ordinal_features + nominal_features]
continuous_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('scaler', StandardScaler())
])# 构建 ColumnTransformer
preprocessor = ColumnTransformer(transformers=[('ordinal', ordinal_transformer, ordinal_features),('nominal', nominal_transformer, nominal_features),('continuous', continuous_transformer, continuous_features)],remainder='passthrough'
)
4. 构建完整 Pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', RandomForestClassifier(random_state=42))
])
5. 使用 Pipeline 进行训练和评估
print("\n--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
start_time = time.time()pipeline.fit(X_train, y_train)
pipeline_pred = pipeline.predict(X_test)end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")print("\n默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, pipeline_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, pipeline_pred))

三、总结

通用机器学习Pipeline的逻辑顺序

1. 加载数据
  • 读取数据集。

  • 初步查看数据的基本信息(如形状、列名、数据类型等)。

2. 分离特征和标签
  • 确定目标变量(标签)和特征变量。

  • 分离特征和标签。

3. 划分数据集
  • 将数据划分为训练集和测试集(可选:划分验证集)。

4. 定义预处理步骤
  • 识别不同类型的特征

    • 分类特征(包括有序分类特征和无序分类特征)。

    • 连续特征。

  • 分类特征处理

    • 有序分类特征:填充缺失值 + 有序编码。

    • 无序分类特征:填充缺失值 + 独热编码。

  • 连续特征处理

    • 填充缺失值。

    • 数据标准化或归一化。

  • 其他特征处理

    • 特殊特征(如文本特征、日期特征等)的处理。

5. 构建预处理转换器(ColumnTransformer)
  • 使用ColumnTransformer将不同的预处理步骤应用于不同的特征列。

6. 选择模型
  • 根据问题类型(分类、回归、聚类等)选择合适的模型。

7. 构建完整的Pipeline
  • 将预处理步骤和模型串联起来,形成完整的Pipeline。

8. 训练和评估模型
  • 在训练集上训练模型。

  • 在测试集上评估模型性能。

  • 输出评估指标(如准确率、召回率、F1分数、混淆矩阵等)。

9. 调优和验证(可选)
  • 使用交叉验证、网格搜索等方法对模型进行调优。

  • 验证模型的泛化能力。

通用机器学习Pipeline模板代码

以下是基于上述逻辑顺序的通用机器学习Pipeline模板代码:

# 导入基础库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 导入机器学习相关库
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder, StandardScaler, MinMaxScaler
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, mean_squared_error, r2_score# 1. 加载数据
data = pd.read_csv('data.csv')  # 替换为你的数据文件路径
print("原始数据加载完成,形状为:", data.shape)# 2. 分离特征和标签
target_column = 'target'  # 替换为目标变量的列名
y = data[target_column]
X = data.drop(columns=[target_column])# 3. 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("\n数据集划分完成。")
print("X_train 形状:", X_train.shape)
print("X_test 形状:", X_test.shape)
print("y_train 形状:", y_train.shape)
print("y_test 形状:", y_test.shape)# 4. 定义预处理步骤
# 识别不同类型的特征
categorical_features = X.select_dtypes(include=['object', 'category']).columns.tolist()
numeric_features = X.select_dtypes(exclude=['object', 'category']).columns.tolist()# 有序分类特征(如果有)
ordinal_features = []  # 替换为有序分类特征的列名
ordinal_categories = []  # 替换为有序分类特征的类别顺序# 无序分类特征
nominal_features = [col for col in categorical_features if col not in ordinal_features]# 预处理转换器
numeric_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='mean')),  # 或 'median', 'most_frequent'('scaler', StandardScaler())  # 或 MinMaxScaler()
])ordinal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('encoder', OrdinalEncoder(categories=ordinal_categories, handle_unknown='use_encoded_value', unknown_value=-1))
])nominal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, numeric_features),('ord', ordinal_transformer, ordinal_features),('nom', nominal_transformer, nominal_features)],remainder='passthrough'  # 对未指定的列进行处理(如保留或丢弃)
)# 5. 选择模型
# 替换为你选择的模型,例如 RandomForestClassifier, LogisticRegression, LinearRegression 等
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=42)# 6. 构建完整的 Pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', model)
])# 7. 训练和评估模型
print("\n--- 模型训练与评估 ---")
start_time = time.time()# 训练模型
pipeline.fit(X_train, y_train)# 预测测试集
y_pred = pipeline.predict(X_test)end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")# 输出评估指标
print("\n模型在测试集上的分类报告:")
print(classification_report(y_test, y_pred))
print("模型在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, y_pred))# 可选:输出其他评估指标
print("\n模型在测试集上的准确率:", accuracy_score(y_test, y_pred))
print("模型在测试集上的均方误差(MSE):", mean_squared_error(y_test, y_pred))
print("模型在测试集上的R²分数:", r2_score(y_test, y_pred))# 8. 调优和验证(可选)
# 使用 GridSearchCV 或其他方法进行超参数调优
# param_grid = {
#     'classifier__n_estimators': [100, 200],
#     'classifier__max_depth': [None, 10, 20]
# }
# grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
# grid_search.fit(X_train, y_train)
# print("\n最佳参数:", grid_search.best_params_)
# print("最佳模型的交叉验证分数:", grid_search.best_score_)

通用Pipeline的说明

  1. 数据加载和预处理

    • 数据加载部分可以根据实际数据文件格式进行调整(如pd.read_csvpd.read_excel等)。

    • 预处理步骤可以根据数据的具体情况(如缺失值处理策略、标准化方法等)进行调整。

  2. 特征处理

    • 分类特征和连续特征的处理方法可以根据具体需求进行选择(如是否需要标准化、是否需要独热编码等)。

    • 特殊特征(如文本特征、日期特征)的处理可以根据具体需求添加额外的转换器。

  3. 模型选择

    • 模型部分可以根据问题类型(分类、回归、聚类等)选择合适的模型。

  4. 调优和验证

    • 调优部分可以根据实际需求选择是否使用GridSearchCV或其他调优方法。

    • 交叉验证和超参数调优可以根据具体需求进行配置。

@浙大疏锦行

相关文章:

day23 机器学习管道 Pipeline

在机器学习中&#xff0c;数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤&#xff0c;我们可以使用 Pipeline&#xff08;管道&#xff09;来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念&#xff0c;并…...

The Graph:区块链数据索引的技术架构与创新实践

作为Web3生态的核心基础设施&#xff0c;The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈&#xff0c;还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...

nginx配置sse流传输问题:直到所有内容返回后才往下传输

一、禁用缓冲&#xff08;如实时流传输&#xff09;&#xff1a; location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输&#xff08;默认已启用&#xff09; }...

使用Daemonset部署日志收集守护进程

1.DaemonSet简介&#xff1a; 在Kubernetes&#xff08;简称k8s&#xff09;中&#xff0c;DaemonSet是一种控制器&#xff0c;用于确保集群中的每个&#xff08;或部分&#xff09;节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务&#xff0c;如…...

在Mac环境下搭建Docker环境的全攻略

在Mac环境下搭建Docker环境的全攻略 在现代软件开发中&#xff0c;Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理&#xff0c;还极大地提升了开发效率。然而&#xff0c;在某些公司环境中&#xff0c;桌面版的Docker可能会被禁用&#xff0c;这给开发工作带…...

Go 语言 slice(切片) 的使用

序言 在许多开发语言中&#xff0c;动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组&#xff0c;因为对于数组的大小大多数情况下我们是不能事先就确定好的&#xff0c;所以他不够灵活。动态数组通过提供自动扩容的机制&#xff0c;极大地提升了开发效率。这…...

C++ string比较、string随机访问、string字符插入、string数据删除

string的字符串进行比较&#xff0c;代码见下。 #include<iostream>using namespace std;int main() {// 1 comparestring s1 "aab";string t11 "aab";int r11 s1.compare(t11);cout << "1: " << r11 << endl;strin…...

web 自动化之 Unittest 应用:测试报告装饰器断言

文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...

前端基础之《Vue(16)—Vue脚手架介绍》

一、脚手架环境 1、推荐windows10 Node vue/cli(webpack) 2、测试node安装成功 node -v npm -v 3、什么是脚手架 Vue CLI&#xff1a;CLI就是脚手架的意思 脚手架生成一套模板&#xff08;入口文件、配置文件、目录结构&#xff09; 4、常用的包管理器 npm&#xff1a;no…...

MySQL 事务(一)

文章目录 CURD不加控制&#xff0c;会有什么问题CURD满足什么属性&#xff0c;能解决上述问题&#xff1f;什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…...

Dsp38335利用Bootloader实现在线升级的技术原理

1. Bootloader概述 Bootloader&#xff08;引导加载程序&#xff09;是嵌入式系统中负责在设备启动时加载和启动主程序的代码。它通常在系统的闪存或其他非易失性存储器中&#xff0c;并在系统上电时首先执行。Bootloader不仅完成启动操作&#xff0c;还能够提供后续的程序升级…...

【TVM 教程】microTVM PyTorch 教程

Apache TVM 是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Mehrdad Hessar 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用…...

利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试

在SLAM系统中&#xff0c;相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机&#xff0c;正确的内参和外参不仅能提高位姿估计精度&#xff0c;还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定&#xff0c;并…...

old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images

Kali linux 全部版本镜像下载 目的 出于该网站不稳定原因&#xff0c;故爬取下载链接&#xff0c;以便网友下载老版本kali from bs4 import BeautifulSoup import requests from urllib.parse import urljoinbase_url "http://old.kali.org/kali-images/" visite…...

基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术

研究背景 航空航天、能源动力领域&#xff0c;测量三维瞬态流场的速度场信息对于理解流体力学行为、优化系统设计非常关键。 传统三维粒子图像测速技术如Tomo层析PIV&#xff0c;因依赖多相机阵列&#xff0c;存在系统体积、操作复杂&#xff0c;在封闭空间测量存在困难&#…...

Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面

前期使用Tauri(2.5.1)Leptos(0.7.8)写了一个自用桌面小程序&#xff0c;详见&#xff1a;使用Tauri 2.3.1Leptos 0.7.8开发桌面小程序汇总_tauri 小程序-CSDN博客。 在此基础上&#xff0c;尝试给程序添加启动界面&#xff0c;效果如下图所示。 1. 添加启动画面设置 在src-ta…...

Gmsh划分网格|四点矩形

先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…...

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket&#xff0c;也就是I/O多路复用&#xff0c;是一种常见的并发编程技术&#xff0c;它允许单个线程或进程同时监视多个输入/输出&#xff08;I/O&#xff09;流&#xff08;例如网络连接、文件描述符&#xff09;。当任何一个I/O流准备好进行读写操…...

一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!

从事企业软件项目开发的同学们一定对 ER 图很熟悉&#xff0c;可以帮助用户快速厘清数据库结构&#xff0c;方便后续维护和优化。但是在日常工作中&#xff0c;面对复杂的数据结构&#xff0c;整理表设计文档对于每一位DBA来说都很头大&#xff0c;需要将设计细节转化为条理清晰…...

学习黑客 windows 设置与控制面板详解

Windows 设置与控制面板详解&#xff1a;双剑合璧的系统配置工具 ⚙️&#x1f527; 学习目标&#xff1a;理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言&#xff1a;双界面的系统配置世界 &#x1f310; 在Windows操作系统中&#xff0c;有两个强大的…...

pytorch模型画质增强简单实现

使用数据增强技术可以增加数据集中图像的多样性&#xff0c;从而提高模型的性能和泛化能力&#xff0c;主要的图像增强技术包括。 亮度&#xff0c;对比度调节 在开始图像大小的调整之前我们需要导入数据&#xff08;图像以眼底图像为例&#xff09;。 from PIL import Image f…...

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…...

Linux文件编程——read函数与lseek函数

一、read函数 在 Linux 文件编程中&#xff0c;read 函数是一个系统调用&#xff0c;用于从文件描述符&#xff08;File Descriptor&#xff09;指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...

STM32 变量存储

一、存储区划分与变量分类 STM32的存储空间分为Flash&#xff08;非易失性&#xff09;和RAM&#xff08;易失性&#xff09;两大区域&#xff1a; ​Flash存储器 ​代码段&#xff08;Code&#xff09;​&#xff1a;存储程序指令和常量&#xff08;如字符串、const变量&…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略​

在 Oracle 数据库运行过程中&#xff0c;内存管理是影响其性能的关键因素之一。大页内存&#xff08;Large Pages&#xff09;作为一种优化内存使用的技术&#xff0c;能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念&#xff0c;并详细阐述 Oracle 在…...

HashMap中哈希值与数组坐标的关联

目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法&#xff08;Separate Chaining&#xff09; 4.2. 开放寻址法&#xff08;Open Addressing&#xff09; 1、线性探测&#xff08;Linear Probing&#xff09; 2、二次探测&a…...

GBK与UTF-8编码问题(1)

1. 问题现象 我们在编译.py的python代码时&#xff0c;有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”&#xff0c;代码中有中文字符&#xff0c;这似乎和文件的编码方…...

大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...

单片机学习Day08--相邻流水灯

一&#xff0c;题目&#xff1a;同时点亮相邻的两个灯&#xff0c;并实现流水设计。 亮的是0&#xff1b; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...

邮件营销应对高退信率的策略

一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具&#xff0c;全面清洗邮件列表&#xff0c;剔除无效、过期或格式错误的邮箱地址&#xff0c;确保邮件精准送达有效收件人&#xff0c;从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...

无线定位之 三 SX1302 网关源码 thread_gps 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository &#xff1a;数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中&#xff0c;层级结构&#xff08;Layered Architecture&#xf…...

【操作系统】零拷贝技术

1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候&#xff0c;数据传输的工作全部交给DMA控制器&#xff0c;而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下&#xff1a; read(file, tmp_buf, len); write(socket, tmp_buf,…...

从零构建高性能桌面应用:GPUI Component全解析与实战指南

简介 高性能UI组件库正在重塑桌面应用开发的格局,而GPUI Component作为新兴的Rust桌面UI组件库,凭借其卓越的跨平台支持能力、GPU加速渲染和企业级功能特性,正成为构建现代化高性能桌面应用的首选。本文将从零开始,全面解析GPUI Component的核心特性、安装配置流程,并通过…...

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…...

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

Java高频面试之并发编程-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;volatile 实现原理是什么&#xff1f; volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…...

Spring Boot异步任务失效的8大原因及解决方案

Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...

嵌入式Linux I2C驱动开发详解

文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA&#xff08;数据线&#xff09; 和…...

基于 Spring Boot 瑞吉外卖系统开发(十二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十二&#xff09; 菜品删除 单击“批量删除”和“删除”时&#xff0c;会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...

基于 51 单片机的 PWM 电机调速系统实现

51 单片机通过定时器来实现 PWM(脉冲宽度调制)控制,这是一种通过调整方波信号的占空比来控制输出功率的技术。下面详细介绍如何使用 51 单片机实现 PWM 控制并应用于电机调速。 1. PWM 控制原理 PWM 信号是一个周期性的方波,通过调整高电平时间(Ton)与周期(T)的比例(…...

wordpress主题分享

发布于&#xff1a;Eucalyptus-Blog 一、引言 大家对WordPress免费主题都非常感兴趣&#xff0c;但是一般收费的WordPress主题功能才多&#xff0c;其实有很多开源的免费WordPress主题都很不错&#xff0c;对于很多新建站的小伙伴&#xff0c;这些主题完全足够用了。这里就分享…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…...

git如何将本地 dev 分支与远程 dev 分支同步

要让本地 dev 分支与远程 dev 分支完全同步&#xff08;丢弃本地多余的提交记录&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 1. ​​获取远程最新状态​ git fetch origin dev # 拉取远程 dev 分支的最新提交&#xff0c;但不会修改本地代码 IDEA中点击fetc…...

自动化测试与功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无…...

python3数据类型

常见python3数据类型 Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#x…...