新闻详情

新闻详情

首页 / 资讯中心 / 详情

ARIMA-BP组合模型时间序列预测实战:原理、代码与调参指南

发布时间:2026/9/30 9:39:31来源:尧图网络
ARIMA-BP组合模型时间序列预测实战:原理、代码与调参指南
简介这是一套基于Python实现ARIMA-BP组合模型的时间序列预测完整项目文档面向具备数据分析和编程基础的数据科学家、研究人员及技术人员。项目针对金融股价、电力负荷、供应链需求等典型预测场景重点解决单一模型在复杂非平稳数据上线性与非线性特征难以兼顾的问题。文档覆盖ARIMA线性建模、BP神经网络非线性残差修正、数据预处理、模型训练与评估、动态权重分配机制及图形化界面提供了从项目背景、创新点到实验结果的完整技术路线。该资源共1个docx文件压缩包大小386KB目前已有112人学习下载。对于希望掌握统计模型与深度学习融合方法、提升预测精度与模型可解释性的读者这份文档既能当作项目实践参考也可作为算法选型和调优的入门指引。1. 为什么 ARIMA-BP 组合模型是论文里最值得复现的时序预测方案单跑 ARIMA时间序列里的线性趋势能抓得住但一旦数据里混入非线性波动和突发扰动残差里经常还藏着明显规律换成 BP 神经网络非线性映射没问题却又容易忽略时序本身的自相关结构。ARIMA-BP 结合模型正好把两件事拆开做ARIMA 负责线性主信号BP 神经网络负责学习 ARIMA 留下的非线性残差最终输出直接相加。这个思路在毕业论文设计里是最容易讲清楚、也最容易用 Python 完整落地的一套预测方案。这篇文章按“原理 → 代码 → 参数 → 踩坑”的顺序把数据预处理、ARIMA 定阶与残差提取、BP 网络构建、组合预测和误差评估用可运行的代码串起来。读完你就知道整个项目实列的每一步在做什么以及哪些参数改完会直接影响结果。适合三类人正在准备毕业论文或课程设计的本硕学生想复现组合预测方法做对照实验的研究者以及需要一套完整 Python 时序预测流程作参考的从业者。下面先讲清楚为什么这两类模型可以组合再进入代码。2. ARIMA 和 BP 的分工逻辑一个抓主信号一个修残差2.1 ARIMA 的线性表达p、d、q 到底在描述什么ARIMA 全称是差分自回归移动平均模型由三部分组成AR(p) 描述序列当前值和过去 p 个值的线性关系I(d) 通过 d 阶差分让非平稳序列变成平稳序列MA(q) 把过去 q 个预测误差的线性组合也纳入模型。写成数学形式大概是y_t c φ₁y_{t-1} … φ_p y_{t-p} ε_t θ₁ε_{t-1} … θ_q ε_{t-q}其中 ε_t 是 t 时刻的误差项。ARIMA 建模的前提是平稳性均值、方差不随时间发生系统性变化。股票价格、商品销量、气象观测这类原始数据基本都不平稳所以需要先做差分去除趋势再用 ADF 检验验证“是否平稳”。实操里ADF 的 p 值低于 0.05 才算通过检验这是一个最基础的判断标准。ARIMA 还有一个容易被忽略的细节模型拟合完之后残差序列应当接近白噪声。所谓白噪声就是均值为 0、方差恒定、任意两时刻之间不相关。如果残差里还有周期性或趋势性说明模型没把线性依赖抓完。这一点是 ARIMA 与 BP 对接的关键基础——组合模型要求 ARIMA 先把能解释的线性部分解释干净剩下真正难啃的非线性部分才轮到 BP。2.2 BP 神经网络的非线性拟合能力是怎么来的BP 网络全称反向传播神经网络结构上是经典的前馈神经网络一个输入层、若干隐藏层、一个输出层。输入层每个节点对应一个特征在时间序列场景里就是前 n 个时刻的历史值隐藏层通过加权求和与非线性激活函数完成特征变换输出层给出预测值。训练过程分两步。前向传播先算出预测值再计算预测值和真实值之间的误差常用均方误差反向传播利用链式法则把误差对每一层权重的导数算出来用梯度下降更新权重。反复迭代后网络就学到了输入到输出的非线性映射。理论上只要隐藏层节点足够多、激活函数带非线性BP 网络就可以逼近任意连续函数。但它的盲区也很明显把时间序列当一组独立样本训练时会丢掉时间先后顺序。很多入门者犯的第一个错就是训练时随机打乱数据样本间的自相关结构被破坏模型就学不到“时序”信息。论文里画 BP 神经网络结构图时需要标清楚三个数字输入层节点数等于滑动窗口长度、隐藏层节点数、输出层节点数为 1最后把正向传播和误差回流画出即可。2.3 组合预测的标准做法ARIMA 做主预测BP 修残差ARIMA-BP 组合模型在论文里最常见的结构是“串联残差学习”不是简单把两个模型的预测结果做加权平均。常规流程是四步第一步用 ARIMA 拟合训练集得到拟合值 ŷ_t。第二步计算残差序列 e_t y_t - ŷ_t这部分代表了 ARIMA 没能解释的非线性信息。第三步把残差序列加工成滑动窗口样本训练 BP让 BP 学会从历史 k 个残差预测下一个残差。第四步做最终预测时ARIMA 的预测值加上 BP 的残差预测值就是组合输出。这种分工的好处是每个模块都职责明确。ARIMA 承担线性自相关结构BP 承担非线性修正项。对比直接用 LSTM 做时间序列预测LSTM 虽然拟合能力强但答辩时很难解释清楚它内部哪些门学到了哪些特征。ARIMA-BP 则容易从“线性加非线性”的分解逻辑讲起导师更容易听懂。变体也存在有的做法是先跑 BP 预测主趋势再用 ARIMA 拟合 BP 的残差。这种结构适合序列天然以非线性为主导的场景。但标题里“ARIMA-BP”的顺序指的就是先 ARIMA 后 BP 的串联结构这也是文献和毕业论文里最普遍、最容易复现的一种。后面代码全部按这个顺序实现。3. 用 Python 把 ARIMA-BP 完整跑通数据、定阶、残差、训练、组合3.1 环境准备与数据加载做论文实验之前先把环境固定住。建议用 Python 3.9 以上版本核心库按下面这份清单安装。版本号建议锁定避免换个环境就出现兼容性错误。pip install numpy pandas matplotlib statsmodels scikit-learn tensorflow数据方面准备一份单变量时间序列CSV 文件包含两列date 和 value。下面是数据加载与训练测试集划分的标准做法。import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.arima.model import ARIMA from statsmodels.stats.diagnostic import acorr_ljungbox from sklearn.preprocessing import MinMaxScaler df pd.read_csv(sales.csv, parse_dates[date]) df df.sort_values(date).reset_index(dropTrue) # 按时间排序 series df[value].astype(float) # 按时间顺序切分前 80% 训练后 20% 测试 train_len int(len(series) * 0.8) train, test series.iloc[:train_len], series.iloc[train_len:] series.plot(title原始时间序列) plt.show()时间序列切分与普通机器学习不同不能随机打乱。排序这一步很关键如果原始文件本身有序也不能偷懒万一文件乱序后面所有残差计算都会错位。3.2 ADF 平稳性检验与是否需要差分ARIMA 建模前先判断平稳性。ADF 检验是论文里最常放的平稳性检验方法下面封装成一个函数。def check_stationarity(ts, name序列): result adfuller(ts, autolagAIC) print(f{name}: ADF统计量{result[0]:.4f}, p值{result[1]:.4f}) return result[1] 0.05 stationary check_stationarity(train) print(判断结果:, 平稳 if stationary else 非平稳需要差分)判断 p 值是否小于 0.05小于则视为平稳。注意一点如果序列非平稳不需要手工 diff直接在 ARIMA 的 order 参数里把 d 设为 1 或更大statsmodels 会自动完成差分。这里检验的目的只是确定 d 至少取多少。实际项目里销量、客流、电力负荷这类数据几乎都不是原始平稳的通常 d1 就够。如果一阶差分后 ADF 的 p 值仍然大于 0.05则考虑 d2但要小心过差分过度差分会让序列失去可解释性且残差方差被放大。3.3 ARIMA 定阶、拟合与残差提取定阶常用两种方式看 ACF/PACF 图人工判断或者用 AIC 准则网格搜索。人工看图需要经验论文里可以放 AIC 搜索作为依据更客观。下面代码用 AIC 最小化搜索 p、d、q。def search_arima_order(ts, max_p4, max_d2, max_q4): best_aic, best_order float(inf), None for p in range(max_p 1): for d in range(max_d 1): for q in range(max_q 1): try: model ARIMA(ts, order(p, d, q)).fit() if model.aic best_aic: best_aic, best_order model.aic, (p, d, q) except Exception: continue return best_order, best_aic best_order, best_aic search_arima_order(train, max_p4, max_d2, max_q4) print(f最优ARIMA阶数: {best_order}, AIC{best_aic:.2f})网格搜索范围不要一开始就拉很大p、q 各取 0 到 4d 取 0 到 2一般能覆盖大多数论文数据。搜索范围太大会让计算时间变长而且可能导致过拟合。搜索完成后用最优 order 重新拟合并提取残差。arima_model ARIMA(train, orderbest_order).fit() train_resid arima_model.resid # 残差白噪声检验 ljung acorr_ljungbox(train_resid, lags10, return_dfTrue) print(ljung)Ljung-Box 检验输出的 p 值大于 0.05说明残差没有显著自相关ARIMA 的线性信息提取得比较干净。如果 p 值小于 0.05说明 p、q 可能选小了需要扩大搜索范围。后面第 5 章会专门讲这个坑。3.4 残差滑动窗口构建与 BP 训练拿到残差序列后下一步是构造滑动窗口样本。窗口长度为 k意思是 BP 用最近 k 个残差值预测下一个残差值。这个 k 在论文里一般写成时间步或滞后阶数。def create_dataset(seq, window4): X, y [], [] for i in range(len(seq) - window): X.append(seq[i : i window]) y.append(seq[i window]) return np.array(X), np.array(y) # BP 输入一般缩放到 [-1, 1] 或 [0, 1]这里选 [-1, 1] scaler MinMaxScaler(feature_range(-1, 1)) resid_train_scaled scaler.fit_transform(train_resid.values.reshape(-1, 1)).flatten() X, y create_dataset(resid_train_scaled, window4) # 再按时间顺序切出验证集用于观察过拟合 split int(len(X) * 0.9) X_train, X_val X[:split], X[split:] y_train, y_val y[:split], y[split:] import tensorflow as tf np.random.seed(42) tf.random.set_seed(42) from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam bp_model Sequential([ Dense(16, activationrelu, input_shape(X_train.shape[1],)), Dense(1, activationlinear) ]) bp_model.compile(optimizerAdam(learning_rate0.001), lossmse, metrics[mae]) history bp_model.fit( X_train, y_train, epochs100, batch_size16, validation_data(X_val, y_val), shuffleFalse, # 时间序列绝不能随机打乱 verbose1 )这段代码有两个值得说明的地方。第一scaler 只对训练残差做 fit_transform测试阶段的数据只能调用 transform。如果先对整个残差序列做 fit_transform等于把测试信息泄漏给训练过程验证指标会虚高论文数据会翻车。第二shuffleFalse 是硬性要求。BP 网络训练时默认会打乱样本顺序但时间序列一旦打乱时间依赖关系就消失了模型学到的只是一堆无关联的点映射。这也是“时间序列 神经网络”最常见的血泪教训之一。隐藏层设计上我选了一层 16 个节点输入 4 个残差值输出 1 个值。对单变量残差预测这样的容量已经足够。隐藏层过多会增大过拟合风险论文实验里可以先从 8 开始试记录训练集和验证集的 MAE再决定是否加节点数。3.5 组合预测、逆缩放与可视化BP 训练完成后要对测试期做组合预测。ARIMA 负责预测主值BP 负责预测残差值两者相加。test_len len(test) arima_forecast arima_model.forecast(stepstest_len) # 从训练集最后 4 个残差开始递归滚动预测测试期的残差 current_window list(resid_train_scaled[-4:]) resid_forecast_scaled [] for _ in range(test_len): x_input np.array(current_window).reshape(1, -1) next_resid bp_model.predict(x_input, verbose0).flatten()[0] resid_forecast_scaled.append(next_resid) current_window.pop(0) current_window.append(next_resid) # 把预测残差逆缩放回原始尺度 resid_forecast scaler.inverse_transform( np.array(resid_forecast_scaled).reshape(-1, 1) ).flatten() # 组合预测 ARIMA 主预测 BP 残差预测 final_pred arima_forecast resid_forecast这里要说明一点上面的递归滚动预测是论文里常见的离线预测写法实现简单但误差会随着递归步数增加而累积。更严谨的做法是滚动一步预测每预测完一步把真实观测值补进序列重新拟合 ARIMA再预测下一步。这样计算量大但对测试集的评估更接近真实应用。把结果画出来论文里需要用对比图展示组合模型与单模型的差异。plt.figure(figsize(12, 5)) plt.plot(test.index, test.values, label实际值, linewidth2) plt.plot(test.index, final_pred, labelARIMA-BP组合预测, linestyle--) plt.plot(test.index, arima_forecast, labelARIMA单模型预测, linestyle:, alpha0.8) plt.legend() plt.title(ARIMA-BP 组合预测效果对比) plt.xlabel(时间) plt.ylabel(值) plt.show()这张图能直观反映组合模型在波峰和波谷处的修正效果。通常 ARIMA 单模型的折线更平滑组合模型折线贴近实际值的波动这就是 BP 残差拟合起作用的表现。4. ARIMA 和 BP 的 5 个必调参数改哪里才能让组合预测真正生效4.1 ARIMA 定阶的检验顺序ADF、AIC、Ljung-Box 一个都不能少ARIMA 的 (p, d, q) 三个整数决定了整个主预测的质量。不要只盯着 AIC 最小AIC 最小不等于残差干净。推荐流程是先用 ADF 确定差分次数 d再做 AIC 网格搜索找到候选 p、q最后用 Ljung-Box 检验残差。如果残差检验不通过回退到更大范围的网格搜索。参数上有一个常见经验AIC 搜索结果里(2,1,2) 或 (1,1,1) 这样的低阶组合出现的概率很高。如果搜索出来的 p 和 q 都大于 4多半是数据里有明显的周期性请先考虑是否应该使用带季节项的 SARIMA而不是无脑加大 p、q。4.2 BP 滑动窗口长度设成周期长度而不是拍脑袋滑动窗口长度直接影响模型能看到的“记忆长度”。窗口太小信息不足窗口太大引入过多噪声且训练样本变少。一般做法是先看数据有没有明显周期月度数据可以看 12周数据看 7日数据看 7 或 30。如果没有明显周期默认设 4 到 5。窗口越大BP 输入节点越多隐藏层也需要跟着调整。注意窗口增加一条可用样本就减少一条不要为了增大窗口牺牲训练集长度。4.3 隐藏层节点数和激活函数小数据集不需要大网络BP 网络中隐藏层节点数不是越大越好。论文数据通常只有几百条隐藏层 8 到 32 个节点已经足够。判断标准是如果验证集 MAE 在训练中途不再下降而训练集还在降就说明过拟合了减节点数比加正则化更有效。激活函数方面隐藏层用 relu 起步输出层用 linear。有人喜欢最后加 sigmoid 或 tanh但残差值可能落在 [-1, 1] 之外输出层用 sigmoid 会强制压缩输出范围反而造成系统性偏差。4.4 学习率、batch_size、epochs用验证集曲线定不要硬跑满学习率是最常见的翻车点Adam 默认 0.001 通常可以但数据方差大时建议降到 0.0005。如果训练 loss 曲线震荡剧烈先降学习率。batch_size 对时间序列残差影响没有那么大16 到 32 都可以。数据集小于 200 条时batch_size 用 8 或 16 更稳。epochs 不要直接设成几百跑完用 early stopping 更合理。一旦验证集 loss 连续 15 个 epoch 不下降就停止训练保存验证集最优的模型。下面是一个标准的早停写法。from tensorflow.keras.callbacks import EarlyStopping early_stop EarlyStopping(monitorval_loss, patience15, restore_best_weightsTrue) history bp_model.fit( X_train, y_train, epochs200, batch_size16, validation_data(X_val, y_val), shuffleFalse, callbacks[early_stop], verbose1 )加了 early stopping 之后BP 网络不容易在论文数据上过拟合训练时间也可控。4.5 数据划分与缩放器信息泄漏是最大的隐藏扣分项训练集和测试集按时间顺序 8:2 划分是最常见的做法但很多项目会在这里埋雷。第一scaler 只允许对训练序列 fit。你在第 3 章代码里看到scaler.fit_transform(train_resid...)而不是fit_transform(resid)这一步不能省。第二BP 训练时不许 shuffle验证集切分也应按时间顺序取最后 10%不能随机抽。第三测试集不允许参与任何参数调优包括窗口长度和隐藏层节点数的选择。下面的表格是把常用参数范围做一个汇总写论文时可以直接引用。参数推荐范围调整经验ARIMA d 差分阶数0, 1, 2大多数数据 d1 即可d2 慎用ARIMA p, q0 到 4 搜索高于 4 优先怀疑季节性滑动窗口长度4 到 12有周期就设周期长度隐藏层节点数8 到 32验证集 MAE 不再降时减节点学习率0.0005 到 0.01Adam 默认 0.001波动大就下调batch_size8 到 32小样本用 16 更稳定epochs50 到 200配 early stopping靠验证集早停5. ARIMA-BP 项目常见问题排查现象、原因、解决5.1 残差提取后仍然自相关BP 怎么练都不出效果现象Ljung-Box 检验的 p 值小于 0.05BP 训练过程 loss 虽然下降但验证集预测结果几乎是一条平线。原因ARIMA 的 p、q 定阶太浅周期性或者强趋势残留在残差里BP 把本来有规律的结构当噪声去拟合自然学不出稳定映射。解决先扩大 p、q 搜索范围到 0 到 7重新拟合 ARIMA再看残差 Ljung-Box 的 p 值。如果仍然不通过检查数据是否按周或按月循环考虑在 ARIMA 中加入季节项或者先用 STL 分解把周期分量拆出来。5.2 信息泄漏scikit-learn 时报无提示验证集指标虚高现象验证集和测试集的指标都非常好但换到一段新的真实数据上预测误差立即放大。原因MinMaxScaler 在包含测试数据在内的全序列上调用了 fit_transform或者网格搜索选择最优参数时拿测试集参与比较。这两种情况都属于信息泄漏是时间序列项目最容易出现的隐藏错误。解决严格按时间顺序切分scaler 只 fit 训练段。网格搜索参数时只用训练和验证段。每跑一次实验前检查代码里有没有对全序列调用 fit_transform 的地方。5.3 同一份代码换台机器结果对不上论文插图无法复现现象实验室的电脑跑出一个结果回家用笔记本重跑误差和曲线都变了论文里的图和第二次结果对不上。原因神经网络权重初始化有随机性GPU 的浮点运算也会引入微小差异。多跑几次每次结果都会有点浮动这不是代码逻辑错误而是随机种子没固定。解决在训练前固定 numpy 和 TensorFlow 的随机种子。更稳妥的办法是强制在 CPU 上跑关键实验并把库版本写进论文附录。论文评审看到“结果可复现”这一句时凭据就是你附上了环境版本号和随机种子。5.4 组合预测比单个 ARIMA 误差更大现象加 BP 残差预测后MAE 和 RMSE 反而比单独用 ARIMA 更高。原因残差序列已经接近白噪声BP 强行去拟合随机波动反而把噪声学成了规律预测阶段带来额外误差。解决先看 Ljung-Box 检验结果如果残差 p 值大于 0.05说明 ARIMA 已经把线性结构吃干净了残差里没有有效信息可供 BP 学习。这种情况在论文里直接报告 ARIMA 单模型的结果是更诚实的选择不要为了“组合”而硬组。组合模型有价值的前提是残差里确实存在非线性成分。5.5 训练时打乱样本BP 学了一堆无用规律现象训练 loss 下降顺利验证指标也不错但测试集的前几个点预测结果严重错位整条预测曲线滞后了一拍。原因构造数据集时没有固定 shuffleFalseTensorFlow 默认按批次随机打乱样本顺序破坏了时间序列的先后关系。解决在 model.fit 里显式传入 shuffleFalse。如果你的代码是用自定义训练循环也要检查生成 batch 时是否做了随机采样。时间序列任务里唯一安全的打乱方式是在滑动窗口之间打乱但前提是窗口内部已经保留了时序结构。6. 让论文数据更扎实评价指标与对比实验的落地做法6.1 三个必放的评价指标及 Python 实现毕业论文做时序预测对比MAE、RMSE、MAPE 三个指标基本是标配。MAE 反映平均绝对误差RMSE 放大较大误差的惩罚MAPE 则让指标不受数据量纲影响。下面是一个可以直接复制的评价函数。def evaluate_metrics(y_true, y_pred): mae np.mean(np.abs(y_true - y_pred)) mse np.mean((y_true - y_pred) ** 2) rmse np.sqrt(mse) mape np.mean(np.abs((y_true - y_pred) / y_true)) * 100 return {MAE: mae, RMSE: rmse, MAPE: mape} result_combo evaluate_metrics(test.values, final_pred) print(ARIMA-BP:, result_combo) result_arima evaluate_metrics(test.values, arima_forecast) print(ARIMA单模型:, result_arima)在论文表格里三个模型横向对比通常放“ARIMA 单模型、BP 单模型、ARIMA-BP 组合模型”三行。BP 单模型怎么构造直接拿原始训练序列做滑动窗口训练 BP预测测试期逻辑和第 3 章 BP 部分一致。注意切分、缩放、随机种子三件事要和组合模型保持一致否则对比就不公平。MAPE 有一个坑如果真实值里有接近 0 的值MAPE 会爆炸到几千。遇到这种情况用 SMAPE 或直接只报 MAE 和 RMSE。论文实验里发现 MAPE 异常时先检查数据里有没有 0 值或负值。6.2 滚动评估与超参数记录的习惯最后分享一个我自己的习惯。每跑一组实验我会把随机种子、ARIMA 阶数、窗口长度、隐藏层节点、学习率、早停轮数六项参数专门写在一个记录文件里和实验结果存在同一个目录。因为换环境复现时最常见的阻力不是代码逻辑而是当初的超参数记录丢了。所谓“玄学调参”大部分时候不是运气问题是某个细节变量没被固定。把这六项写成常量放在代码开头每次实验变更只改常量模型对比表才有说服力。希望这篇基于 ARIMA-BP 结合时间序列模型与神经网络的完整项目实列能帮你少走几步弯路论文和实验都稳稳落地。祝顺利。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

插件式模块化框架设计:宿主、契约与类加载器隔离实战 2026/9/30 10:34:18

插件式模块化框架设计:宿主、契约与类加载器隔离实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网神SecIPS 3600 P5000-TG13M入侵防御系统部署与调优实战 2026/9/30 10:34:17

网神SecIPS 3600 P5000-TG13M入侵防御系统部署与调优实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
三维向量绕任意轴旋转:罗德里格斯公式与七矩阵连乘 2026/9/30 10:34:17

三维向量绕任意轴旋转:罗德里格斯公式与七矩阵连乘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
高德地图JS API与three.js实现3D建筑多楼层模型实战 2026/9/30 10:34:17

高德地图JS API与three.js实现3D建筑多楼层模型实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
多源Transformer信贷评分:小微授信从三张表到文本融合的落地实践 2026/9/30 10:34:16

多源Transformer信贷评分:小微授信从三张表到文本融合的落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
嵌入式Linux驱动开发实战:设备树、固件与调试经验 2026/9/30 10:34:08

嵌入式Linux驱动开发实战:设备树、固件与调试经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