yufeiqun2008 发表于 2008-1-2 09:09

关于吕金虎CC算法和最大Lyapunov指数计算的一些问题的说明

这两天一直在编这两个程序,最大的感受是: 原来,很多时候,我们离结果仅半步之遥!

CC算法:

1原始数据量3000,tmax竟能达到200的迷惑

开始很纳闷,3000的数据量当t循环到200时每组数据才长度才15,在计算关联积分时,在嵌入维数m=5,时间延迟200时怎么重构相空间,反复试算了好多次,都出错退出循环,首先怀疑书上的结果有误,找了英文原文书上跟原文意思一样,没错,经过近两天的思索,终于开窍了,原来每次取定t时,将时间序列分成t个子序列,计算子序列的关联积分进行相空间重构时,其实该子序列每个数据之间已经经过t的延迟了,所以重构时
就不能在进行时间延迟。

2看了论坛上的一些程序,发现用的循环太多,不知道已经发布的程序进行3000数据的CC计算时间花费多大
我感觉自己的程序比帖子的程序要优,用我的机子大概费时1小时左右,网上有帖子说,仅花两分钟,我觉得肯定不可能。编程时有些循环应该尽量避免,这也是我们选择Matlab的初衷(方便的矩阵操作)

最大Lyapunov指数计算的最小数据量法

自己编了程序,我的确感觉程序是按书上步骤做的,但结果就是不对!在论坛上搜索了一些帖子,根据自己的体会,我又对自己的程序做了如下尝试:

1 开始时,我的范数用的都是无穷范数,虽然有文献给出的结果显示,范数之间的差别对结果影响不大,但因为要计算的是最大Lyapunov指数,我感觉在计算最邻近点时应采用2范数,而最后计算距离演化时应采用无穷范数(凸显指数最大),(因为我看的是吕金虎的超星版本的书,里边符号很模糊,开始还以为印刷有误,但书上应该是比较合理的)


2 跟大家一样,最后拟合直线时,图像很糟糕,我近乎崩溃了,我是严格按照书上的数据产生方法做的,但却不能给出图4.7-4.9,我开始还是怀疑书有错(现在写书的作者严谨度真的不敢恭维,尤其**工业出版社的书,印刷滥价格死贵),如果连算例的结果都做不出,怎么算别的,最后发现,我的数据跟书上的不一样(大家碰见这种情况,如果算例里有给出时间序列的时域图也可以作类似的检查),但按照书上的办法,的确不能产生类似的4.6的图形,于是我加大了chen系统的仿真时间 0~60秒 按照步长1e-4,总共产生了60万个点,才产生大体根书上差不多的图形,(书上才5万点),去除前面10万点,然后每隔100取一个数得到5千点,用自己的程序运行,结果几乎跟书上图4.7-4.9一样,我很高兴,当时其实已晚上1点了。

有的时候真的离结果非常近了,但可惜的是多数人放弃了...

JulianChin 发表于 2008-1-2 10:28

cc算法那个不能再详细说说?
我感觉自相关算延迟太不准了,计算维度cc也比GP好一些,但cc经常出现重构函数失效的情况,我有点要放弃了

yufeiqun2008 发表于 2008-1-2 11:11

回复 #2 JulianChin 的帖子

在嵌入维数m,时间延迟t情况下,序列相空间重构时,可以采用以下几行代码,生成的每一个列向量为相空间中的一点:
N=length(x);
M=N-(m-1)*t;
xv=zeros(m,M);
for ii=1:m
    xv(ii,:)=x([((ii-1)*t+1):1:((ii-1)*t+M)]);
end
但在子序列相空间重构时,应该采用
xv(ii,:)=x([((ii-1)+1):1:((ii-1)+M)]);
因为子序列生成时是每隔t延迟取数,已经相当于原序列里经过延迟了
不知道我说清楚了没?你可以再仔细体会下

JulianChin 发表于 2008-1-2 15:41

回复 #3 yufeiqun2008 的帖子

我说怎么不对劲呢,谢谢你了,还有这个问题能不能给大家讲一下
http://forum.vibunion.com/forum/thread-57158-1-1.html

anqikeli 发表于 2008-1-2 19:57

回复 #1 yufeiqun2008 的帖子

