ml_edm:基于成本敏感的时间序列早期分类Python工具包详解

news2026/5/24 5:59:55
1. 项目概述在工业监控、医疗诊断和金融风控这些领域我们常常面对一个共同的困境数据是随着时间一点点“流”进来的但决策却不能等到所有数据都齐备了再做。比如一台设备传感器传回的振动信号刚开始出现异常你是立刻停机检修还是再等等看以防是误报等可能错过最佳维修窗口导致灾难性故障不等又可能因为信息不足而“误诊”造成不必要的生产中断。这个“等”与“不等”的权衡就是早期决策Early Decision Making的核心。它不是一个简单的二选一而是一个在决策准确性Accuracy和决策及时性Earliness之间寻找最优解的持续博弈。传统的时序分析或机器学习模型往往假设我们拥有完整的、固定长度的序列数据。但在真实世界里这种“奢侈”的情况很少。更多时候我们需要在数据流还在进行中就做出尽可能靠谱的判断。这就是早期时间序列分类Early Classification of Time Series, ECTS要解决的难题。它要求模型不仅学得好还要“学得快”能在数据到达的早期阶段就触发决策同时将误判和延迟带来的综合成本降到最低。然而ECTS的研究虽然火热算法层出不穷从经典的EDSC、ECTS到近年的ECONOMY-γ、CALIMERA但实际应用的门槛却不低。每个算法都有自己的实现逻辑、评估标准代码散落在各个论文的附录或个人仓库里缺乏统一的框架。研究者想复现对比工程师想落地应用都得从头造轮子费时费力。ml_edm这个Python工具包的出现正是为了终结这种混乱。它像一个精心整理的“兵器库”将主流的ECTS算法收纳其中并用一套清晰、模块化、且与scikit-learn高度兼容的API呈现出来。无论你是想快速验证一个新想法还是需要在生产系统中集成一个可靠的早期预警模块ml_edm都试图为你提供一条捷径。2. 核心设计理念与架构解析ml_edm的设计哲学非常明确模块化、兼容性和成本敏感驱动。它不是把某个算法黑盒化地丢给你而是把早期决策这个复杂过程拆解成几个逻辑清晰的组件让你既能开箱即用也能自由组合甚至自定义。2.1 模块化设计分离“学”与“判”绝大多数ECTS算法都可以抽象为两个核心阶段分类阶段在任意一个可能的时间点t根据到目前为止观测到的部分时间序列X[:, :t]模型需要给出对各个类别的置信度通常是概率分布。这本质上是一个对可变长度序列的分类问题。触发阶段根据当前时刻的分类置信度、历史信息以及一个预设的成本模型决定是立即做出最终决策还是继续等待更多数据。ml_edm将这两个阶段解耦分别对应classification和trigger两大模块。这种设计带来了巨大的灵活性可替换的分类器你可以使用任何scikit-learn兼容的分类器如RandomForestClassifier,HistGradientBoostingClassifier或管道Pipeline作为基础分类器。ml_edm的ClassifiersCollection会为每个你关注的时间戳t克隆并训练一个独立的分类器。可插拔的触发策略你可以从内置的多种触发模型如EconomyGamma,EDSC中选择也可以基于统一的接口实现自己的触发逻辑。这让你可以轻松对比不同触发策略在相同分类基础上的效果。支持端到端模型对于像TEASER这类本身就将分类和触发联合优化的端到端模型ml_edm将其整体实现为一个trigger_model此时分类模块可以省略。2.2 Scikit-learn API兼容性无缝融入现有工作流如果你熟悉scikit-learn那么上手ml_edm几乎零成本。它的核心对象如EarlyClassifier严格遵循了fit()、predict()、score()的范式。fit(X_train, y_train): 训练模型。predict(X_test): 对测试序列进行早期分类预测并返回每个序列的预测类别和做出决策的时刻。score(X_test, y_test): 评估模型默认返回一个三元组(平均成本, 准确率, 平均决策时间)。这是评估早期决策模型的黄金标准。这种设计意味着ml_edm可以轻松嵌入到基于scikit-learn的机器学习管道中进行网格搜索超参数优化、交叉验证等极大提升了实验和工程化的效率。2.3 成本矩阵驱动决策的“指挥棒”这是ml_edm区别于其他时序库最核心、也最精髓的部分。早期决策的本质是一个序列决策问题而任何决策都需要一个衡量标准。ml_edm通过CostMatrices对象将这一标准显式化和量化。CostMatrices需要你定义两个核心成本误分类成本一个n_classes x n_classes的矩阵。misclf_cost[i, j]表示真实类别为i但预测为j的成本。对角线元素通常为0预测正确无成本。这允许你定义非对称成本例如在医疗诊断中将重症误判为轻症的成本远高于将轻症误判为重症的成本。延迟成本一个关于时间t的函数delay_cost(t)。它量化了仅仅因为等待到时间t才做决策所带来的损失。通常这是一个关于t的单调递增函数比如线性函数t / T_max其中T_max是序列的最大可能长度。注意在实际项目中精确获取这两个成本函数非常困难。ml_edm的作者建议即使没有真实成本也应基于业务逻辑进行合理假设例如使用对称的误分类成本和线性延迟成本来构建一个模拟的“地面真理”。因为只有这样模型的优化目标才是明确且一致的。没有成本矩阵早期决策就失去了优化的方向。3. 核心模块深度使用指南理解了设计理念我们来深入看看每个模块的具体使用方法和背后的考量。3.1 成本矩阵的构建与实战意义构建CostMatrices是使用ml_edm的第一步也是最需要结合业务思考的一步。import numpy as np from ml_edm.cost_matrices import CostMatrices # 假设一个三分类问题例如设备状态正常、预警、故障 n_classes 3 max_T 100 # 序列最大长度 timestamps np.arange(10, max_T 1, 10) # 我们关心第10, 20, ..., 100时刻的决策 # 1. 定义误分类成本矩阵 # 这里我们定义一个非对称成本将“故障”误判为“正常”的成本最高。 misclf np.array([ [0, 1, 5], # 真实为“正常”误判为预警成本1误判为故障成本5 [1, 0, 3], # 真实为“预警”误判为正常成本1误判为故障成本3 [5, 3, 0] # 真实为“故障”误判为正常成本5误判为预警成本3 ]) # 2. 定义延迟成本函数 # 采用线性延迟假设每等待一个单位时间成本增加 1/max_T。 # 也可以使用指数函数模拟成本加速增长如 lambda t: (t / max_T) ** 2 def linear_delay(t): return t / max_T # 3. 实例化成本矩阵对象 cost_matrices CostMatrices( timestampstimestamps, n_classesn_classes, misclf_costmisclf, delay_costlinear_delay )实操心得timestamps参数至关重要。它定义了模型在哪些时间点“被允许”做出决策。通常我们不会在每一个时间步都做决策那样计算开销太大。选择关键的时间点如等间隔采样或基于业务知识的特定时间点能极大提升效率。timestamps也直接决定了ClassifiersCollection需要训练多少个分类器。延迟成本函数的选择直接影响模型的“急躁”程度。线性成本下模型对延迟的厌恶是均匀的。如果你希望模型更倾向于早期决策可以使用凸函数如二次函数让延迟成本增长更快。3.2 分类策略应对可变长度序列对于非端到端的ECTS算法我们需要一个策略来处理不同长度的输入序列。ClassifiersCollection是最直接的方法。from aeon.datasets import load_classification from sklearn.ensemble import HistGradientBoostingClassifier from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline from ml_edm.classification import ClassifiersCollection # 加载示例数据 X_train, y_train, _ load_classification(GunPoint, splittrain) X_test, y_test, _ load_classification(GunPoint, splittest) # 创建一个scikit-learn管道作为基础分类器 # 注意时间序列数据可能需要特征工程这里简单使用标准化。 base_pipe make_pipeline( StandardScaler(), HistGradientBoostingClassifier(random_state42) ) # 实例化分类器集合 # 它会为 cost_matrices.timestamps 中的每个时间点训练一个独立的分类器 collection_clf ClassifiersCollection( base_classifierbase_pipe, timestampscost_matrices.timestamps # 使用成本矩阵中定义的时间点 ) # 训练 # 可以传入 cost_matrices某些分类策略可能会利用成本信息进行代价敏感学习 collection_clf.fit(X_train, y_train, cost_matricescost_matrices) # 验证每个时间点分类器的独立性能 for t in cost_matrices.timestamps: X_test_truncated X_test[:, :t] # 截取到时间t的测试数据 acc collection_clf.score(X_test_truncated, y_test, tt) print(fTime {t:3d}: Accuracy {acc:.4f})注意事项维度匹配X_train的形状通常是(n_samples, sequence_length, n_features)。对于单变量时间序列n_features1。ClassifiersCollection在内部会根据指定的t自动将(n_samples, sequence_length, ...)截取/处理为(n_samples, t, ...)以供基础分类器使用。你需要确保你的基础分类器能处理这种格式或者通过自定义转换器将其展平为(n_samples, t * n_features)。内存与计算如果timestamps很多例如100个且基础分类器很复杂如深度学习模型训练ClassifiersCollection会消耗大量资源和时间。prefit_classifiersTrue参数允许你在构建EarlyClassifier时传入已训练好的collection_clf方便模型缓存和复用。特征工程对于时间序列直接使用原始点作为特征可能不够。aeon工具包ml_edm的依赖之一提供了丰富的时序特征提取器如Catch22、TSFresh特征你可以将其集成到base_classifier的管道中以提升分类性能。3.3 触发模型决策时机的掌控者触发模型是早期决策的“大脑”它根据实时信息决定何时停止等待。ml_edm实现了多种策略下表对比了它们的关键特性触发模型核心原理是否端到端支持并行适用场景ProbabilityThreshold当任一类别概率超过固定阈值时触发。否是基线方法简单快速可作为对比基准。EDSC基于“最早可预测时间”概念寻找分类置信度足够高的最早点。否是追求稳定性和可解释性适用于置信度明确的场景。ECDIRE动态规划方法直接优化整个序列决策过程的期望成本。否是理论最优在给定分类器和成本下但计算量相对较大。ECONOMY-γ引入“γ-容忍度”概念允许预测概率在一定范围内波动平衡准确性与时效性。否是当前主流方法之一在多个基准数据集上表现鲁棒是很好的默认选择。CALIMERA较新的方法专注于学习类别在时间上的判别性模式。否是当不同类别的判别性特征出现在不同时间阶段时可能有优势。TEASER端到端神经网络联合学习特征表示、分类和触发策略。是否数据量充足时可能获得更好的性能但可解释性较差训练复杂。from ml_edm.trigger import EconomyGamma, EDSC, ProbabilityThreshold from ml_edm.early_classifier import EarlyClassifier # 方案一使用 ECONOMY-γ 触发策略 trigger_eg EconomyGamma(gamma0.1) # gamma是容忍度参数需调优 # 方案二使用经典的 EDSC 策略 trigger_edsc EDSC(threshold0.95) # threshold是置信度阈值 # 方案三使用简单的概率阈值策略 trigger_pt ProbabilityThreshold(threshold0.9) # 构建早期分类器 early_clf EarlyClassifier( chronological_classifierscollection_clf, # 使用我们之前训练好的分类器集合 trigger_modeltrigger_eg, # 选择触发模型 cost_matricescost_matrices, # 传入成本矩阵 prefit_classifiersTrue # 指明分类器已预训练 ) # 如果分类器未预训练也可以直接调用 fit它会自动训练分类器和触发模型 # early_clf.fit(X_train, y_train) # 进行预测 predictions, decision_times early_clf.predict(X_test, return_decision_timeTrue) print(f预测结果: {predictions[:5]}) print(f决策时刻: {decision_times[:5]}) # 综合评估 avg_cost, accuracy, earliness early_clf.score(X_test, y_test) print(f\n综合评估:) print(f 平均决策成本: {avg_cost:.4f}) print(f 最终准确率: {accuracy:.4f}) print(f 平均决策时间(占全长比): {earliness:.4f})参数调优经验EconomyGamma的gamma参数是关键。gamma越大模型对概率波动越“容忍”倾向于更早做出决策但可能牺牲准确率gamma越小则越保守倾向于等待更确定的信息。通常需要通过交叉验证在验证集上寻找最优值。EDSC和ProbabilityThreshold的threshold参数直观但敏感。过高的阈值可能导致模型迟迟不决策延迟成本激增过低的阈值则导致过早的误判。建议结合成本矩阵进行网格搜索。对于端到端模型如TEASER你需要关注网络结构、学习率等深度学习超参数其训练方式也与传统方法不同通常直接调用fit。4. 完整项目实战工业设备故障早期预警我们用一个模拟的工业设备振动信号预警场景串联起ml_edm的完整使用流程。假设我们有3种设备状态正常Normal、轻微磨损Warning、严重故障Failure。4.1 数据准备与模拟我们使用aeon或sktime来生成或加载一个多变量时间序列分类数据集进行模拟。这里为了演示我们创建一个简单的合成数据集。import numpy as np from sklearn.model_selection import train_test_split from aeon.datasets import make_example_3d_numpy # 生成一个模拟的3分类时间序列数据集 # X形状: (n_instances, n_timestamps, n_features) # y形状: (n_instances,) X, y make_example_3d_numpy( n_cases1000, # 1000个样本 n_timepoints150, # 每个序列150个时间点 n_channels5, # 5个特征通道模拟5个传感器 n_classes3, # 3个类别 random_state42, return_yTrue ) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) print(f训练集形状: {X_train.shape}, 测试集形状: {X_test.shape})4.2 定义业务导向的成本矩阵这是最具业务色彩的一步。假设业务规则如下将“严重故障”误判为“正常”代价最高成本10因为这会导致未预警的停机。将“正常”误判为“故障”代价次之成本5因为这会导致不必要的停机检查。延迟决策的成本随时间线性增长最大延迟成本为1。max_T X.shape[1] # 序列最大长度 150 timestamps np.arange(30, max_T 1, 15) # 从第30个时间点开始每15个点评估一次 n_classes 3 # 定义误分类成本矩阵 (真实类别为行预测类别为列) # 顺序: [Normal, Warning, Failure] misclf_cost np.array([ [0, 2, 5], # 真实Normal: 误判Warning成本2误判Failure成本5 [3, 0, 4], # 真实Warning: 误判Normal成本3误判Failure成本4 [10, 6, 0] # 真实Failure: 误判Normal成本10误判Warning成本6 ]) # 定义线性延迟成本 def delay_cost(t): return t / max_T # 标准化到[0,1]区间 from ml_edm.cost_matrices import CostMatrices cost_matrices CostMatrices( timestampstimestamps, n_classesn_classes, misclf_costmisclf_cost, delay_costdelay_cost )4.3 构建并训练早期分类管道我们选择HistGradientBoostingClassifier作为基础分类器并使用EconomyGamma作为触发策略。from sklearn.ensemble import HistGradientBoostingClassifier from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline from ml_edm.classification import ClassifiersCollection from ml_edm.trigger import EconomyGamma from ml_edm.early_classifier import EarlyClassifier # 1. 创建基础分类管道包含标准化 base_clf make_pipeline( StandardScaler(), HistGradientBoostingClassifier( max_iter200, learning_rate0.05, max_depth5, random_state42 ) ) # 2. 创建分类器集合 print(训练分类器集合...) collection_clf ClassifiersCollection( base_classifierbase_clf, timestampscost_matrices.timestamps ) # 训练可能需要一些时间因为要训练 len(timestamps) 个分类器 collection_clf.fit(X_train, y_train, cost_matricescost_matrices) # 3. 创建触发模型并组装早期分类器 print(配置早期分类器...) trigger EconomyGamma(gamma0.15) # 初始化一个gamma值 early_clf EarlyClassifier( chronological_classifierscollection_clf, trigger_modeltrigger, cost_matricescost_matrices, prefit_classifiersTrue ) # EarlyClassifier 的 fit 方法主要用来训练触发模型的参数如果需要 # 由于我们用了预训练的分类器且EconomyGamma无需额外训练这里可以简单调用或不调用 # early_clf.fit(X_train, y_train) # 如果触发模型需要训练则调用4.4 模型评估与结果分析现在我们在测试集上评估这个早期预警系统的综合性能。print(在测试集上进行评估...) avg_cost, accuracy, earliness early_clf.score(X_test, y_test) print(*50) print(评估报告) print(*50) print(f平均决策成本: {avg_cost:.4f}) print(f最终决策准确率: {accuracy:.4f}) print(f平均决策时间点 (标准化): {earliness:.4f} (约在第 {int(earliness * max_T)} 个时间点)) print(*50) # 查看前几个样本的具体决策情况 preds, decision_times early_clf.predict(X_test[:5], return_decision_timeTrue) print(\n前5个测试样本的决策详情:) for i, (true_label, pred_label, d_time) in enumerate(zip(y_test[:5], preds, decision_times)): status 正确 if true_label pred_label else 错误 print(f样本{i}: 真实[{true_label}] - 预测[{pred_label}] ({status}) | 决策于时间点 {d_time})结果解读平均决策成本这是核心指标综合了误判和延迟的代价。我们的优化目标就是最小化这个值。你可以通过调整成本矩阵的定义或触发模型的参数如gamma来优化它。最终决策准确率与等到序列结束再做决策的传统分类器准确率可比。在早期决策框架下这个值通常会略低因为我们用一定的准确率换取了时间。平均决策时间反映了系统的“敏捷度”。值越小说明系统平均做出决策的时间越早。4.5 与“等到最后”策略的对比为了凸显早期决策的价值我们最好有一个基线对比。最直接的基线就是等到所有数据都接收完t max_T再做决策的传统分类器。from sklearn.metrics import accuracy_score, classification_report # 训练一个使用完整序列的传统分类器 full_seq_clf make_pipeline( StandardScaler(), HistGradientBoostingClassifier(max_iter200, random_state42) ) # 需要将3D数据重塑为2D以供标准分类器使用 (n_samples, n_timestamps * n_features) n_samples_train, n_timestamps, n_features X_train.shape X_train_flat X_train.reshape(n_samples_train, -1) X_test_flat X_test.reshape(X_test.shape[0], -1) full_seq_clf.fit(X_train_flat, y_train) y_pred_full full_seq_clf.predict(X_test_flat) acc_full accuracy_score(y_test, y_pred_full) print(\n与‘等到最后’策略对比:) print(f 传统分类器使用完整序列准确率: {acc_full:.4f}) print(f 早期分类器最终准确率: {accuracy:.4f}) print(f 准确率差异: {accuracy - acc_full:.4f}) print(f 但早期分类器平均在 {int(earliness * max_T)}/{max_T} 时间点就做出了决策)这个对比能清晰地展示我们牺牲了可能的一点点准确率有时甚至可能更高因为早期决策避免了尾部噪声但换来了大幅提前的决策时间这对于故障预警、金融交易等场景的价值是巨大的。5. 高级技巧、避坑指南与常见问题在实际使用ml_edm的过程中你会遇到一些挑战。以下是我从实战中总结的经验。5.1 性能优化与并行计算训练多个时间点的分类器是计算密集型的。ml_edm的ClassifiersCollection和大多数Trigger模型都支持并行化。# 在实例化时指定 n_jobs 参数来启用并行 collection_clf_parallel ClassifiersCollection( base_classifierbase_clf, timestampstimestamps, n_jobs-1 # 使用所有可用的CPU核心 ) # 对于触发模型如EDSC也支持并行训练 trigger_parallel EDSC(threshold0.95, n_jobs4)注意并行化会显著增加内存消耗。如果数据集很大或分类器很复杂建议先在小样本或部分时间戳上测试或者使用n_jobs2或4而非-1来控制资源使用。5.2 处理多变量与不规则时间序列当前版本的ml_edm主要面向规整的、单变量时间序列。如果你的数据是多变量的例如多个传感器需要确保你的基础分类器能够处理3D输入(n_samples, n_timestamps, n_features)。像HistGradientBoostingClassifier这样的模型不能直接处理你需要展平在分类管道开始处加入一个ReshapeTransformer或自定义转换器将(n_samples, n_timestamps, n_features)变为(n_samples, n_timestamps * n_features)。使用专门模型使用能够处理3D输入的模型例如通过aeon库中的TimeSeriesForestClassifier或者使用深度学习框架如PyTorch构建网络并将其包装成scikit-learn接口。对于不规则采样的时间序列ml_edm目前没有内置处理功能。一个常见的预处理方法是将其插值到规整的时间网格上或者使用能够处理不规则序列的模型如基于RNN或Attention的模型作为基础分类器。5.3 触发模型的选择与调参没有“最好”的触发模型只有“最适合”的。追求简单和可解释从ProbabilityThreshold或EDSC开始。它们的参数阈值有明确的业务含义。追求综合性能ECONOMY-γ和CALIMERA是很好的默认选择它们在学术基准测试中表现稳健。ECONOMY-γ的gamma参数需要通过交叉验证调整。数据充足且追求极致性能可以考虑端到端的TEASER但要做好应对更长训练时间和更高调参复杂度的准备。理论研究或需要理论保证ECDIRE提供了在给定分类器性能下的理论最优解尽管计算开销大但作为性能上界很有参考价值。调参建议使用GridSearchCV或RandomizedSearchCV对触发模型的超参数如gamma,threshold进行搜索。关键是要使用与最终评估一致的成本矩阵来定义搜索的评分标准。你可以自定义一个评分函数使其返回early_clf.score()中的avg_cost平均成本因为这才是早期决策的终极优化目标。5.4 常见错误与排查维度错误ValueError: Found array with dim 3. Estimator expected 2.原因基础分类器如sklearn的SVM、GBDT无法直接处理3D时间序列数据。解决在构建分类管道时第一步必须是降维/展平操作例如使用FunctionTransformer进行展平或者使用aeon的特征提取器。时间戳不匹配ValueError: The timestamps ...原因CostMatrices、ClassifiersCollection和EarlyClassifier中使用的timestamps不一致。解决始终使用同一个timestamps数组最好将其定义为一个变量并传递给各个组件。成本矩阵未定义TypeError: __init__() missing 1 required positional argument: cost_matrices原因实例化EarlyClassifier时忘记传入cost_matrices参数。解决确保在构建EarlyClassifier时提供了定义好的CostMatrices对象。预测结果全是NaN或决策时间异常原因可能触发了模型的“拒绝决策”机制如果实现的话或者延迟成本设置得极低导致模型倾向于无限期等待现实中通常会设置一个最大等待时间约束。排查检查成本矩阵确保延迟成本函数是单调递增的。检查触发模型的参数如阈值是否设得过高。可以打印出模型在预测过程中各个时间点的置信度来调试。5.5 模型保存与部署ml_edm的模型对象EarlyClassifier,ClassifiersCollection基于scikit-learn的基类因此可以使用标准工具进行序列化。import joblib # 保存模型 joblib.dump(early_clf, early_fault_detector.pkl) # 加载模型 loaded_clf joblib.load(early_fault_detector.pkl) # 在线预测模拟数据流 def online_predict(model, data_stream): 模拟在线数据流预测 accumulated_data [] for i, new_data_point in enumerate(data_stream): accumulated_data.append(new_data_point) current_sequence np.array(accumulated_data).reshape(1, -1, n_features) # 构造成3D # 注意在线使用时模型会基于当前累计序列长度在内部选择合适的时间戳分类器进行预测和触发判断。 prediction, decision_flag model.predict(current_sequence, return_early_decision_flagTrue) if decision_flag: return prediction[0], i1 # 返回预测结果和决策时刻 return None, len(data_stream) # 如果始终未触发返回None和最终长度 # 模拟一个测试样本的数据流 test_stream X_test[0] # 形状 (150, 5) pred_label, pred_time online_predict(loaded_clf, test_stream) print(f在线预测: 在第 {pred_time} 个时间点触发决策预测类别为 {pred_label})这个在线预测函数展示了如何将训练好的早期分类器部署到一个实时数据流系统中。模型会持续监控累积的数据并在其内部触发机制认为时机成熟时立即输出预测从而实现真正的早期预警。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…