使用平均互信息法确定时间间隔,虚假最近邻点法(FNN)确定嵌入维度,并重构,用matlab代码写
时间: 2024-02-19 20:57:40 浏览: 156
以下是使用平均互信息法确定时间间隔,虚假最近邻点法(FNN)确定嵌入维度,并重构的 Matlab 代码:
```matlab
% 加载数据
data = load('data.mat');
x = data.x;
% 确定时间间隔
tau = avg_mi(x);
% 确定嵌入维度
max_dim = 10;
eps = 0.1;
dim = false_nearest_neighbors(x, max_dim, tau, eps);
% 重构
m = dim;
n = length(x) - (m - 1) * tau;
X = zeros(n, m);
for i = 1:n
for j = 1:m
X(i, j) = x((i - 1) * tau + j);
end
end
```
其中,`avg_mi` 和 `false_nearest_neighbors` 分别是平均互信息法和虚假最近邻点法的实现函数。以下是完整的代码:
```matlab
function tau = avg_mi(x)
% 使用平均互信息法确定时间间隔
N = length(x);
max_tau = floor(N/10);
mi = zeros(max_tau, 1);
for tau = 1:max_tau
% 计算自身信息熵
p_x = histcounts(x, 'Normalization', 'pdf');
h_x = -sum(p_x .* log2(p_x));
% 计算时延 tau 的条件熵
y1 = x(1:end-tau);
y2 = x(tau+1:end);
p_xy = histcounts2(y1, y2, 'Normalization', 'pdf');
h_xy = -sum(sum(p_xy .* log2(p_xy)));
% 计算互信息
mi(tau) = h_x + h_y - h_xy;
end
tau = find(mi == max(mi), 1);
end
function dim = false_nearest_neighbors(x, max_dim, tau, eps)
% 使用虚假最近邻点法确定嵌入维度
N = length(x);
fnn = zeros(max_dim, 1);
for dim = 1:max_dim
% 重构
n = N - (dim - 1) * tau;
X = zeros(n, dim);
for i = 1:n
for j = 1:dim
X(i, j) = x((i - 1) * tau + j);
end
end
% 计算最近邻点
k = 4;
[idx, dist] = knnsearch(X, X, 'K', k+1);
dist = dist(:, 2:end);
% 计算虚假最近邻点数
r = eps * max(max(dist));
fnn(dim) = sum(any(dist > r, 2)) / n;
end
% 找到第一个虚假最近邻点数大于 10% 的嵌入维度
dim = find(fnn > 0.1, 1);
end
```
阅读全文