yufeiqun2008:你所说CC算法的问题我也发现了,但你说的“重构时就不能在进行时间延迟”是什么意思啊?我没有理解
重构的时候不是有了嵌入维数m和延迟t才能做吗?
如果这个时候不进行延迟t,要怎么算?

yufeiqun2008 发表于 2008-1-2 20:56

回复 #5 anqikeli 的帖子

是" 重构时就不能再进行延迟t",你可以仔细看看回复2中的重构语句

因为子序列在生成时已经经过延迟t了

设原序列为xi,i=1~N,当m=2,t=3时 得到的t个子序列为

x1,x4,x7,x10,x13,x16,x19,x22,...
x2,x5,x8,x11,x14,x17,x20,x23,...
x3,x6,x9,x12,x15,x18,x21,x24,...

对于原始序列如果重构时,情况如下
(x1,x4),(x2,x5),(x3,x6)

如果对第一个子序列采用同样的重构方式,情况如下(这是不对的)
(x1,x13),(x4,x16),(x7,x19),...

对第一个子序列的重构应该采用下面的方式
(x1,x4),(x4,x7),(x7,x10),(x10,x13),...
这正是回复2中语句之间的差别

anqikeli 发表于 2008-1-3 11:05

非常感谢,终于明白了
我还有个问题,我做的CC方法来验证Lorenz系统,得出的图和http://forum.vibunion.com/space/html/37/t-51237.html几乎一样
这样得到的延迟就不对了啊,不知道是怎么回事

yufeiqun2008 发表于 2008-1-3 11:11

回复 #7 anqikeli 的帖子

把你的Lorenz数据给我发一分看看,用我的程序跑一下,我觉得这个图有点古怪啊

yufeiqun2004@yahoo.com

anqikeli 发表于 2008-1-4 19:35

我给你发邮箱了,不过被退信了,不知道怎么回事
我把序列传上来吧,你帮我看一下,非常感谢!

anqikeli 发表于 2008-1-4 19:36

回复 #8 yufeiqun2008 的帖子

我的邮箱是153201909@qq.com

yufeiqun2008 发表于 2008-1-4 22:24

回复 #10 anqikeli 的帖子

经过我的程序运行历时1小时20分得到如下结果:

[ 本帖最后由 yufeiqun2008 于 2008-1-4 22:28 编辑 ]

yufeiqun2008 发表于 2008-1-4 22:35

回复 #11 yufeiqun2008 的帖子

从Smt和dS_t可以看出t=10处存在一个局部最小值点,此即延迟时间

而S_cor最小点在t=184处,此处值为0.0049

t=193处,S_cor=0.0082;
t=177处S_cor=0.0078;
t=146,处S_cor=0.0114;

基本上这几个点的值都很接近零点,按照书上方法,以及CC算法最初论文,不好判断延迟窗口,建议采取与别的方法结合的方法
我的邮箱yufeiqun2004@yahoo.com.cn

[ 本帖最后由 yufeiqun2008 于 2008-1-4 22:47 编辑 ]

anqikeli 发表于 2008-1-5 13:44

回复 #12 yufeiqun2008 的帖子

子序列相空间重构的时候,M=N-(m-1),好像t一直应该取1,我修改了一下,得出的图和你的差不多,但延迟和嵌入维数还是不知道怎么确定,难道CC算法确定不了延迟时间和嵌入维数吗?必须再找别的方法?
我在一篇文章里找到的说法是:如果dS_t的局部最小值点为t1,S_cor的为t2,那么m=t2/t1+1,不过忘记在哪看的了

yufeiqun2008 发表于 2008-1-5 15:39

回复 #13 anqikeli 的帖子

就我的理解,延迟时间需要结合S_m_t图以及dS_t图,寻找dS_t图第一个极小值点,该极小值点对应t就是时间延迟

而嵌入维数则是通过S_cor的最小值判断的,计算方式确实采用你所介绍的公式,但做了几个例子,效果不是很好

zhenglifeng 发表于 2008-3-20 15:18

回复 #8 yufeiqun2008 的帖子

yufeiqun2008的延迟时间的图画的挺好,能不能把程序发上来共享一下,谢谢
页: [1] 2 3 4
查看完整版本: 关于吕金虎CC算法和最大Lyapunov指数计算的一些问题的说明