恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

径向基神经网络实战:地下水位预测模型构建与调参指南

  • 首页
  • 资讯中心
  • /
  • 径向基神经网络实战:地下水位预测模型构建与调参指南

相关资讯

编译原理实验:手写Cminusf编译器前端与中间代码生成 2026/10/10 1:09:47
机器学习网络流量分类毕设全流程:从数据清洗到论文答辩的完整指南 2026/10/10 1:09:47
PCA9422与STM32L162ZE的低功耗电源管理设计实战 2026/10/10 1:09:47

最新资讯

别再各自为战!MCP成AI界“USB-C接口”:一份C#开发者跨模型接入全指南(TaoToken统一Key实战)
DHCP Option43 sub-option 2(华为 FIT AP 场景)
Dev-C++ 手动释放堆内存(C++ new / C malloc两套写法)
验证 Android GMS Security Provider 更新:MASTG-TEST-0295 静态测试指南
PCA9422+MKV44F64电源管理闭环设计:感知-决策-执行全链路实现
device_add源码研究

今日推荐

Codex 总用英文回答?从 AGENTS.md 到 config.toml 的中文输出调优指南
OpenClaw 自定义插件开发完整指南(2026最新版):从 TypeScript 到 npm 发布
基于Spark的电影推荐系统全链路实战:从爬虫到Web展示

本周热门

MR25H40CDF + PIC18F65K40:工业记录仪高可靠存储实战
基于STM32的数控恒压恒流电源设计:从硬件到PID调参全解析
LT9211 MIPI重定时器原理与双路扇出实战指南

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

径向基神经网络实战:地下水位预测模型构建与调参指南

