原来是小飞 发表于 2014-4-15 16:57

互信息法求时间延迟的问题

本人在论坛上搜到了一个互信息法求时延的代码,可是结果却与‘tau_max’的取值相同,即tau_max的取值就是最后的时延值,这明显是不对的。估计是代码出了问题,可能代码不全,请好心人帮忙看下代码能否补全或者传个完整的代码给我,谢了。代码如下:data=load('11yue(2880x1).txt');
tau_max=5;
n=128;
I_sq=zeros(tau_max,1);
N=length(data);%时间序列的长度
for tau=1:tau_max
    s=data(1:N-tau);q=data(tau+1:N);%把单变量时间序列扩充到二维相空间(s,q)上
    as=min(s);bq=min(q);%在重构的相图上取框,均匀划分成n*n个小格子
    delts=(max(s)-as)/n;deltq=(max(q)-bq)/n;
    N_sq=zeros(n);

    for ii=1:n         %计算位于格子(ii,jj)内的相点个数
      for jj=1:n
            for k=1:N-tau
                as_k=(s(k)-as)/delts; bq_k=(q(k)-bq)/deltq;
                if as_k>=ii-1&as_k<ii&bq_k>=jj-1&bq_k<jj                  
                     N_sq(ii,jj)=N_sq(ii,jj)+1;   
                end
            end
      end
    end
    Ntotal=sum(sum(N_sq));
    Ps=sum(N_sq)/Ntotal;   %计算位于一维s格子内的概率
    Pq=sum(N_sq')/Ntotal;%计算位于一维q格子内的概率
    Psq=N_sq/Ntotal;       %计算位于二维格子(ii,jj)内概率
   
    H_s=0; %计算s的熵
    H_q=0; %计算q的熵
    for i=1:n
      if Ps(i)~=0
            H_s=H_s-Ps(i)*log(Ps(i));
      elseif Pq(i)~=0
            H_q=H_q-Pq(i)*log(Pq(i));
      end
    end
   
    H_sq=0;%计算(s,q)的联合熵
    for i=1:n
      for j=1:n
            if Psq(i,j)~=0
                H_sq=H_sq-Psq(i,j)*log(Psq(i,j));
            end
      end
    end
               
    I_sq(tau)=H_s+H_q-H_sq;         %计算tau下的互信息函数
    clear s q;   %清空变量s和q
end


gghhjj 发表于 2014-4-16 10:46

尝试增大tau_max看看结果

原来是小飞 发表于 2014-4-16 10:51

gghhjj 发表于 2014-4-16 10:46
尝试增大tau_max看看结果

增大为40,100。结果还是和tau_max的值相同。

gghhjj 发表于 2014-4-18 08:40

原来是小飞 发表于 2014-4-16 10:51
增大为40,100。结果还是和tau_max的值相同。

程序上看应该问题不大,会不会是数据问题?你找个组简单的数据验证一下

原来是小飞 发表于 2014-4-18 09:06

gghhjj 发表于 2014-4-18 08:40
程序上看应该问题不大,会不会是数据问题?你找个组简单的数据验证一下

恩,我试下

原来是小飞 发表于 2014-4-18 09:34

gghhjj 发表于 2014-4-18 08:40
程序上看应该问题不大,会不会是数据问题?你找个组简单的数据验证一下

又换了2组数据试试,结果还是一样,应该是程序的问题吧

gghhjj 发表于 2014-5-16 16:50

原来是小飞 发表于 2014-4-18 09:34
又换了2组数据试试,结果还是一样,应该是程序的问题吧

是简单系统的吗?比如 Lorenz 系统的仿真结果一类的?

leozhangxu 发表于 2014-10-26 20:25

楼主,找到毛病所在了吗?求指导啊

wystar 发表于 2014-11-14 16:00

楼主,找到毛病所在了吗?求指导啊http://forum.vibunion.com/forum.php?mod=viewthread&tid=129845&page=1#pid749235看这个帖子,gghhjj分享的程序可以用

窃以为洒脱 发表于 2015-5-30 20:50

wystar 发表于 2014-11-14 16:00
http://forum.vibunion.com/forum.php?mod=viewthread&tid=129845&page=1#pid749235看这个帖子,gghhjj分享 ...

你好,我也下载了gghhjj分享的程序,可是里面是带有dll文件的啊,这应该是混合编程产生的,要如何调用?多谢

窃以为洒脱 发表于 2015-5-30 21:26

楼主你没发现你这个程序内有一个明显的比较搞笑的错误吗?你的输出变量 tau 在tau=1:tau_max中作了一次循环变量,循环结束后肯定就等于tau_max了啊!最关键的是你后面没有对tau进行操作,那结果肯定等于tau_max了。建议程序最后加一个plot(I_sq),从输出的图像上找第一个极小值,对应的tau就是我们需要的值。另外,经试验,程序主体部分可以完美运行,运行结果应该是正确的,多谢楼主分享出来!!!!

wystar 发表于 2015-6-23 11:02


你好,我也下载了gghhjj分享的程序,可是里面是带有dll文件的啊,这应该是混合编程产生的,要如何调用?多谢不好意思,回复的有点晚。你将自己的数据嵌入到主程序中调用就可以哦

zfff 发表于 2016-6-1 20:09

wystar 发表于 2015-6-23 11:02
不好意思,回复的有点晚。你将自己的数据嵌入到主程序中调用就可以哦

请问mutual.dll文件如何调用啊,嵌入数据也不行,提示mutual没有定义

sd 发表于 2016-6-2 09:20

窃以为洒脱 发表于 2015-5-30 21:26
楼主你没发现你这个程序内有一个明显的比较搞笑的错误吗?你的输出变量 tau 在tau=1:tau_max中作了一次循 ...

本人刚开始学习,请问,load的文件是什么形式的(数据形式),我只想简单的做一下试验,运行一下程序,谢谢指导
页: [1]
查看完整版本: 互信息法求时间延迟的问题