Python基础学习-Day23
目录
- 基础概念
- 转换器(transformer)
- 估计器(estimator)
- 管道(pipeline)
- 实例
- pipeline
基础概念
pipeline在机器学习领域可以翻译为“管道”,也可以翻译为“流水线”,是机器学习中一个重要的概念。
在机器学习中,通常会按照一定的顺序对数据进行预处理、特征提取、模型训练和模型评估等步骤,以实现机器学习模型的训练和评估。为了方便管理这些步骤,我们可以使用pipeline来构建一个完整的机器学习流水线。
pipeline是一个用于组合多个估计器(estimator)的 estimator,它实现了一个流水线,其中每个估计器都按照一定的顺序执行。在pipeline中,每个估计器都实现了fit和transform方法,fit方法用于训练模型,transform方法用于对数据进行预处理和特征提取。
在此之前我们先介绍下 转换器(transformer)和估计器(estimator)的概念。
转换器(transformer)
转换器(transformer)是一个用于对数据进行预处理和特征提取的 estimator,它实现一个 transform 方法,用于对数据进行预处理和特征提取。转换器通常用于对数据进行预处理,例如对数据进行归一化、标准化、缺失值填充等。转换器也可以用于对数据进行特征提取,例如对数据进行特征选择、特征组合等。转换器的特点是无状态的,即它们不会存储任何关于数据的状态信息(指的是不存储内参)。转换器仅根据输入数据学习转换规则(比如函数规律、外参),并将其应用于新的数据。因此,转换器可以在训练集上学习转换规则,并在训练集之外的新数据上应用这些规则。
常见的转换器包括数据缩放器(如StandardScaler、MinMaxScaler)、特征选择器(如SelectKBest、PCA)、特征提取器(如CountVectorizer、TF-IDFVectorizer)等。
之前我们都是说对xxxx类进行实例化,现在可以换一个更加准确的说法,如下:
# 导入StandardScaler转换器
from sklearn.preprocessing import StandardScaler# 初始化转换器
scaler = StandardScaler()# 1. 学习训练数据的缩放规则(计算均值和标准差),本身不存储数据
scaler.fit(X_train)# 2. 应用规则到训练数据和测试数据
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)# 也可以使用fit_transform一步完成
# X_train_scaled = scaler.fit_transform(X_train)
估计器(estimator)
估计器(Estimator)是实现机器学习算法的对象或类。它用于拟合(fit)数据并进行预测(predict)。估计器是机器学习模型的基本组成部分,用于从数据中学习模式、进行预测和进行模型评估。
估计器的主要方法是fit和predict。fit方法用于根据输入数据学习模型的参数和规律,而predict方法用于对新的未标记样本进行预测。估计器的特点是有状态的,即它们在训练过程中存储了关于数据的状态信息,以便在预测阶段使用。估计器通过学习训练数据中的模式和规律来进行预测。因此,估计器需要在训练集上进行训练,并使用训练得到的模型参数对新数据进行预测。
常见的估计器包括分类器(classifier)、回归器(regresser)、聚类器(clusterer)。
from sklearn.linear_model import LinearRegression
# 创建一个回归器
model = LinearRegression()
# 在训练集上训练模型
model.fit(X_train_scaled, y_train)
# 对测试集进行预测
y_pred = model.predict(X_test_scaled)
管道(pipeline)
了解了分类器和估计器,所以可以理解为在机器学习是由转换器(Transformer)和估计器(Estimator)按照一定顺序组合在一起的来完成了整个流程。
机器学习的管道(Pipeline)机制通过将多个转换器和估计器按顺序连接在一起,可以构建一个完整的数据处理和模型训练流程。在管道机制中,可以使用Pipeline类来组织和连接不同的转换器和估计器。Pipeline类提供了一种简单的方式来定义和管理机器学习任务的流程。
管道机制是按照封装顺序依次执行的一种机制,在机器学习算法中得以应用的根源在于,参数集在新数据集(比如测试集)上的重复使用。且代码看上去更加简洁明确。这也意味着,很多个不同的数据集,只要处理成管道的输入形式,后续的代码就可以复用。(这里为我们未来的python文件拆分做铺垫),也就是把很多个类和函数操作写进一个新的pipeline中。
这符合编程中的一个非常经典的思想:don’t repeat yourself。(dry原则),也叫做封装思想,我们之前提到过类似的思想的应用: 函数、类,现在我们来说管道。
Pipeline最大的价值和核心应用场景之一,就是与交叉验证和网格搜索等结合使用,来:
- 防止数据泄露: 这是在使用交叉验证时,Pipeline自动完成预处理并在每个折叠内独立fit/transform的关键优势。
- 简化超参数调优: 可以方便地同时调优预处理步骤和模型的参数。
下面我们将对我们的信贷数据集进行管道工程,重构整个代码。之所以提到管道,是因为后续你在阅读一些经典的代码的时候,尤其是官方文档,非常喜欢用管道来构建代码,甚至深度学习中也有类似的代码,初学者往往看起来很吃力。
实例
没有做管道工程的代码
# 先运行之前预处理好的代码
import pandas as pd
import pandas as pd #用于数据处理和分析,可处理表格数据。
import numpy as np #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt #用于绘制各种类型的图表
import seaborn as sns #基于matplotlib的高级绘图库,能绘制更美观的统计图形。
import warnings
warnings.filterwarnings("ignore")# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
data = pd.read_csv('data.csv') #读取数据# 先筛选字符串变量
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 标签编码
home_ownership_mapping = {'Own Home': 1,'Rent': 2,'Have Mortgage': 3,'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)# Years in current job 标签编码
years_in_job_mapping = {'< 1 year': 1,'1 year': 2,'2 years': 3,'3 years': 4,'4 years': 5,'5 years': 6,'6 years': 7,'7 years': 8,'8 years': 9,'9 years': 10,'10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)# Purpose 独热编码,记得需要将bool类型转换为数值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新读取数据,用来做列名对比
list_final = [] # 新建一个空列表,用于存放独热编码后新增的特征名
for i in data.columns:if i not in data2.columns:list_final.append(i) # 这里打印出来的就是独热编码后的特征名
for i in list_final:data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名# Term 0 - 1 映射
term_mapping = {'Short Term': 0,'Long Term': 1
}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列
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) #用众数填充该列的缺失值,inplace=True表示直接在原数据上修改。# 最开始也说了 很多调参函数自带交叉验证,甚至是必选的参数,你如果想要不交叉反而实现起来会麻烦很多
# 所以这里我们还是只划分一次数据集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1) # 特征,axis=1表示按列删除
y = data['Credit Default'] # 标签
# 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%训练集,20%测试集from sklearn.ensemble import RandomForestClassifier #随机森林分类器from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# --- 1. 默认参数的随机森林 ---
# 评估基准模型,这里确实不需要验证集
print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
import time # 这里介绍一个新的库,time库,主要用于时间相关的操作,因为调参需要很长时间,记录下会帮助后人知道大概的时长
start_time = time.time() # 记录开始时间
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train) # 在训练集上训练
rf_pred = rf_model.predict(X_test) # 在测试集上预测
end_time = time.time() # 记录结束时间print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
print("\n默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred))
pipeline
# 导入基础库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time # 导入 time 库
import warnings# 忽略警告
warnings.filterwarnings("ignore")# 设置中文字体和负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 导入 Pipeline 和相关预处理工具
from 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)
# print(data.head()) # 可以打印前几行看看原始数据
# --- 分离特征和标签 (使用原始数据) ---
y = data['Credit Default'] # 标签
X = data.drop(['Credit Default'], axis=1) # 特征 (axis=1 表示按列删除)print("\n特征和标签分离完成。")
print("特征 X 的形状:", X.shape)
print("标签 y 的形状:", y.shape)# --- 划分训练集和测试集 (在任何预处理之前划分) ---
# 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%训练集,20%测试集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)# --- 定义不同列的类型和它们对应的预处理步骤 ---
# 这些定义是基于原始数据 X 的列类型来确定的# 识别原始的 object 列 (对应你原代码中的 discrete_features 在预处理前)
object_cols = X.select_dtypes(include=['object']).columns.tolist()
# 识别原始的非 object 列 (通常是数值列)
numeric_cols = X.select_dtypes(exclude=['object']).columns.tolist()# 有序分类特征 (对应你之前的标签编码)
# 注意:OrdinalEncoder默认编码为0, 1, 2... 对应你之前的1, 2, 3...需要在模型解释时注意
# 这里的类别顺序需要和你之前映射的顺序一致
ordinal_features = ['Home Ownership', 'Years in current job', 'Term']
# 定义每个有序特征的类别顺序,这个顺序决定了编码后的数值大小
ordinal_categories = [['Own Home', 'Rent', 'Have Mortgage', 'Home Mortgage'], # Home Ownership 的顺序 (对应1, 2, 3, 4)['< 1 year', '1 year', '2 years', '3 years', '4 years', '5 years', '6 years', '7 years', '8 years', '9 years', '10+ years'], # Years in current job 的顺序 (对应1-11)['Short Term', 'Long Term'] # Term 的顺序 (对应0, 1)
]
# 构建处理有序特征的 Pipeline: 先填充缺失值,再进行有序编码
ordinal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用众数填充分类特征的缺失值('encoder', OrdinalEncoder(categories=ordinal_categories, handle_unknown='use_encoded_value', unknown_value=-1)) # 进行有序编码
])
print("有序特征处理 Pipeline 定义完成。")# 标称分类特征 (对应你之前的独热编码)
nominal_features = ['Purpose'] # 使用原始列名
# 构建处理标称特征的 Pipeline: 先填充缺失值,再进行独热编码
nominal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用众数填充分类特征的缺失值('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False)) # 进行独热编码, sparse_output=False 使输出为密集数组
])
print("标称特征处理 Pipeline 定义完成。")# 连续特征 (对应你之前的众数填充 + 添加标准化)
# 从所有列中排除掉分类特征,得到连续特征列表
# continuous_features = X.columns.difference(object_cols).tolist() # 原始X中非object类型的列
# 也可以直接从所有列中排除已知的有序和标称特征
continuous_features = [f for f in X.columns if f not in ordinal_features + nominal_features]# 构建处理连续特征的 Pipeline: 先填充缺失值,再进行标准化
continuous_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')), # 用众数填充缺失值 (复现你的原始逻辑)('scaler', StandardScaler()) # 标准化,一个好的实践 (如果你严格复刻原代码,可以移除这步)
])
print("连续特征处理 Pipeline 定义完成。")
# --- 构建 ColumnTransformer ---
# 将不同的预处理应用于不同的列子集,构造一个完备的转化器
# ColumnTransformer 接收一个 transformers 列表,每个元素是 (名称, 转换器对象, 列名列表)
preprocessor = ColumnTransformer(transformers=[('ordinal', ordinal_transformer, ordinal_features), # 对 ordinal_features 列应用 ordinal_transformer('nominal', nominal_transformer, nominal_features), # 对 nominal_features 列应用 nominal_transformer('continuous', continuous_transformer, continuous_features) # 对 continuous_features 列应用 continuous_transformer],remainder='passthrough' # 如何处理没有在上面列表中指定的列。# 'passthrough' 表示保留这些列,不做任何处理。# 'drop' 表示丢弃这些列。
)print("\nColumnTransformer (预处理器) 定义完成。")
# print(preprocessor) # 可以打印 preprocessor 对象看看它的结构# --- 构建完整的 Pipeline ---
# 将预处理器和模型串联起来
# 使用你原代码中 RandomForestClassifier 的默认参数和 random_state
pipeline = Pipeline(steps=[('preprocessor', preprocessor), # 第一步:应用所有的预处理 (我们刚刚定义的 ColumnTransformer 对象)('classifier', RandomForestClassifier(random_state=42)) # 第二步:随机森林分类器 (使用默认参数和指定的 random_state)
])print("\n完整的 Pipeline 定义完成。")
# print(pipeline) # 可以打印 pipeline 对象看看它的结构
使用 Pipeline 进行训练和评估
# --- 1. 使用 Pipeline 在划分好的训练集和测试集上评估 ---
# 完全模仿你原代码的第一个评估步骤print("\n--- 1. 默认参数随机森林 (训练集 -> 测试集) ---") # 使用你原代码的输出文本
# import time # 引入 time 库 (已在文件顶部引入)start_time = time.time() # 记录开始时间# 在原始的 X_train, y_train 上拟合整个Pipeline
# Pipeline会自动按顺序执行 preprocessor 的 fit_transform(X_train),
# 然后用处理后的数据和 y_train 拟合 classifier
pipeline.fit(X_train, y_train)# 在原始的 X_test 上进行预测
# Pipeline会自动按顺序执行 preprocessor 的 transform(X_test),
# 然后用处理后的数据进行 classifier 的 predict
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))
@浙大疏锦行
相关文章:
Python基础学习-Day23
目录 基础概念转换器(transformer)估计器(estimator)管道(pipeline) 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”,也可以翻译为“流水线”,是机器学习中一个重…...
【Ubuntu】扩充磁盘大小
sudo apt-get install gparted 安装完成后,搜索gparted软件,打开gparted 参考...
数据治理域——日志数据采集设计
摘要 本文主要介绍了Web页面端日志采集的设计。首先阐述了页面浏览日志采集,包括客户端日志采集的实现方式、采集内容及技术亮点。接着介绍了无线客户端端日志采集,包括UserTrack的核心设计、移动端与浏览器端采集差异以及典型应用场景崩溃分析。最后探…...
Dinky 安装部署并配置提交 Flink Yarn 任务
官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 ,但是官方文档最新稳定版为 1.1 ,所以先选择 1.1.0,验证通过后,再尝试 1.2.3 ,发现 1…...
杰理-701-手表sdk无法电脑连接经典蓝牙
杰理-701-手表sdk无法电脑连接经典蓝牙 只有手机可以连接经典蓝牙播放音乐,电脑无法连接,需要关闭emitter功能 交流q群:187115320...
Timsort 算法
文章目录 1 基础理解1.1 定义和原理1.2 工作原理 2 算法实现2.1 Python 代码实现2.1.1 代码2.1.2 核心逻辑计算最小运行长度(calc_min_run(n))插入排序(insertion_sort(arr, left, right)) 2.2 Java 代码实现2.3 C 代码实现 3 逻辑…...
Go构建高并发权重抽奖系统:从设计到优化全流程指南
引言:为何需要专业抽奖系统? 在现代互联网应用中,抽奖系统被广泛用于营销活动、用户激励等场景。一个好的抽奖系统需要满足: 公平性:确保概率分布准确高性能:支持高并发抽奖请求安全性:防止作…...
深度学习计算
深度学习的飞速发展离不开强大的计算能力支撑。从张量计算到 GPU 加速,从自动微分到分布式计算,深度学习计算的每一项技术都如同精密仪器中的关键齿轮,推动着模型性能的不断提升。本文深入剖析深度学习计算的核心技术、优化策略以及前沿趋势&…...
【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析
本文深入剖析Android蓝牙协议栈中HID设备(BT-HD)服务的初始化与启用流程,从接口初始化、服务掩码管理、服务请求路由到属性回调通知,完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理,揭示服务启用的核心机制&…...
Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
在 Kotlin 中,Unit 类型和 Java 中的 void 关键字都用于表示“没有返回值”的函数,但它们在设计理念、类型系统和实际使用中有显著的区别。 1 Kotlin 中的 Unit 类型 表示无返回值: 当函数不返回有意义的值时,Kotlin 使用 Unit …...
Gemini 2.5 推动视频理解进入新时代
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Spark Streaming 内部运行机制详解
核心思想:将实时数据流切割为“微批次”,利用 Spark Core 的批处理能力进行准实时计算。 1. 核心流程拆解 数据接收(Input Data Stream) 输入源:Kafka、Flume、Socket 等实时数据流。 接收器(Receiver&…...
Feign+Resilience4j实现微服务熔断机制:原理与实战
引言:为什么需要熔断器? 在微服务架构中,服务间的依赖调用变得非常普遍。想象一下这样的场景:订单服务依赖支付服务,支付服务又依赖银行网关服务。如果银行网关服务出现故障,故障会向上蔓延,导…...
什么是SparkONYarn模式
1. 什么是 Spark on YARN? Spark on YARN 是 Apache Spark 的一种部署模式,允许 Spark 应用程序在 Hadoop YARN 集群上运行,充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成,使企业能够在同一集群…...
鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目
本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...
操作系统:内存管理
目录 1、主要目标 2、核心概念和技术 2.1 物理内存与虚拟内存 2.2 内存分页机制 2.3 页面置换算法 3、监控与性能优化 3.1 查看物理内存 3.2 查看虚拟内存 3.3 性能问题 1> 内存不足(OOM) 2> 内存泄漏 3> 内存碎片 3.4 性能优化策…...
腾讯优化DeepSeek的DeepEP通信框架:开启AI大模型训练新时代
事件背景 在人工智能(AI)技术迅猛发展的当下,大规模AI模型训练的需求与日俱增。高效的数据通信成为了提升AI模型训练效率的关键环节。混合专家模型(MoE)作为一种高效的大模型架构,通过动态分配专家网络处理…...
CSP-J普及组第一轮真题单选题专项训练(二)
CSP-J普及组第一轮真题单选题专项训练(二) (共15题,每2分,共30分;每题有且有一个正确选项) 1、一个 32 位整型变量占用()个字节。 A. 32 B. 128 C. 4 D. 8 2、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 3、编译器的主要…...
Android加固工具测评:易盾、顶象、360加固哪款更好用?
应用安全已经成为每个开发者和企业关注的核心问题。随着黑客技术的不断升级,单一的安全措施已经无法有效应对各种复杂的攻击威胁。Android加固工具应运而生,成为了提升应用安全的关键利器。这些加固工具通过代码混淆、加密、防篡改等技术手段,…...
C++ 字符格式化输出
文章目录 一、简介二、实现代码三、实现效果 一、简介 这里使用std标准库简单实现一个字符格式化输出,方便后续的使用,它有点类似Qt中的QString操作。 二、实现代码 FMTString.hpp #pragma once#include <cmath> #include <cstdio> #include…...
内存中的“BANK”
一、BANK的定义与物理结构 基本概念 BANK(存储体) 是内存芯片内部的一个逻辑或物理分区,每个BANK由存储单元阵列、地址解码电路和缓冲器组成,用于分块管理内存操作。 作用:通过并行操作减少访问冲突,提升内…...
D-Pointer(Pimpl)设计模式(指向实现的指针)
Qt 的 D-Pointer(Pimpl)设计模式 1. Pimpl 模式简介 Pimpl(Pointer to Implementation)是一种设计模式,用于将类的接口与实现分离,从而隐藏实现细节,降低编译依赖,提高代码的可维护…...
XA协议和Tcc
基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议,旨在保证在多个参与者(通常是不同的数据库或资源管理器)共同参与的事务中,所有参与者要么都提交事务,要么都回滚事务,从而维护数据的一致性。 你…...
我们该如何使用DeepSeek帮我们减负?
在当今信息爆炸的时代,如何快速获取、筛选和分析信息已经成为各行各业的重要能力。而DeepSeek作为一种先进的智能搜索和信息挖掘工具,能够帮助用户快速找到所需的信息,并从海量数据中提取出有用的洞见。在这篇博文中,我们将深入探…...
25.5.13
感觉很久没有写算法题了,先来个滑动队列模板题试试水,就是用双端队列来实现会很方便,拿结构体来记录是第几个数和数的值即可,再定义两个双端队列,一个使他的值单调递增一个使他的值单调递减 使队头元素为最大值或者是最…...
软件测试——面试八股文(入门篇)
今天给大家分享软件测试面试题入门篇,看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下ÿ…...
脑机接口技术:开启人类与机器融合的新时代
摘要 脑机接口(BCI)技术作为一项前沿科技,正在逐步打破人类与机器之间的沟通障碍,为医疗、娱乐、教育等多个领域带来前所未有的变革。本文将详细介绍脑机接口技术的基本原理、发展现状、应用场景以及面临的挑战和未来发展趋势&…...
当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?
极端天气频发的当下,一场台风、一次暴雨就可能让电力系统陷入瘫痪。但你知道吗?如今的电网已能通过三维地理信息与气象数据的深度融合,在灾害来临前精准锁定风险,甚至将停电事故减少七成以上。这背后,正是国网电力空间…...
C++ string数据查找、string数据替换、string子串获取
string查找示例见下,代码见下,以及对应运行结果见下: #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…...
2025.5.13山东大学软件学院计算机图形学期末考试回忆版本
2025.5.13山东大学软件学院计图期末考试回忆版本 学院:软件学院 老师:周元峰、魏广顺 一、简述题(2024原题一) 1.图形绘制流水线的组成和作用 2.双缓冲机制是什么,有什么作用? 3.Delaunay三角化的四条…...
思极地图使用
思极地图api文档:思极地图开放平台 | 思极地图API SDK 思极地图SDK: <script src"https://map.sgcc.com.cn/maps?v3.0.0"></script> <script src"https://map.sgcc.com.cn/products/js-sdk/v3/assets/js/jquery-1.11.1.min.js&quo…...
Fiori学习专题四十一:表单控件
上节课我们学习了一些单一控件的使用,但是我们发现在页面内每个控件都占用了一行,这样子就显得不太好看,这节课我们引入一个表单控件来美化一下这个页面。 1.学习表单控件FORM之前我们先了解下哪些情况会使用到表单控件,最常见的场…...
基于STM32、HAL库的TDA7719TR音频接口芯片驱动程序设计
一、简介: TDA7719TR 是 NXP Semiconductors 推出的高性能音频处理芯片,专为汽车音响系统设计。它集成了 AM/FM 收音机调谐器、音频处理和音量控制功能,支持 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 STM32L4 与 TDA7719TR 硬件连接如下…...
Baklib智能云平台加速企业数据治理
Baklib数据治理核心优势 Baklib作为新一代企业级知识中台,其数据治理能力建立在全资产统一管理与智能化处理框架的双重基础之上。通过构建知识中台的核心架构,平台实现了图文、音视频等多模态数据的标准化存储与动态标签体系,有效解决传统管…...
面试中被问到谈谈你对threadlocal的理解
ThreadLocal 的核心理解 1. 基本概念 ThreadLocal 是 Java 提供的线程局部变量机制,用于在多线程环境中为每个线程维护独立的变量副本,实现线程隔离。其核心思想是空间换时间,通过避免共享变量带来的同步开销,提升并发性能。 2…...
Spring Boot 应用中实现基本的 SSE 功能
SSE 技术简介 SSE(Server-Sent Events)是一种允许服务器主动向客户端推送数据的技术。它基于 HTTP 长连接,使用简单,特别适合实时数据更新场景,如股票行情、新闻推送等。与 WebSocket 相比,SSE 更轻量级&a…...
【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)
文章目录 为什么选择VSCode作为C/C开发工具?一、VSCode安装过程(超简单!)二、VSCode中文界面设置(再也不用对着英文发愁!)三、安装C/C插件(编程必备神器!)四、…...
【MyBatis-8】MyBatis对象关联查询详解:高效处理复杂关系映射
在实际业务开发中,我们经常需要处理对象之间的关联关系,如一对一、一对多、多对多等。MyBatis作为一款优秀的持久层框架,提供了强大的对象关联查询能力。本文将深入探讨MyBatis中各种关联查询的实现方式、适用场景及最佳实践。 1. MyBatis关…...
Java基础(IO)
所有操作都在内存,不能长时间保存,IO主要在硬盘,可以长时间保存。 一、File类 File类被定义为文件和目录路径名的抽象表示形式,这是因为 File 类既可以表示文件也可以表示目录,他们都通过对应的路径来描述。 提供构…...
Trae IDE:AI深度集成的智能开发环境
(以高效人机协作重塑编程体验) 概述 Trae IDE(发音 /treɪ/)是一款深度集成AI能力的现代化开发工具,结合传统IDE的完备功能与前沿AI技术,提供智能问答、代码自动补全、跨文件编程及AI Agent驱动的自动化开…...
网站开发过程中样式忽然不显示问题
老规矩,先听故事:今天我开发网站时候遇到一个问题,就开发的这个网站在默认127.0.0.1运行样式有bug显示不出来,之前都可以,就完全一样的代码,之前可以正常运行显示,今天忽然就不行了,…...
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题
双种群进化算法:动态约束处理与资源分配解决约束多目标优化问题 一、引言 约束多目标优化问题(CMOPs)在工程设计、资源分配等领域广泛存在,其核心是在满足多个约束条件的同时优化多个目标函数。传统方法往往难以平衡约束满足与目…...
如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接
在使用 CentOS 7 的虚拟机时,我们通常需要配置静态 IP 地址,以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址,并确保配置在系统重启后依然生效。 步骤 1:检查虚拟机网络接口 首先…...
整数和浮点数转换时的精度损失
文章目录 int和float转换时的精度损失float组成解析(1) 32位浮点数的结构(2)示例:解析一个浮点数(3)偏置值的作用(4) 偏置值为什么是127?(5&#…...
Protobuf工具
#region 知识点一 什么是 Protobuf //Protobuf 全称是 protocol - buffers(协议缓冲区) // 是谷歌提供给开发者的一个开源的协议生成工具 // 它的主要工作原理和我们之前做的自定义协议工具类似 // 只不过它更加的完善&…...
闭包原理与常见陷阱
引言 JavaScript闭包是前端开发中既强大又神秘的概念,它不仅是面试的必考题,更是解决复杂问题的利器。闭包让函数能够记住并访问其创建时的作用域,即使在该函数在其定义环境之外执行。 然而,正如许多强大的工具一样,…...
用 VS Code / PyCharm 编写你的第一个 Python 程序
用ChatGPT做软件测试 编写你的第一个 Python 程序——不只是“Hello, World”,而是构建认知、习惯与未来的起点 “第一行代码,是一个开发者认知世界的方式。” 编程的入门,不只是运行一个字符串输出,更是开始用计算机思维来理解、…...
Linux学习心得问题整理(一)
day01 运维初识 理解云计算运维目的是什么? 搭建云计算更有利于我们在公网环境下方便访问我们服务 节省时间的成本,能随时随地方便调度硬件资源,更容易搭建软件服务 安全可靠,售后期间支持技术支持维护 什么是运维?…...
在scala中sparkSQL连接masql并添加新数据
以下是 Scala 中使用 Spark SQL 连接 MySQL 并添加数据的完整代码示例(纯文本): 1. 准备连接参数(需替换实际信息) scala val jdbcUrl "jdbc:mysql://localhost:3306/test_db?useUnicodetrue&characterEnc…...
STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…...