时间序列预测实战:从特征工程到XGBoost模型构建

news2026/4/27 21:23:50
1. 项目概述一个基于数据驱动的预测工具最近在整理一些数据分析项目时发现了一个挺有意思的仓库叫ssq-predictor。从名字就能看出来这是一个针对特定数字序列的预测工具。虽然项目本身可能带有一些娱乐性质但它背后涉及的数据处理、模型构建和算法应用对于我们理解时间序列预测、特征工程乃至机器学习在特定场景下的应用提供了一个非常具体且可实操的案例。这个项目的核心是尝试利用历史数据通过算法模型来分析和预测后续可能出现的数字组合。抛开其具体应用场景的敏感性不谈单从技术实现路径来看它涵盖了从数据爬取与清洗、特征提取与构造到模型选择、训练、评估以及最终预测输出的完整机器学习流水线。对于想入门机器学习实战或者对预测算法感兴趣的朋友来说拆解这样一个项目能学到不少避开教科书、直接来自实践的经验。我自己也尝试复现和优化过类似的项目发现其中门道不少。比如如何有效地从看似随机的历史数据中提取有意义的特征是简单用前几期的号码还是需要计算一些统计指标如频率、间隔、奇偶比、大小比选择什么样的模型更合适是经典的统计模型如ARIMA还是机器学习模型如随机森林、XGBoost亦或是简单的概率模型训练和评估时又需要注意哪些陷阱防止模型过拟合或者完全失效这些都是在动手过程中会遇到的实际问题。接下来我就结合ssq-predictor这个项目以及我个人在类似数据预测项目中的经验从头到尾拆解一下这类工具的实现思路、技术细节和那些容易踩坑的地方。无论你是想了解机器学习的基本流程还是对数据分析感兴趣希望这篇文章能提供一些切实可行的参考。2. 核心思路与技术选型解析2.1 问题定义与可行性分析首先我们必须明确这类预测项目的本质。从数学和计算机科学的角度看它属于时间序列预测Time Series Forecasting或序列生成Sequence Generation问题。输入是历史上一系列按时间排序的数字组合每一期可视为一个多维数据点目标是预测未来一期或几期最可能出现的数字组合。这里最大的挑战也是争议点在于数据的“随机性”假设。如果数据生成过程是完全独立随机的那么任何基于历史模式的预测都是无效的。然而在许多实际场景中即便是随机事件产生的数据序列也可能因为物理机制、人为因素或统计规律在短期或长期内呈现出一定的可分析模式如均值回归、聚类现象等。项目的出发点通常是尝试挖掘这些潜在的、非随机的模式或约束条件。因此在技术选型上我们不会追求也无法实现“绝对准确”的预测而是转向以下目标模式识别识别历史数据中是否存在统计上显著的模式如某些数字组合出现的频率是否偏离理论随机值。概率建模基于历史频率或简单规则计算每个数字或组合在未来出现的概率。趋势拟合使用时间序列模型捕捉数据在时间维度上的变化趋势如果存在。集成学习结合多种模型或规则的结果给出一个相对“合理”的推荐集合。基于这些目标我们的技术栈可以围绕数据流水线和模型管道来构建。2.2 技术栈与工具选型一个完整的预测系统通常包含以下几个模块每个模块都有成熟的技术选项1. 数据获取与存储模块爬虫工具requestsBeautifulSoup4/lxml。用于从公开数据源定时抓取历史开奖数据。需要处理反爬策略如User-Agent轮换、请求间隔。数据存储轻量级选择SQLite或MySQL。SQLite适合单机原型MySQL便于扩展。需要设计合理的数据表结构至少包含期号、日期、号码通常分多个字段存储、以及其他可能相关的元数据。任务调度对于定期抓取可以使用APScheduler或操作系统的crontab。2. 数据处理与分析模块核心库pandas和numpy。pandas用于数据清洗、转换和特征工程numpy提供高效的数值计算。可视化matplotlib和seaborn。用于绘制号码频率分布图、走势图、热力图等辅助直观分析。3. 特征工程模块这是项目的核心之一。原始号码数据本身信息量有限需要构造有预测价值的特征。常见的特征包括历史出现频率每个数字在过去N期内的出现次数。遗漏值每个数字连续未出现的期数。移动统计量如最近5期、10期内号码的平均值、方差、奇偶比、大小比、和值、和值尾数等。组合特征数字两两同时出现的频率共现矩阵。时间特征如年份、月份、星期几等如果数据有日期。编码方式对于分类性质的号码通常使用标签编码或独热编码。4. 模型构建与训练模块模型选择取决于你对问题的理解。没有“最好”的模型只有“更适合”当前数据特征的模型。概率模型简单频率模型直接使用历史频率作为预测概率。实现简单可作为基线模型。马尔可夫链将每一期号码视为一个状态尝试建模状态间的转移概率。适用于捕捉短期依赖。机器学习模型树模型scikit-learn的RandomForestClassifier或GradientBoostingClassifier以及XGBoost、LightGBM。树模型对特征工程要求相对较低能自动处理特征交互且不易过拟合通过剪枝和集成是这类问题的常用选择。神经网络使用TensorFlow或PyTorch构建LSTM长短期记忆网络模型。理论上LSTM适合捕捉时间序列中的长期依赖关系但它需要大量的数据和时间进行训练且超参数调优复杂在小数据集上容易过拟合。集成策略不单独依赖一个模型而是将多个模型如频率模型、随机森林、XGBoost的预测结果进行加权平均或投票往往能获得更稳定的表现。5. 评估与验证模块如何评估预测模型的“好坏”是一个关键且棘手的问题。不能使用常规的分类准确率因为完全猜中的概率极低。常用的替代评估策略包括分位数评估预测每个数字出现的概率评估概率校准度如使用Brier Score。集合覆盖评估看预测的号码集合如前10个最可能号码在下一期实际开奖中覆盖了多少个。模拟回测在历史数据上模拟“滚动预测”评估长期下来基于模型推荐所能获得的某种指标如命中特定数字的频次是否显著高于随机选择。特征重要性分析通过模型如树模型分析哪些构造的特征对预测贡献最大这可以反向验证特征工程的有效性。注意所有评估必须在未见过的数据测试集上进行严格避免数据泄露。通常按时间顺序划分训练集和测试集。6. 部署与输出模块脚本化将整个流程数据更新、特征计算、模型预测写成Python脚本。简单界面可使用streamlit快速构建一个本地Web界面用于查看历史数据、模型预测结果和可视化分析。自动化报告使用Jupyter Notebook或生成PDF/HTML报告定期输出预测结果和分析摘要。基于以上分析一个务实的技术选型组合可能是Pythonpandas/numpyscikit-learn/XGBoostSQLite。这个组合平衡了开发效率、模型性能和复杂度。3. 数据管道构建与特征工程实战3.1 历史数据获取与结构化存储第一步是建立可靠、可持续的数据源。假设我们从某个公开数据网站获取CSV格式的历史数据。1. 爬虫实现要点import requests from bs4 import BeautifulSoup import pandas as pd import time import sqlite3 def fetch_history_data(start_year, end_year): 模拟抓取历史数据实际URL和解析规则需根据目标网站调整。 all_data [] base_url https://example.com/history?year{} # 示例URL headers {User-Agent: Mozilla/5.0} for year in range(start_year, end_year 1): try: resp requests.get(base_url.format(year), headersheaders, timeout10) resp.raise_for_status() # 使用BeautifulSoup解析HTML表格 soup BeautifulSoup(resp.content, html.parser) table soup.find(table, {class: data-table}) # 根据实际表格类名调整 # 解析表格行提取期号、日期、号码等 # ... 具体的解析逻辑 ... # 假设解析后得到列表 yearly_data all_data.extend(yearly_data) print(f已获取{year}年数据) time.sleep(2) # 礼貌性延迟避免给服务器造成压力 except Exception as e: print(f获取{year}年数据失败: {e}) continue df pd.DataFrame(all_data, columns[period, date, num1, num2, num3, num4, num5, num6, num7]) # 假设7个号码 return df关键点异常处理网络请求必须包含try...except和超时控制。请求间隔添加time.sleep()是基本的网络礼仪也是避免IP被封的简单措施。解析健壮性网页结构可能变动解析代码最好能处理标签缺失或结构微调的情况。2. 数据清洗与入库抓取到的原始数据往往需要清洗。def clean_and_store_data(raw_df, db_pathssq_history.db): 清洗数据并存入SQLite数据库。 # 1. 去重 df raw_df.drop_duplicates(subset[period]) # 2. 处理缺失值如果有 df df.dropna() # 3. 确保号码列为整数类型 num_cols [num1, num2, num3, num4, num5, num6, num7] for col in num_cols: df[col] pd.to_numeric(df[col], errorscoerce).astype(Int64) # 4. 按期号排序 df df.sort_values(period).reset_index(dropTrue) # 5. 存入数据库 conn sqlite3.connect(db_path) df.to_sql(history, conn, if_existsreplace, indexFalse) conn.close() print(f数据已清洗并存入 {db_path}) return df3. 数据库设计一个简单的history表结构如下字段名类型说明periodTEXT期号主键dateDATE开奖日期num1INTEGER号码1num2INTEGER号码2.........num7INTEGER号码7假设实操心得在数据获取阶段最常遇到的问题是网站改版导致爬虫失效。因此定期运行爬虫并验证数据完整性非常重要。可以将爬虫脚本设置为每周自动运行一次并添加数据校验逻辑如检查最新期号是否连续、号码是否在有效范围内。3.2 深度特征工程从原始号码到预测因子有了干净的历史数据下一步是构造特征。这是决定模型性能上限的关键步骤。1. 基础统计特征这些特征直接基于原始号码计算反映宏观统计规律。def create_basic_features(df, window_sizes[5, 10, 20, 50]): 为每一期数据创建基础统计特征。 df: 按时间排序的原始数据框 window_sizes: 滑动窗口的大小列表 df_feat df.copy() num_cols [fnum{i} for i in range(1, 8)] # 假设7个号码列 # 将每期号码展开成一个列表便于计算 df_feat[numbers] df_feat[num_cols].values.tolist() # 1. 计算每期的基础属性 df_feat[sum_all] df_feat[num_cols].sum(axis1) # 和值 df_feat[mean_all] df_feat[num_cols].mean(axis1) # 平均值 df_feat[odd_count] (df_feat[num_cols] % 2 1).sum(axis1) # 奇数个数 df_feat[big_count] (df_feat[num_cols] 16).sum(axis1) # 大数个数假设以16为界 # 2. 滑动窗口统计特征对于每一期计算其之前若干期的统计量 for ws in window_sizes: # 过去ws期的和值均值 df_feat[fsum_mean_{ws}] df_feat[sum_all].shift(1).rolling(windowws, min_periods1).mean() # 过去ws期的奇数个数均值 df_feat[fodd_mean_{ws}] df_feat[odd_count].shift(1).rolling(windowws, min_periods1).mean() # 过去ws期每个号码的出现频率需要更复杂的计算 # ... 略 ... # 3. 遗漏值特征每个数字距离上次出现的间隔 all_numbers set(range(1, 34)) # 假设红球范围1-33 for num in all_numbers: col_name fmiss_{num} df_feat[col_name] 0 last_seen -ws # 初始化 for idx in df_feat.index: if num in df_feat.loc[idx, numbers]: last_seen idx df_feat.at[idx, col_name] idx - last_seen if last_seen ! -ws else ws * 2 # 初始值设大一些 return df_feat2. 高阶特征与编码组合特征计算两两号码同时出现的频率。可以构建一个共现矩阵然后为每一期数据提取其号码组合对应的共现频率作为特征。周期性特征如果日期信息可靠可以提取“星期几”、“月份”、“季度”等并做独热编码。某些日期如周末、节假日可能隐含模式。目标编码对于分类特征如每个号码可以用其在过去一段时间内作为“被预测目标”出现的频率即标签的均值进行编码。这种方法信息量大但需小心防止标签泄露必须仅使用历史数据计算。3. 特征筛选不是所有构造的特征都有用。可以使用以下方法筛选方差阈值移除方差几乎为零即恒定不变的特征。相关性分析移除与目标变量如下一期号码相关性极低或与其他特征高度共线的特征。模型特征重要性用树模型如随机森林跑一遍根据feature_importances_属性排序保留重要性高的特征。注意事项特征工程中最容易犯的错误是数据泄露。任何一期的特征都只能使用该期之前的历史数据来计算。在上面的滑动窗口计算中我们使用了.shift(1)和.rolling()函数并确保窗口是从当前期向前过去滚动这是正确的做法。计算遗漏值时更新逻辑也必须严格遵循时间顺序。4. 模型构建、训练与评估策略4.1 问题重构与模型选择我们不能直接让模型预测7个具体的数字因为这是一个极其稀疏的多标签分类问题。更可行的思路是将其分解或转换思路一二元分类问题将预测任务转化为对每一个可能的数字如1-33预测其在下一期是否会出现。这样我们就有了33个独立的二元分类任务。可以为每个数字训练一个分类器如逻辑回归、随机森林特征就是上一节构造的那些。这种方法的优点是直接模型可解释性强缺点是忽略了数字之间的关联。思路二多标签排序问题我们并不要求模型精确输出哪7个数字而是让它对33个数字的“出现可能性”进行排序。我们可以训练一个模型输入特征后输出一个33维的概率向量每一维代表对应数字出现的概率。然后我们取概率最高的7个数字作为预测。这可以通过将输出层改为33个神经元并使用sigmoid激活函数和binary_crossentropy损失神经网络或者使用支持多标签的树模型如scikit-learn的MultiOutputClassifier包装器来实现。思路三序列生成问题使用LSTM等序列模型将历史各期的号码经过编码后作为一个序列输入直接输出下一期7个号码的编码。这要求模型学习从历史序列到未来序列的映射。这种方法理论上有潜力但对数据量和模型调参要求极高极易过拟合。我的选择与理由在实际操作中思路二多标签排序结合强大的树模型如XGBoost是一个比较稳健的起点。树模型对特征尺度不敏感能自动处理非线性关系并且通过MultiOutputClassifier可以方便地处理多输出。我们以这个思路为例进行实现。4.2 使用XGBoost进行多标签预测import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, TimeSeriesSplit from sklearn.multioutput import MultiOutputClassifier from sklearn.metrics import coverage_error, label_ranking_average_precision_score import xgboost as xgb import joblib def prepare_multilabel_data(feature_df): 准备多标签学习的数据。 feature_df: 包含所有特征和原始号码的DataFrame 返回特征矩阵X 多标签矩阵Y # 假设我们的目标是最新一期数据 # 特征使用第i期的特征去预测第i1期的号码 X feature_df.iloc[:-1].drop(columns[period, date, numbers] [fnum{i} for i in range(1,8)]).values # 标签第i1期的号码需要转换为33维的多热编码 all_numbers list(range(1, 34)) Y_list [] for idx in range(1, len(feature_df)): current_numbers feature_df.iloc[idx][[fnum{i} for i in range(1,8)]].values # 创建多热编码向量 multilabel_vec [1 if num in current_numbers else 0 for num in all_numbers] Y_list.append(multilabel_vec) Y np.array(Y_list) return X, Y, all_numbers def train_xgboost_multilabel(X, Y, val_ratio0.2): 训练XGBoost多标签模型。 # 按时间顺序划分训练集和验证集不能随机打乱 split_idx int(len(X) * (1 - val_ratio)) X_train, X_val X[:split_idx], X[split_idx:] y_train, y_val Y[:split_idx], Y[split_idx:] # 创建基础XGBoost分类器 base_clf xgb.XGBClassifier( n_estimators200, max_depth6, learning_rate0.1, subsample0.8, colsample_bytree0.8, random_state42, n_jobs-1, eval_metriclogloss # 对于二元分类 ) # 用MultiOutputClassifier包装 model MultiOutputClassifier(base_clf, n_jobs-1) print(开始训练模型...) model.fit(X_train, y_train) print(模型训练完成。) # 在验证集上评估 y_val_pred_proba model.predict_proba(X_val) # 返回一个列表每个元素是对应标签的预测概率矩阵 # 我们需要将预测概率列表整理成 (n_samples, n_labels) 的矩阵 y_val_pred_proba_matrix np.column_stack([p[:, 1] for p in y_val_pred_proba]) # 评估指标1覆盖误差 (Coverage Error) - 越小越好 # 表示需要按预测概率从高到低选多少个标签才能覆盖所有真实标签。 # 对于我们理想情况是选7个就能覆盖全部真实标签即覆盖误差为7。 ce coverage_error(y_val, y_val_pred_proba_matrix) print(f验证集覆盖误差: {ce:.2f}) # 评估指标2标签排序平均精度 (LRAP) - 越大越好最大为1 lrap label_ranking_average_precision_score(y_val, y_val_pred_proba_matrix) print(f验证集标签排序平均精度: {lrap:.4f}) return model, X_val, y_val, y_val_pred_proba_matrix # 主流程 if __name__ __main__: # 假设 df_features 是已经完成特征工程的DataFrame X, Y, all_numbers prepare_multilabel_data(df_features) model, X_val, y_val, y_val_proba train_xgboost_multilabel(X, Y, val_ratio0.15) # 保存模型 joblib.dump(model, ssq_multilabel_xgb_model.pkl) print(模型已保存。)关键参数解析n_estimators树的数量。太少可能欠拟合太多可能过拟合且训练慢。200-500是常用起点。max_depth单棵树的最大深度。控制模型复杂度防止过拟合。通常从3-8开始尝试。learning_rate学习率。越小训练越慢但可能得到更精细的结果。常与n_estimators配合调整。subsample,colsample_bytree行采样和列采样比例。小于1可以引入随机性防止过拟合增强模型鲁棒性。4.3 预测与结果生成训练好模型后我们用最新的数据特征来预测下一期。def predict_next_period(model, latest_features, all_numbers, top_k10): 使用模型预测下一期最可能出现的号码。 latest_features: 最新一期的特征向量1D array all_numbers: 号码列表如[1,2,...,33] top_k: 返回概率最高的前K个号码 # latest_features 需要是2D数组 (1, n_features) latest_features latest_features.reshape(1, -1) pred_proba_list model.predict_proba(latest_features) # 得到每个号码的预测概率 proba_per_number np.array([p[0, 1] for p in pred_proba_list]) # 注意索引predict_proba返回的是每个类别的概率 # 按概率从高到低排序 sorted_indices np.argsort(proba_per_number)[::-1] top_indices sorted_indices[:top_k] top_numbers [all_numbers[i] for i in top_indices] top_probabilities proba_per_number[top_indices] # 生成预测结果 prediction_df pd.DataFrame({ 预测号码: top_numbers, 预测概率: top_probabilities }) return prediction_df # 使用示例 # 假设 latest_feature_vector 是已经计算好的最新一期特征 latest_feature_vector df_features.iloc[-1].drop([period,date,numbers,num1,num2,num3,num4,num5,num6,num7]).values.astype(float) pred_result predict_next_period(model, latest_feature_vector, all_numbers, top_k15) print(下一期号码预测概率前15) print(pred_result)5. 常见问题、陷阱与优化方向实录在实际构建和运行这样一个预测系统的过程中你会遇到各种各样的问题。下面是我踩过的一些坑和总结的经验。5.1 数据与特征相关陷阱问题1特征泄露Data Leakage这是最致命也最隐蔽的错误。例如如果你在计算“本期的和值”时不小心把下一期的某个号码信息混了进来模型就会学到这个“未来信息”在训练集上表现极好但在真实预测中完全失效。排查仔细检查每一个特征的计算公式确保对于第t期数据的特征只使用了第t期及之前的数据。使用.shift()函数是常见的技巧。在划分训练/验证集时必须使用时间序列分割TimeSeriesSplit绝对不能随机打乱。问题2特征无效或噪声过大费尽心思构造了上百个特征但模型效果提升不大甚至下降。排查与解决可视化绘制特征与目标如下一期某个号码是否出现的散点图或箱线图观察是否有明显关系。计算相关性计算特征与目标之间的互信息或相关系数。看特征重要性训练一个简单的树模型输出特征重要性排序。长期排在后位的特征可以考虑剔除。领域知识思考特征是否真的有逻辑上的预测意义。例如“上一期的号码”可能比“三年前同月同日的号码”更有参考价值。问题3数据量不足机器学习模型尤其是复杂的模型如神经网络需要大量数据。如果历史数据只有几百期那么模型很容易记住噪声过拟合而非学到规律。解决简化模型使用更简单的模型如逻辑回归、浅层决策树。强化正则化增加L1/L2正则化项提高树模型的min_child_weight降低max_depth。数据增强对于序列数据谨慎使用滑窗生成更多样本但需注意样本独立性假设。5.2 模型训练与评估难题问题4评估指标选择不当使用“准确率”评估会发现模型永远接近零因为完全猜中7个号码的概率极低。正确做法采用前文提到的覆盖误差、标签排序平均精度或者自定义业务指标如“预测的Top10号码中命中实际开奖号码的个数”。在验证集上模拟长期跟踪这个指标。问题5模型过拟合模型在训练集上“预测”效果很好但在验证集或新数据上表现很差。诊断对比模型在训练集和验证集上的评估指标。如果训练集指标远好于验证集就是过拟合。解决收集更多数据最有效但往往最难。降低模型复杂度减少树深度、减少神经网络层数和神经元数。增加正则化XGBoost中的gamma,reg_alpha,reg_lambda神经网络中的Dropout、权重衰减。早停在验证集指标不再提升时停止训练。交叉验证使用时间序列交叉验证更稳健地评估模型。问题6类别不平衡对于二元分类任务某个数字是否出现“出现”正例的样本数远少于“不出现”负例。解决在XGBoost中设置scale_pos_weight参数。使用过采样如SMOTE或欠采样但在时间序列中需格外小心不要破坏时间顺序。更关注精确率-召回率曲线和AUC-PR指标而不是准确率。5.3 工程化与持续维护挑战问题7预测结果不稳定同一套代码今天跑和明天跑预测的Top10号码可能差异很大。原因模型可能对输入特征的微小变化非常敏感特别是当模型在“随机猜测”边缘徘徊时。缓解集成训练多个不同种子或不同参数集的模型对它们的预测概率进行平均。概率平滑不直接取概率最高的几个号码而是考虑概率的分布和差异。例如只选择那些概率显著高于平均水平的号码。结合规则将模型结果与一些简单的统计规则如“冷门号码”、“热号连坐”等经验相结合作为人工筛选的参考。问题8系统自动化与监控手动运行脚本容易出错且无法及时应对数据源或模型失效。建议方案任务编排使用Airflow或Prefect编排整个数据流水线抓取-清洗-特征-训练-预测。模型监控记录每次预测的概率分布和Top-K列表。如果连续多期预测概率的熵发生剧烈变化或Top-K列表与历史高频号码完全偏离可能意味着数据源异常或模型失效需要触发告警。模型重训设定策略定期如每月用新数据重新训练模型或当模型在最近N期验证集上的表现低于阈值时触发重训。5.4 心态与期望管理最后也是最重要的一点是管理好对这类预测项目的期望。必须清醒地认识到基于公开历史数据的预测其效果存在天然的天花板。这个项目的核心价值在于技术实践你完整地走了一遍数据科学项目流程锻炼了数据获取、清洗、特征工程、建模、评估和部署的全套技能。你可以将这套方法论平移到任何一个有时间序列或序列预测需求的领域比如销量预测、股票分析同样需谨慎、用户行为预测等那才是其真正的用武之地。把这次实践当作一个复杂有趣的“技术沙盒”享受构建和优化的过程而对结果抱有理性的平常心你会从中获得更多乐趣和成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2560712.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…