相空间重构维度m的选择:Cao法(matlab实现)

使用Cao法选择维度m,首先需要确定延迟时间tau

function [m]=Cao(data,tau)
%data为原始数据
%tau为由自相关函数法求出的最佳延迟
%m为由Cao法求出的最佳维度

n=length(data);     %n为原始数据的长度
x=reshape(data,n,1);     %将原始数据data赋给x,转成列向量
m_max=10;       %给定维度最大值为m_max

%构造变量E
E=zeros(1,m_max-2+1);       %对应每个维度m,都有一个E

for m=2:1:m_max        %给定维度m最大值为m_max
    
    i_max=n-(m-1)*tau;      %i_max在m维空间中使用
    i_max_h=n-m*tau;        %i_max_h在m+1维空间中使用
   
    %构造向量子空间
    y=zeros(m,i_max);       %y用来存放m维重构向量,共i_max个
    y_h=zeros(m+1,i_max_h);     %y_h用来存放m+1维重构向量,共i_max_h个
    %构造m维空间
    for i=1:1:i_max
        y(:,i)=x(i:tau:i+(m-1)*tau);
    end
    %构造m+1维空间
    for i=1:1:i_max_h
        y_h(:,i)=x(i:tau:i+m*tau);
    end
    
    %计算各向量在最大模范数下的最邻近向量
    d=inf(1,i_max_h);       %d用于存放m维空间中各向量与最邻近向量的最大模范数,赋无限大,方便迭代
    d_h=inf(1,i_max_h);       %d_h用于存放m+1维空间中各向量与最邻近向量的最大模范数
    temp_d=0;     %temp_d用于暂存m维空间中最大模范数的值
    temp_d_h=0;      %temp_d_h用于暂存m+1维空间中最大模范数的值
    for i=1:1:i_max_h       %计算m维空间中每个向量与最邻近向量的最大模范数
        for j=1:1:i_max_h
            if j==i      %当j=i的时候,跳过本次计算
                continue
            else
                temp_d=norm(y(:,i)-y(:,j),inf);       %计算两个向量之间的最大模范数
                temp_d_h=norm(y_h(:,i)-y_h(:,j),inf);
                if temp_d<=d(1,i)
                    d(1,i)=temp_d;        %迭代找到每个向量与最邻近向量的最大模范数(所有最大模范数中最小的一个)
                end
                if temp_d_h<=d_h(1,i)
                    d_h(1,i)=temp_d_h;
                end
            end   
        end
    end

    %构造变量a
    a=zeros(1,i_max_h);       %a用来存放最大模范数的商
    d=d+eps;        %加一个小量,避免分母为零
    for i=1:1:i_max_h
        a(1,i)=d_h(1,i)/d(1,i);
    end
    
    E(1,m-1)=sum(a)/(n-m*tau);
    
end

%构造变量E1
E1=zeros(1,length(E)-1);
for i=1:1:(m_max-2)
    E1(i)=E(i+1)/E(i);
end

%根据E1的变换确定维度m,找到E1变化平缓时的m
for i=1:1:length(E1)
    if E1(i)>0.9 && E1(i)<1.1
        m=i+2;      %E中的元素位置对应维度m的大小+1
        break      
    end
end

figure(1);
plot(E);

end

你可能感兴趣的:(matlab,matlab,算法)