一、核心参数计算原理
- 时间延迟(τ) 互信息法:通过计算时间序列与其延迟版本之间的互信息,寻找第一个极小值点作为最佳延迟。 自相关法:通过自相关函数(ACF)首次降至原始值1/e或过零点的延迟时间。 C-C方法:结合自相关和平均位移法,同时确定延迟时间和嵌入窗。
- 嵌入维数(m) 假近邻法(FNN):通过计算不同嵌入维下虚假最近邻比例的收敛性确定最小嵌入维。 Cao方法:基于相空间重构后邻域距离的变化率确定嵌入维。
- 关联维数(D₂) Grassberger-Procaccia(GP)算法:通过关联积分计算双对数曲线的斜率估计关联维。 改进无标度区间:使用模拟退火遗传算法优化无标度区间选择。
二、MATLAB代码实现
1. 数据预处理与相空间重构
% 生成混沌序列(Logistic映射)
r = 3.99; x0 = 0.5; N = 1000;
x = zeros(1,N);
x(1) = x0;
for i = 2:N
x(i) = r * x(i-1) * (1 - x(i-1));
end
% 归一化
x = (x - min(x)) / (max(x) - min(x));
% 相空间重构(时间延迟τ=5,嵌入维m=3)
tau = 5; m = 3;
X = reconstruction(x, tau, m);
% 重构函数
function X = reconstruction(data, tau, m)
N = length(data);
X = zeros(m, N - (m-1)*tau);
for i = 1:m
X(i,:) = data((1:N - (m-1)*tau) + (i-1)*tau);
end
end
2. 时间延迟计算(互信息法)
function tau = mutual_information(data, max_delay)
N = length(data);
H = zeros(1, max_delay);
for tau = 1:max_delay
% 分割为τ不相交子序列
subs = disjoint(data, tau);
H(tau) = 0;
for i = 1:size(subs,1)
H(tau) = H(tau) + entropy(subs(i,:));
end
H(tau) = H(tau)/size(subs,1);
end
% 寻找第一个极小值点
[~, tau] = min(H(2:end-1) > H(1:end-2) & H(2:end-1) > H(3:end));
tau = tau + 1;
end
% 辅助函数:分割序列
function subs = disjoint(data, tau)
N = length(data);
num_sub = floor(N/tau);
subs = zeros(tau, num_sub);
for i = 1:tau
subs(i,:) = data((i-1)*num_sub + 1 : i*num_sub);
end
end
3. 嵌入维数计算(假近邻法)
function m = false_nearest_neighbors(data, max_m)
N = length(data);
m = 1;
while m <= max_m
% 重构相空间
X = reconstruction(data, 1, m);
distances = pdist(X);
% 计算虚假近邻比例
fnn_ratio = compute_fnn(X, distances);
if fnn_ratio < 0.1
break;
end
m = m + 1;
end
end
% 辅助函数:计算虚假近邻比例
function ratio = compute_fnn(X, distances)
N = size(X,2);
ratio = 0;
for i = 1:N-1
[~, idx] = sort(distances(i,:));
nearest = idx(2);
% 检查是否为虚假近邻
if norm(X(:,i) - X(:,nearest)) > 10*norm(X(:,i) - X(:,idx(3)))
ratio = ratio + 1;
end
end
ratio = ratio / N;
end
4. 关联维数计算(GP算法)
function D2 = grassberger_procaccia(data, m, r_min, r_max)
N = length(data);
X = reconstruction(data, 1, m);
distances = pdist(X);
log_r = logspace(log10(r_min), log10(r_max), 50);
C = zeros(size(log_r));
for k = 1:length(log_r)
r = log_r(k);
count = 0;
for i = 1:N
for j = i+1:N
if distances(i,j) < r
count = count + 1;
end
end
end
C(k) = count / (N*(N-1)/2);
end
% 线性拟合(忽略前10%和后10%数据)
p = polyfit(log(log_r(11:end-10)), log(C(11:end-10)), 1);
D2 = p(1);
end
5. 综合计算示例
% 参数设置
max_delay = 20;
max_m = 10;
r_min = 0.01; r_max = 1;
% 计算时间延迟
tau = mutual_information(x, max_delay);
disp(['时间延迟 τ = ', num2str(tau)]);
% 计算嵌入维数
m = false_nearest_neighbors(x, max_m);
disp(['嵌入维数 m = ', num2str(m)]);
% 计算关联维数
D2 = grassberger_procaccia(x, m, r_min, r_max);
disp(['关联维数 D₂ = ', num2str(D2)]);
三、可视化与结果分析
% 相空间重构可视化
figure;
plot3(X(1,:), X(2,:), X(3,:), 'b.');
xlabel('X_1'); ylabel('X_2'); zlabel('X_3');
title('相空间重构(m=3, τ=5)');
% 关联积分双对数图
figure;
loglog(log_r, log(C), 'r-o');
hold on;
plot(log(log_r(11:end-10)), log(C(11:end-10)), 'k--');
xlabel('ln(r)'); ylabel('ln(C(r))');
title('关联积分曲线(D₂=' num2str(D2, '%.2f') ')');
四、关键优化与注意事项
- 噪声处理:添加高斯噪声时需调整关联积分的半径范围(r_min需大于噪声标准差)。
- 计算效率:大规模数据可使用KD树加速最近邻搜索(MATLAB的
KDTreeSearcher)。
- 无标度区间:推荐使用模拟退火算法自动选择最佳半径范围。
五、扩展应用
- 故障诊断:通过关联维数变化检测机械系统异常。
- 生理信号分析:计算脑电信号的关联维数评估意识状态。
- 气候预测:结合延迟嵌入定理重构大气动力学相空间。
六、参考
- MATLAB工具箱: Chaos Toolbox:提供
embed_seq(嵌入维计算)、determinism(关联维)等函数。 TISEAN库:支持C-C方法、假近邻法等。
- 代码 含有各种混沌时间序列参数(时间延迟,嵌入维数,关联维等)计算程序 www.youwenfan.com/contentcnn/82714.html
- Python实现:
nolds库:nolds.sampen(样本熵)、nolds.corr_dim(关联维)。