基于互信息法的混沌序列最优时延计算系统
项目简介
本项目是一个用于混沌时间序列分析的MATLAB算法实现,核心功能是利用平均互信息(Average Mutual Information, AMI)原理,自动计算并搜索混沌序列的最优时间延迟(Time Delay, $tau$)。
在混沌系统的相空间重构(Phase Space Reconstruction)过程中,选择合适的时延参数至关重要。传统的自相关函数法仅能衡量线性相关性,而互信息法能够有效地度量时间序列中存在的非线性统计依赖关系。本项目通过计算互信息随延迟时间变化的曲线,并自动检测曲线的第一个局部极小值点,从而确定用于相空间重构的最优时延。
功能特性
- 混沌信号生成:内置Lorenz混沌系统模型,使用四阶Runge-Kutta算法(RK4)生成标准混沌时间序列,作为分析对象。
- 数据预处理:包含去除瞬态数据(Transient discarding)和Min-Max归一化处理,确保分析数据的平稳性和统一性。
- 平均互信息计算:基于等距离直方图法(Equidistant Histogram)对连续序列进行离散化,计算原序列与延迟序列之间的互信息量。
- 最优时延自动搜索:实现了自动寻找AMI曲线第一个局部极小值的算法,直接输出最优 $tau$ 值。
- 可视化展示:提供完整的图形化输出,包括原始时间序列波形图和互信息随延迟变化的趋势曲线,并在图中标注最优时延点。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外的工具箱(Toolbox),主要基于基础矩阵运算实现
使用方法
- 直接运行主程序脚本。
- 程序将自动执行以下流程:
* 求解微分方程生成Lorenz混沌数据。
* 在控制台实时打印互信息计算的进度。
* 计算完成后,在命令窗口输出找到的最优时间延迟值($tau$)。
* 弹出一个图形窗口,展示原始序列片段以及AMI曲线分析结果。
代码实现逻辑详解
主程序严格按照以下五个步骤执行,实现了从数据生成到结果分析的全流程:
1. 参数设置与初始化
程序首先进行环境清理,然后定义了系统的关键参数。包括数据长度(5000点)、舍弃的瞬态点数(1000点)、采样步长(0.01)、最大延迟搜索范围(100点)以及用于概率密度估计的直方图分箱数(64 bins)。同时定义了Lorenz系统的动力学参数(sigma, beta, rho)。
2. 混沌数据生成
为了提供演示数据,代码内部实现了一个基于四阶Runge-Kutta法(RK4)的求解器。
- 通过循环迭代求解Lorenz系统的微分方程。
- 仅提取状态向量中的X分量作为待分析的一维时间序列。
- 预处理:生成数据后,程序移除了前1000个点以消除初始值的瞬态影响,并将剩余数据归一化到 [0, 1] 区间。
3. 平均互信息 (AMI) 计算
这是程序的核心部分。代码通过循环遍历从 0 到
max_tau 的每一个延迟值 $tau$:
- 构建序列:根据当前 $tau$,构建当前时刻序列 $x(t)$ 和延迟序列 $x(t+tau)$。
- 调用算法:将这两组序列传入互信息计算子函数,获得对应的AMI值。
- 全量计算:将计算结果存储在向量中,形成AMI曲线数据。
4. 最优时延搜索
计算完成后,程序通过遍历AMI数据向量来寻找最优时延。
- 判别标准:依据Fraser和Swinney提出的准则,寻找互信息曲线的第一个局部极小值。
- 算法实现:比较当前点与前后相邻点的大小,即满足 $AMI(i) < AMI(i-1)$ 且 $AMI(i) < AMI(i+1)$ 时,判定为极小值点。
- 异常处理:如果在搜索范围内未找到极小值(即曲线单调递减),程序会发出警告并退而求其次选择最小值位置作为结果。
5. 结果可视化
程序利用MATLAB绘图系统生成两幅子图:
- 上图:展示归一化后的Lorenz时间序列的前1000个数据点,用于直观观察混沌波形。
- 下图:绘制互信息 $I(tau)$ 随延迟 $tau$ 变化的曲线,并使用红色圆点和文本明确标记出计算得到的最优时延位置。
关键算法与函数细节
代码中包含两个重要的子函数来支撑主逻辑:
Lorenz微分方程定义
定义了标准的Lorenz系统方程组:
- $frac{dx}{dt} = sigma(y - x)$
- $frac{dy}{dt} = x(rho - z) - y$
- $frac{dz}{dt} = xy - beta z$
该函数被RK4求解器反复调用以推演系统状态。
互信息计算函数 (calculate_ami_value)
该函数实现了离散化互信息的数值计算:
- 等距离分箱(数据离散化):
代码没有假设数据分布,而是采用等距离划分的方法。根据输入数据的最大值和最小值,将连续数值映射到
1 到
partitions(例如64)的整数索引上。
- 联合直方图统计:
创建一个二维矩阵,通过遍历所有数据点对 $(x_i, y_i)$,在矩阵对应坐标 $(bin_x, bin_y)$ 上累加频数,从而得到联合频数分布。
- 概率估计:
* 联合概率 $P(x, y)$:联合直方图除以总样本数。
* 边缘概率 $P(x)$ 和 $P(y)$:分别对联合概率矩阵按行和按列求和。
- 香农熵与互信息公式:
最后根据互信息定义公式进行累加求和:
$I(X;Y) = sum_{x,y} P(x,y) log_2 frac{P(x,y)}{P(x)P(y)}$
代码中加入了非零判断,避免了
log(0) 的计算错误。