发布时间:2026/10/10 1:14:47
径向基神经网络实战:地下水位预测模型构建与调参指南 简介这份MATLAB源码项目面向水文地质、水资源管理及环境保护领域的研究者、工程师与相关专业学生以径向基神经网络RBFNN为内核实现地下水位预测。模型利用RBFNN快速收敛、非线性映射与局部逼近特性综合降雨量、蒸发量、地表水体交互、地质结构等历史观测数据构建完整预测流程为防范地面沉降、水质恶化及优化水资源分配提供量化依据。压缩包为zip格式共1个文件核心为一个MATLAB脚本.m文件包体仅1KB轻量却覆盖数据预处理、中心点确定、权值调整及误差评估等关键建模链条可在MATLAB中直接阅读、运行与二次开发。目前已有382人学习下载。对希望快速上手径向基预测建模、理解隐藏层径向基函数与K-means聚类选点思路的读者这份代码具备较高参考价值可作为地下水预测模型搭建的基础模板便于结合自身水文地质数据扩展特征输入与调参优化。1. 径向基神经网络预测地下水位这份资源到底能帮你解决什么问题搞水文和地质灾害的人对地下水位预测这事应该都挺有感触的。数值模拟方法如MODFLOW固然严谨但建模周期长、参数率定繁琐对一个具体工程场地来说常常杀鸡用牛刀。而我拆完这份「基于径向基神经网络的预测地下水位_prediction_径向基预测」资源后的直接感受是它是给「想快速拿到一个能用的预测模型、又不想把时间耗在传统水文地质建模」的人准备的。径向基神经网络RBFNN是一种结构简单、训练速度快且不存在局部极小困扰的神经网络在地下水位这类非线性时间序列预测上有天然优势。这份资源核心涵盖了从数据预处理、RBF网络构建、参数整定到精度评价的完整流程拿来改一改数据格式就能跑自己的场地数据适合有基础Python或Matlab操作经验、正在做地下水位动态预测或相关课题的从业者。2. RBF神经网络的原理与选型为什么地下水位预测偏偏适用它2.1 三层结构和径向基函数的内在逻辑径向基神经网络的结构其实非常简洁一个输入层、一个隐含层和一个输出层。它最核心的思想是隐含层里的每一个神经元都对应一个径向基函数最常见的是高斯函数也就是 [ \varphi(|x - c_i|) \exp\left(-\frac{|x - c_i|^2}{2\sigma^2}\right) ] 这样的形式。这个式子里的 ( c_i ) 是基函数中心( \sigma ) 是扩展常数或者说宽度它决定了这个基函数的影响半径。和BP神经网络靠误差反向传播去慢慢调整每一层权值不同RBF网络是一种局部逼近网络。输入样本落到哪个基函数的附近就只有那附近的神经元会强烈响应其他的神经元基本不激活。这个特性在地下水位预测里极其讨巧——地下水位的动态变化往往受降雨、蒸发、开采量等因素影响各个因素和地下水位之间的关系在量级和变化趋势上都不一致RBF的局部响应特性恰恰能把这种复杂的非线性关系分解成若干局部区域分别去逼近。我一般在给学生讲这个的时候会说BP像是在全局范围内硬拟合一条曲线而RBF是分段拟合之后再拼起来拼得好不好取决于中心点和宽度选得好不好。2.2 与BP网络、LSTM的对比在什么条件下RBF是更好的那个选择很多人在做时间序列预测时第一反应就是LSTM或者BP。但RBF在特定条件下反而是更务实的选择。对于一个地下水监测井来说能拿到的有效历史数据往往也就几十条到几百条这在深度学习领域属于小样本范畴。LSTM在这种数据量下非常容易过拟合改起来也麻烦动不动就要调层数、调学习率、调dropout。BP存在局部极小问题做十次训练可能得到十个不同的结果。而RBF网络的训练过程是解线性方程组的问题输出层的权值通过最小二乘法直接计算训练速度极快结构确定后结果也是确定的。选型这事我觉得不能盲目崇尚「越高级越好」。就地下水位预测这个场景来说如果你的目标是月尺度预测、数据序列长度在几百条以内、特征维度在五到十个之间那RBF是性价比极高的方案。我之前拿某个工程场地的地下水位监测数据做过对比同样的数据量下RBF的训练时间比LSTM少了两个数量级而预测精度在验证集上的差距很小。这份资源里的代码框架用的就是经典的RBF训练流程先确定中心再算宽度最后解权值。理解这个顺序后面调参才不会瞎试。2.3 地下水位预测的输入特征和输出目标怎么设定这份资源所处理的预测问题本质上是一个监督学习任务。输出目标很明确未来某个时刻的地下水位埋深或标高。输入特征的选择则是决定模型上限的环节。常见做法是把过去若干个时刻的地下水位观测值作为自回归项再加上同期降雨量、蒸发量、气温等气象因素。比如t-1, t-2, t-3时刻的水位值加当月降雨量预测t时刻的水位值这是一个典型的滑动窗口构造方式。窗口大小一般取3到7个时间步具体要根据监测频率和数据长度来试。资源包里涉及的数据处理部分会要求你把原始监测数据整理成这样的监督学习格式每一行是一组输入和输出。我建议在做这一步的时候多留一个心眼先做相关性分析看看哪些因子和水位的相关系数超过0.3再决定要不要放进模型。不是降雨量越大就越好有些地区的开采量才是主导因素而开采量数据往往很难拿到这种时候就要靠水位自身的历史序列来做单变量预测效果通常也还能接受。3. 数据准备与预处理实操把杂乱监测记录变成能喂进网络的样子3.1 缺失值处理的时间序列方法不能用均值填充糊弄过去地下水位监测数据几乎不可能是完美连续的仪器故障、人为读数缺失、数据传输中断都会造成时间序列上的空洞。这里要特别注意一个坑很多初学者直接用整列均值去填充这在时间序列里是很危险的做法。地下水位的动态具有很强的自相关性今天的埋深大概率跟昨天有关用一个全局均值填进去等于人为制造了一个突变点RBF网络对这种异常值极其敏感。我习惯的做法是按时间窗口做线性插值或者用前向填充加后向填充的组合。如果缺失段不长比如三到五个点以内线性插值的效果就很好。如果缺失段很长那宁可把这段数据删掉也不要强行填充。这份资源里的数据预处理脚本对处理短段缺失做了封装但你拿到自己的数据时还是要检查一遍缺失分布心里有个数。3.2 归一化的两种方式和反归一化的时机RBF网络对输入数据的尺度很敏感因为高斯函数里要算和中心的欧氏距离。如果输入特征的量级不同比如水位埋深是十几米、降雨量是几十毫米、蒸发量是几百毫米那距离计算就会被量级最大的那个特征主导剩下几个特征等于白加。所以在构建输入矩阵之前必须做归一化。我一般推荐用min-max归一化把数据映射到0到1的区间公式是 [ x\frac{x-x_{\min}}{x_{\max}-x_{\min}} ]。这份资源里提供的是统一用训练集的极值去做归一化换句话说你要先切分训练集和测试集然后只基于训练集统计最小值和最大值再用同一个极值去变换测试集。这个细节非常重要我见过好几个人是用全部数据的极值来归一化这属于数据泄漏会让验证集的误差虚低模型真正部署的时候就被打回原形了。训练完成后模型输出的结果是0到1之间的数值要还原成真实水位值还必须在预测之后做反归一化也就是 [ x x (x_{\max}-x_{\min}) x_{\min} ] 这个过程必须和归一化一一对应。资源里的代码会在训练阶段就返回归一化器的参数方便你在完成预测时直接调用。顺手提一个习惯把这段反归一化代码直接紧跟在预测代码后面写成一行注释标清楚别分两个脚本否则很容易忘。import numpy as np def minmax_fit(data): 基于训练数据计算归一化参数只调用一次 data_min np.min(data, axis0) data_max np.max(data, axis0) return data_min, data_max def minmax_transform(data, data_min, data_max): 用训练阶段得到的极值变换数据测试集也必须走同一套参数 return (data - data_min) / (data_max - data_min 1e-8) def minmax_inverse(data_scaled, data_min, data_max): 反归一化把模型输出还原为真实水位值 return data_scaled * (data_max - data_min 1e-8) data_min # 假设已将原始数据切分为 train_x, train_y, test_x, test_y x_min, x_max minmax_fit(train_x) # 只用训练集拟合极值 y_min, y_max minmax_fit(train_y) train_x_s minmax_transform(train_x, x_min, x_max) train_y_s minmax_transform(train_y, y_min, y_max) test_x_s minmax_transform(test_x, x_min, x_max) # 注意这里也只用训练极值 test_y_s minmax_transform(test_y, y_min, y_max)这段代码的逻辑核心在于先fit再transform的分离。minmax_fit一旦在训练集上执行过后面所有数据包括未来部署时新来的观测值都必须沿用这套极值参数。那个1e-8只是防止除以零的保护项一般不会触发但加上它能让脚本更健壮。我见过有人图省事直接调用sklearn的MinMaxScaler并对着整个数据集fit_transform测试集信息在拟合阶段就泄漏进了归一化参数里这属于非常隐蔽的翻车点。3.3 数据切分的顺序问题打乱数据是严重错误地下水位数据是时间序列切分训练集和测试集时是绝对禁止随机打乱的。有些人在做普通机器学习时养成了train_test_split默认shuffleTrue的习惯拿到时间序列也直接这么干结果测试集里混进了时间上比训练集更早的数据。这种做法会同时高估模型的预测能力和泛化能力因为模型在训练时看到的测试样本本质上是从另一个监测井复制来的相似时段。资源里推荐的比例一般是前80%的数据做训练后20%做验证。这种做法有一个明显的好处它模拟了模型部署时的真实场景也就是用历史数据训练去预测「未来的」水位。我实际做项目时还会再多留一个心眼把最后10%的数据单独切出来完全不动它等模型基本调好后再跑一次作为最终的泛化验收这部分数据相当于压箱底的存货不能提前拿到模型上去试。4. 核心代码与模型训练实战从RBF网络构建到预测结果输出4.1 Matlab版本与Python版本各自的运行逻辑这份资源包里同时提供了Matlab与Python两个版本的实现。Matlab版本的核心是两行函数newrb和newrbe它们都是Matlab神经网络工具箱里专门用于设计RBF网络的函数。newrbe是一种精确设计——它创建的隐含层神经元数量和训练样本数量相同这样训练误差可以做到零误差但代价是网络结构巨大尤其在样本量几百条时模型会非常臃肿且毫无泛化能力。newrb则是渐进式增长它每次只增加一个隐含层神经元直到误差达到目标或者神经元数量达到上限为止这才是实际项目中真正要用的函数。Python版本则是用NumPy从零手写了一个RBF网络的训练和预测类包含KMeans聚类确定中心、按近邻法计算宽度、最小二乘法求输出层权值这些步骤。如果你之前用过scikit-learn可能会觉得直接调RBFInterpolator或者SVR会更省事。但手写版本的好处在于完全透明——你可以打印出每个隐含层节点的中心坐标和宽度甚至可以存盘之后去做可视化分析。对做研究或者写论文的人来说这个能力比黑匣子式的调用重要得多。import numpy as np from sklearn.cluster import KMeans def rbf_calculate_width(centers): 通过中心之间的邻近距离估算每个高斯函数的扩展宽度 n_centers centers.shape[0] widths np.zeros(n_centers) for i in range(n_centers): # 计算该中心与其他所有中心的欧氏距离 dists np.linalg.norm(centers - centers[i], axis1) # 取距离最近的3个中心的平均距离作为宽度乘0.5做保守缩放 nearest_k np.sort(dists)[1:4] widths[i] np.mean(nearest_k) * 0.5 return widths def rbf_basis(X, centers, widths): 生成径向基函数的激活矩阵行对应样本列对应隐含层神经元 n_samples X.shape[0] n_centers centers.shape[0] phi np.zeros((n_samples, n_centers)) for j in range(n_centers): # 高斯径向基函数widths[j]分母项让窄函数响应更尖锐 diff X - centers[j] phi[:, j] np.exp(-np.sum(diff ** 2, axis1) / (2 * widths[j] ** 2)) return phi def train_rbf(X, y, n_centers): 三步走KMeans聚类中心、估宽度、最小二乘求权值 # 第一步用聚类把隐含层中心放在数据密度高的地方而非随机散布 kmeans KMeans(n_clustersn_centers, random_state0, n_init10).fit(X) centers kmeans.cluster_centers_ # 第二步依据中心间的距离分布给每个隐含层节点分配宽度 widths rbf_calculate_width(centers) # 第三步在激活矩阵上解最小二乘问题直接得到输出层权值无需迭代 phi rbf_basis(X, centers, widths) # 添加偏置列对应网络输出层的阀门解线性方程组时需要 phi_bias np.hstack([phi, np.ones((X.shape[0], 1))]) weights np.linalg.pinv(phi_bias.T phi_bias) phi_bias.T y return centers, widths, weights整段代码的设计逻辑遵循了RBF训练的经典路线聚类中心、估算宽度、解权值。n_centers的取值很关键隐含层节点数太少拟合能力不足也就是欠拟合节点太多则会在样本点之间产生剧烈的震荡。n_init10是为了避免KMeans收敛到局部解初次跑通时先固定随机种子保证结果可复现。np.linalg.pinv用的是伪逆而不是直接求逆这是为了应对矩阵 ( \Phi^T \Phi ) 可能奇异的情形加了这一层代码在极端数据下也不会直接崩溃。如果你发现预测曲线出现不合理的陡峭跳动优先怀疑是widths算得太小把那个0.5的缩放系数往上调一调就行。4.2 spread参数到底在控制什么调参的玄学与确定性使用Matlab版本时newrb里最关键的参数是spread也就是径向基函数的扩展常数。很多人第一次用的时候直接给个默认的1.0结果预测曲线不是过度平滑就是震荡得厉害。这里有一个经验法则spread应该大致取输入数据两两之间平均距离的1.0到1.5倍左右。如果你用归一化后的数据做训练输入值都缩放到0到1之间那么spread取0.5到1.5是一个比较常见的合理区间。spread设得太小每个高斯函数只能感受到极近处的数据点模型会试图在每个训练样本附近都立起一个尖峰预测区间内的曲线表现为锯齿状震荡spread设得太大所有基函数的响应区域高度重叠每个中心都能感知到全范围的数据隐含层做不出有效区分整个网络就退化成了一个大号线性回归预测曲线的波动被强行抹平。% 训练一个渐进式RBF网络最大隐节点数50目标误差0.001 net newrb(train_x, train_y, 0.001, spread, 50, 1); % 测试集上完成预测由于newrb输出是行向量格式需注意转置对齐 pred_y sim(net, test_x);在参数调优这件事上不要靠肉眼一遍遍试。建议写一个双层循环把spread的候选范围定在0.2到2.0之间步长0.1然后对每个值跑10次训练记录测试集的平均绝对误差MAE和均方根误差RMSE画出一条误差随spread变化的曲线最低点就是那个区间内最合适的取值。有一点算一点这么做虽然土但效果极其稳定。4.3 训练集与测试集划分比例对精度的影响我注意到常见的设定是训练集占70%到90%之间资源里默认给的是80%。但这并不意味着这是一个铁律而是要看总样本量。如果总数据只有80个月你用80%训练那就只有16个月的验证段一年多的跨度预测结果是偶然性很强的一次气候异常就可能让误差翻倍。这种情况我建议改成70%训练给验证段留出24个月以上趋势特征能看得更清楚。反过来如果总样本量超过300个那90%训练都没问题因为30个点的验证段就足够代表多季节的特征了。这里没有标准答案但可以遵循一个原则验证集至少要包含一个完整的年周期这样模型才能被检验出对不同季节水位动态的适应能力。就在这一点上资源里没有强调你得自己保证。# 一个简单的试跑流程示例在项目根目录执行即可 # 1. 用默认参数快速试跑一次确认数据管线没有bug python train_rbf.py --data ./data/well_data.csv --centers 10 --spread 1.0 # 2. 调参循环分别尝试4/6/8/10/12个隐节点观察误差变化 python train_rbf.py --data ./data/well_data.csv --centers 4 --spread 0.8 python train_rbf.py --data ./data/well_data.csv --centers 6 --spread 0.8 python train_rbf.py --data ./data/well_data.csv --centers 8 --spread 0.8 # 3. 对表现最好的参数组重新训练并保存模型 python train_rbf.py --data ./data/well_data.csv --centers 8 --spread 1.0 --save ./output/model.npz这种命令行式的参数化设计在项目推进中是顺手磨刀的习惯。每个参数都有对应的命令行入口改参数不需要去翻代码、改文件、记数值记录下命令行本身就能复现结果。--save选项把训练出的中心和权值都存到.npz文件里等部署的时候直接加载预测省去每次重训的时间。这个脚本编排方式是我觉得这份资源里最值得借鉴的结构。5. 常见坑与排查RBF预测地下水位时我踩过的那些坎5.1 预测曲线整体滞后一拍输出比实际晚了一个时段这是我玩RBF做时间序列预测时遇到的第一个坑现象非常典型预测曲线形状和实测基本一致但整体往右平移了一个时间步看起来像模型在「抄」上一个时刻的真实值。原因在于输入特征和输出之间的相关性被模型偷懒利用了如果 ( t-1 ) 时刻的水位和 ( t ) 时刻的水位相关系数高达0.98那么模型只需记住「输出等于上一个输入」就能把训练误差压得很低。解决的办法主要有两个思路。一个是从输入构造上做文章在输入里显式加入差分项比如 ( d_{t-1} h_{t-1} - h_{t-2} )让模型必须学习水位变化的规律而不是简单复制数值另一个是换用多步预测的评估方案也就是说要求模型用 ( t-3, t-2, t-1 ) 去预测 ( t1 )增加中间的时间间隔迫使模型要真正学习动态规律而不是靠相邻时刻的高相关性蒙混过关。5.2 测试集误差远低于训练集误差小心数据泄漏一般来说训练误差低于测试误差是正常的但如果你发现测试集误差反而更好先不要高兴。这通常意味着测试集的信息已经悄悄混进了训练过程。最典型的是归一化参数泄漏我前面提到过如果fit_transform对着全量数据执行了那测试集的分布信息就进入了模型的预处理环节。还有一种可能是KMeans聚类时用了包含测试样本在内的所有数据来确定中心位置这种情况本质上是用了未来的「答案」来帮助定位基函数中心。修复方法很简单把聚类的样本严格限定在训练集的输入矩阵上预测时再对测试样本计算它的激活值。5.3 归一化后的负值数据如何处理有时你拿到的地下水位数据可能是相对于某个基准面的标高值其中一部分本来就应该为负数。有人为了图省事会把所有数据先加一个足够大的常数让它们都变正再做min-max归一化。这个操作本身不改变相对关系模型也算得出来。但如果你用的是log归一化或者其他非线性变换就会出问题——负值加上偏移后再做log变换前后的间距比例关系会被扭曲。我习惯的做法是统一使用min-max归一化因为它是一个线性变换不改变原始数据的内在结构。如果你的特征里混了几个物理意义不同的变量比如水位标高可能是负、降雨量恒正、蒸发量恒正你也不要分别去归一化再把结果拼一起那样会让三个变量在模型中的权重完全被归一化尺度的选取左右。正确的做法是拼成一个整体矩阵按整列做归一化保留下每个变量的原始分布差异。5.4 spread和隐节点数的耦合效应单独调一个参数没有意义这是一个非常容易翻车的地方。很多人调参时只动spread保持隐节点数不变看到误差大了就把spread改大看到震荡了又把spread改小来回折腾最后发现一个合适的组合都找不到。其实spread和中心数量之间存在耦合关系中心数量少、spread大基函数的响应区域比较平滑适合趋势平缓的水位变化中心数量多、spread小模型能精确刻画局部的起伏适合在强开采条件下快速波动的水位。所以正确的调参方式是把这两个参数放在同一个网格里搜索不要单独优化。例如固定中心数在5到20之间spread在0.3到2.0之间用双重循环遍历所有组合在验证集上选出最优搭配。搜索完成后把结果画成热力图看看大概率看到一个平坦的谷底区域整个谷底范围内的参数组合效果都差不多你任意取一个中间值都可以这一步能避免很多无谓的纠结。5.5 模型在验证集上效果好但实跑却崩了这个问题我遇到过很多次也带学生踩过。现象是在历史数据上回测时各项精度指标都很好但你拿它去预测未来一个月的水位时预测结果严重偏离常识。原因通常不是模型结构本身而是输入的边界情况。历史数据里的降雨量、蒸发量等特征都在一个固定的统计范围内变动而未来一个月恰好出现了极端干旱或极端暴雨这些输入特征已经离开了训练数据的分布空间。RBF网络本质上是一个插值工具它对分布区间内的输入能做出合理响应但一旦输入落在所有训练样本都在的区域之外基函数响应接近于零模型输出就完全不可控。这种情况下不要强行依赖模型更务实的做法是在部署方案里加一道守门逻辑新输入向量离所有中心点都超过3倍宽度时就自动超纲提示改用近期历史平均值作为降级预案。这也是我习惯在项目交付时要求加上的一个安全阀。6. 用滑动窗口与多步滚动预测把模型从论文带到工程现场上面各章的内容基本覆盖了RBF预测地下水位的主体流程但到了真正部署或者写项目报告的时候还有一个更贴近实际的做法值得马上用起来那就是滑动窗口滚动预测。用过去一段连续水位值去预测未来一个点已经是往前走了一步但工程上一个月的预报往往需要给出未来一周或者未来十天的逐日或逐旬水位变化这种情况下你应该把预测窗口拉长。常见做法是把结构从「输入 ( t-3, t-2, t-1 ) 预测 ( t )」扩展到「输入 ( t-3, t-2, t-1 ) 预测 ( t, t1, ..., t4 )」这种多输出结构。这样一来模型一次训练就能生成未来五个时刻的预测值。这里容易出现一个认知偏差如果你把未来五个时刻当成五个独立的目标分别训练五个模型参数的累积误差会很大而共享隐含层、同时输出五个值每个输出节点只接一组权值模型仍然保持RBF的简洁性泛化效果也会更稳定。就拿RBF资源里一个出色的小技巧来说在输出层设计上预测日期越远的输出节点其权值的正则化系数可以适当加大。这个做法的意图很明显——越往后的时间点不确定性越大你希望通过更强的约束来防止权值跑得太大而过度拟合近期波动。实现方式也简单在解最小二乘那一步损失函数里加一项 ( \lambda |w|^2 )对不同的输出列用不同的 ( \lambda ) 即可越靠后的输出列取越大的正则化系数。def train_rbf_multioutput_with_regularization(phi, Y, lambda_per_output): 多输出RBF训练每个输出目标列单独施加L2正则 # phi是激活矩阵(N, M)Y是目标矩阵(N, T)T表示预测的步数 M phi.shape[1] W np.zeros((M 1, Y.shape[1])) # 加一列全1对应输出层的偏置项偏置不施加正则 phi_bias np.hstack([phi, np.ones((phi.shape[0], 1))]) for t in range(Y.shape[1]): # 当前输出步的正则系数越远的时间步给越大的lambda lam lambda_per_output[t] # 正则化的最小二乘闭式解(phi^T phi lam*I)^(-1) phi^T y A phi_bias.T phi_bias lam * np.eye(M 1) # 偏置项不参与收缩所以最后一行的正则手动去掉后再加回 A[-1, -1] - lam W[:, t] np.linalg.solve(A, phi_bias.T Y[:, t]) return W其实这一步在RBF里做起来非常顺滑因为RBF的输出层本来就是线性问题你完全可以把多输出看成是多个线性方程共用同一个基函数矩阵每个输出列单独解一遍方程组。正因为如此RBF这种结构特别适合做成多步预测器保持整个过程保持可解释而且没有循环网络的迭代累计误差。在工程应用上我自己的习惯是每个月初用上截至目前的全部数据重新滚动训练一次然后在报告里画出三组线历史实测线、模型回测线、未来一个周期预测线。回测精度用RMSE和R²去评价预测段则用区间阴影标记出来表示这个范围来自模型外推不是实测结果。这个做法在给甲方做汇报时特别管用既展示了预测能力也坦诚地标出了不确定区间。说到最后给我留下最深印象的是有一次项目验收评审专家问我模型的预测区间是怎么来的我一下子答不上来因为当时只用RBF输出了单一值压根没做不确定性分析。从那以后我每次做水位预测都会用多个不同隐节点数的RBF模型组成一个预测集合用它们输出的均值做最终结果用标准差画置信区间。别小看这个改动它把很多看似玄学的预测说辞落到了可计算的地方。希望这篇笔记能帮你在跑通RBF地下水位预测这件事上省下踩坑的时间。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号