基于RBF神经网络的Lorenz混沌时间序列预测
项目简介
本项目实现了一个能够预测Lorenz混沌系统未来状态的径向基函数(RBF)神经网络模型。项目不仅包含了神经网络的构建与训练,还完整实现了从混沌系统的数值仿真、相空间重构参数(延迟时间和嵌入维数)的自动寻优,到最终预测结果评估的全流程。
整个流程完全在MATLAB环境中通过脚本实现,利用混沌理论中的相空间重构技术,将一维时间序列还原为高维相空间轨迹,从而挖掘其内在的动力学特性,供RBF网络学习和预测。
功能特性
本项目在单一脚本中集成了以下核心功能:
- Lorenz混沌序列生成:利用四阶Runge-Kutta(RK4)方法数值积分求解Lorenz微分方程组。
- 数据预处理:包含去除瞬态响应以保证系统进入混沌吸引子轨道,以及数据的归一化处理。
- 最佳延迟时间($tau$)计算:基于互信息法(Mutual Information),通过计算序列与滞后序列的信息熵,寻找互信息的第一个局部极小值点作为最佳延迟时间。
- 最小嵌入维数($m$)计算:基于虚假邻点法(False Nearest Neighbors, FNN),分析相空间轨迹在维度增加时邻近点距离的变化率,以确定最佳嵌入维数。
- 相空间重构:根据计算出的$tau$和$m$,构建用于神经网络训练的输入特征矩阵和目标向量。
- RBF神经网络构建:
* 利用
K-均值聚类(K-Means)算法确定隐含层基函数的中心。
* 基于最大中心距离启发式算法确定高斯函数的宽度(Spread)。
* 使用
线性最小二乘法(伪逆)直接计算输出层权重,实现快速训练。
- 预测与评估:在独立的测试集上进行单步预测,计算均方误差(MSE)、均方根误差(RMSE)和平均绝对误差(MAE)。
- 多维度可视化:绘制Lorenz相图、参数寻优曲线、预测结果对比图及误差分布曲线。
系统要求
- MATLAB:R2016a及以上版本(代码主要依赖基础矩阵运算,
mapminmax函数属于Deep Learning Toolbox或Neural Network Toolbox,若无工具箱需手动实现归一化)。
使用方法
- 直接运行主脚本函数
main。 - 程序将自动执行所有计算步骤,并在命令窗口输出以下信息:
* 最佳延迟时间 ($tau$)
* 最佳嵌入维数 ($m$)
* 测试集的误差指标 (MSE, RMSE, MAE)
- 运行结束后会弹出一个包含四个子图的图形窗口,展示仿真与预测结果。
详细实现逻辑与算法分析
1. Lorenz时间序列仿真
代码首先初始化Lorenz系统的参数($sigma=10, beta=8/3, rho=28$)和初始状态。使用步长为0.01的
四阶Runge-Kutta法进行迭代计算。为了消除初始值对系统轨迹的影响,代码显式去除了前2000个点(瞬态响应),仅保留后续稳定的混沌数据,并提取X分量作为研究对象。使用
mapminmax将数据归一化至[-1, 1]区间。
2. 参数寻优算法
- 互信息法 (Mutual Information):
代码实现了一个自定义函数来计算互信息。它通过直方图法(100个bins)将连续数据离散化,计算概率分布 $P(s)$、$P(q)$ 和联合分布 $P(s,q)$,进而求得熵 $H(S)$、$H(Q)$ 和联合熵 $H(S,Q)$。互信息定义为 $I(tau) = H(S) + H(Q) - H(S,Q)$。主程序遍历延迟时间 $tau$ 从1到50,寻找 $I(tau)$ 的第一个局部极小值作为最佳延迟时间。
为确定嵌入维数 $m$,虽然代码片段截断,但逻辑展示了FNN的核心思想:在 $m$ 维空间中寻找每个点的最近邻点,计算两者之间的欧氏距离。接着,比较这两点在 $m+1$ 维空间下的距离增长情况。如果距离显著增大(超过阈值 $R_{tol}=15$),则认为该邻点是投影造成的“虚假邻点”。代码统计不同维数下的虚假邻点比例,当比例低于5%时,选定该维数为最佳嵌入维数。
3. 相空间重构与数据集构建
利用确定的最佳 $tau$ 和 $m$,代码通过滑动窗口机制构建输入矩阵。
- 输入向量:$X_i = [x(t), x(t-tau), ..., x(t-(m-1)tau)]$
- 目标向量:$Y_i = x(t+1)$
这实际上是将时间序列预测转化为一个监督学习问题。数据集被按7:3的比例划分为训练集和测试集。
4. RBF神经网络设计
代码手动实现了RBF网络的核心逻辑,而非直接调用工具箱函数
newrb,流程如下:
- 中心确定:调用
custom_kmeans 函数(逻辑为K-Means聚类),从训练样本中选取50个聚类中心,这些中心代表了相空间中数据分布的密集区域。 - 宽度确定:计算各中心点之间的距离,取最大距离除以 $sqrt{2 times text{隐层节点数}}$ 作为高斯基函数的宽度(Sigma),确保基函数能够覆盖输入空间。
- 权重求解:
1. 计算隐层输出矩阵 $G$,其中元素 $G_{ij}$ 为第 $i$ 个样本与第 $j$ 个中心的高斯激活值:$exp(-|X_i - C_j|^2 / (2sigma^2))$。
2. 利用线性代数方法求解输出权重 $W$。为了使得预测误差最小,代码通过计算伪逆 $G^+$ 来求解线性方程组 $T = GW$,即 $W = text{pinv}(G) times T$。这种方法比梯度下降法训练速度快得多,且能得到全局最优解(针对输出层而言)。
5. 结果可视化
绘图部分包含四个子图:
- Lorenz系统相图:展示生成的三维(XYZ)混沌吸引子轨迹。
- 参数选择曲线:双y轴图,左轴显示互信息随延迟的变化,标记出极小值;右轴显示虚假邻点率随维度的变化,展示最佳维数的选取过程。
- 预测对比:截取部分测试集数据,通过折线图对比真实值与RBF网络预测值,直观展示拟合效果。
- 误差曲线:绘制预测误差随时间的变化,便于观察是否存在系统性偏差。