cqupenghao 发表于 2010-10-9 19:32

关联维数和盒维数

最近研究混沌,据资料上讲,关联维数和盒维数都是分形维数的一种,但是书上没有介绍这两者之间的关系,我想问一下,这两者之间有什么联系????

Vickyvictoria 发表于 2010-10-14 21:28

应该是计盒维数吧
分形位数多种多样,其中计盒维数是最简单的,关联维数是最常用的
它们的区别主要在于角度的不同

计盒维数是从空间占据程度来描述布格局的尺度变化特征
关联维数是从个体空间关联的尺度变化角度来描述的

当然还有诸如豪斯多夫维数、信息维数等等

cqupenghao 发表于 2010-10-15 12:42

谢谢你的回答
其实吧,这个我也知道,但是我用不同的程序对相同的时间序列进行计算后,发现求出来的关联维数和盒维数的值差距很大,所以我就是想知道两者的联系,差距那么大说明了什么问题?

DDevil 发表于 2012-9-6 10:25

楼主,请教个问题,我现在也在用盒维数与关联维计算数据的维数,可否赐教下如何计算啊?

犟牛 发表于 2012-9-6 10:43

%根据计盒维数原理编写了求一维曲线分形维数的matlab程序

function D=FractalDim(y,cellmax)

%求输入一维信号的计盒分形维数
%y是一维信号
%cellmax:方格子的最大边长,可以取2的偶数次幂次(1,2,4,8...),取大于数据长度的偶数
%D是y的计盒维数(一般情况下D>=1),D=lim(log(N(e))/log(k/e)),

y=;
cellmax=8;

if cellmax<length(y)
error('cellmax must be larger than input signal!')
end
L=length(y);%输入样点的个数
y_min=min(y);

%移位操作,将y_min移到坐标0点
y_shift=y-y_min;
%重采样,使总点数等于cellmax+1
x_ord=./(L-1);
xx_ord=./(cellmax);
y_interp=interp1(x_ord,y_shift,xx_ord);
%按比例缩放y,使最大值为2^^c
ys_max=max(y_interp);
factory=cellmax/ys_max;
yy=abs(y_interp*factory);

t=log2(cellmax)+1;%叠代次数
for e=1:t
Ne=0;%累积覆盖信号的格子的总数
cellsize=2^(e-1);%每次的格子大小
NumSeg(e)=cellmax/cellsize;%横轴划分成的段数

for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e)
begin=cellsize*(j-1)+1;%每一段的起始
tail=cellsize*j+1;
seg=;%段坐标
yy_max=max(yy(seg));
yy_min=min(yy(seg));
up=ceil(yy_max/cellsize);
down=floor(yy_min/cellsize);
Ns=up-down;% 本段曲线占有的格子数
Ne=Ne+Ns;%累加每一段覆盖曲线的格子数

end

N(e)=Ne;%记录每e下的N(e)
end

%对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是D

r=-diff(log2(N));%去掉r超过2和小于1的野点数据
id=find(r<=2&r>=1);%保留的数据点
Ne=N(id);
e=NumSeg(id);
plot(log2(e),log2(Ne),'+');
lsline;
P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距
D=P(1);

犟牛 发表于 2012-9-6 10:45

function =glws(x,m,t)
%函数名为关联维数的首字母,用于单串序列,多串到glsw;
%x为要分析的数据;
%x=xlsread('d:\matworks\dbin.xls');
=size(x);
n=m1;
=size(m);
p=zeros(mm,2); %存放拟合系数的矩阵;
rr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数;
cr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数;
%prr=zeros(20,mm);%rr是相当于筛子的那个距离,存放的是对数;
%pcr=zeros(20,mm);%cr是小于筛子距离的距离个数,存放的是对数;
scope=zeros(19,1);
msr=zeros(19,1);
   for k=1:mm
      tt=0;
      nm=n-(m(k)-1)*t;%Nm为列数;
      nr=(nm-1)*nm/2;%Nr为距离的总个数;
      juli=zeros(nr,1);%全部距离搞成一列的长矩阵;
      r=zeros(nm,nm);%各列之间距离矩阵;
      y=zeros(m(k),nm);%重构相矩阵的值yij;
   for j=1:nm
         for i=1:m(k)
            y(i,j)=x(j+(i-1)*t);
         end
   end
   for i=1:nm-1
         for j=i+1:nm
             for kk=1:m(k)
               r(i,j)=r(i,j)+(y(kk,j)-y(kk,i))^2;
             end
             r(i,j)=sqrt(r(i,j));
             tt=tt+1;
             juli(tt)=r(i,j);
         end
   end
%进行r和cr个数的计算;
    rmin=min(juli);
    rmax=max(juli);
    for i=1:20%每次把距离间隔分20分来慢慢加;
       rr(i,k)=(rmax-rmin)*(i+1)/21; %距离取法值得研究一下;
       for j=1:nr
         if juli(j)<=rr(i,k)
                cr(i,k)=cr(i,k)+1;
         end
       end
       rr(i,k)=log(rr(i,k));
       cr(i,k)=log(cr(i,k)/nr);
   end
    %rr=rr';
    tt=0;
    for i=1:19
      scope(i)=(cr(i+1,k)-cr(i,k))/(rr(i+1,k)-rr(i,k));%每点的斜率;
      tt=tt+scope(i);
      plot(i,scope(i),'-bd'),hold on;
    end
    tt=tt/19;%各相邻点间斜率平均值;
    tshold=(max(scope)-min(scope))/2;%threshold,阈值;
    for i=1:19
          msr(i)=abs(scope(i)-tt);%各斜率与平均值的均方根,mean square root;
    end
    tt=0;
    for i=2:18
          if (msr(i-1)>tshold & msr(i+1)>tshold)|(msr(i-1)<0.001 & msr(i+1)<0.001)
            continue
          else
            tt=tt+1;
            prr(tt)=rr(i,k);%符合条件的;
            pcr(tt)=cr(i,k);
          end
    end
   p(k,1:2)=polyfit(prr,pcr,1);%线性拟合,p为两个数,p1为斜率,p2为截距;
end

DDevil 发表于 2012-9-6 11:01

哈工犟牛,3Q了哦

DDevil 发表于 2012-9-7 21:56

回复 6 # 犟牛 的帖子

你好!
多谢你发的程序代码,有个问题想请教下,我这边的数据是b34-100.038138.mat这类信号(有一批),该怎么用这段程序对其进行计算啊?

犟牛 发表于 2012-9-11 15:29

load b34-100.038138.mat
然后看你的数据结构

DDevil 发表于 2012-9-11 17:08

回复 9 # 犟牛 的帖子

你好!
我用上面计盒分形维数代码试了下,出现了以下问题:
??? Error using ==> box
Too many output arguments.
是怎么回事啊?
我把程序加了几句,如下:
%根据计盒维数原理编写了求一维曲线分形维数的matlab程序

function D=FractalDim(y,cellmax)
%%%
clear;
clc;
y=load('b34-100.038138.mat');
%y=b34-100.038138.id;
%求输入一维信号的计盒分形维数

麻烦给点意见。

DDevil 发表于 2012-9-11 17:13

回复 9 # 犟牛 的帖子

用第二段代码算关联维数,出现了下面的问题:
??? Error: File: glws.m Line: 6 Column: 1
Function definitions are not permitted at the prompt or in scripts.

麻烦你看看,给点建议!

水面清圆 发表于 2012-11-29 22:22

学习了。

gghhjj 发表于 2012-12-14 05:37

DDevil 发表于 2012-9-11 17:08 static/image/common/back.gif
回复 9 # 犟牛 的帖子

你好!


程序调用有问题,不知你是如何调用的

gghhjj 发表于 2012-12-14 05:38

DDevil 发表于 2012-9-11 17:13 static/image/common/back.gif
回复 9 # 犟牛 的帖子

用第二段代码算关联维数,出现了下面的问题:


还是程序使用有问题,贴你的调用代码吧

DDevil 发表于 2012-12-24 13:49

gghhjj 发表于 2012-12-14 05:38 static/image/common/back.gif
还是程序使用有问题,贴你的调用代码吧

%根据计盒维数原理编写了求一维曲线分形维数的matlab程序

function D=FractalDim(y,cellmax)
%%%
clear;
clc;
%load TEST0044F1F_1_50_3667476.mat;
%y=TEST0044F1F_1_50_3667476.mat;
y=load('TEST0044F1F_1_50_3667476.mat');
%求输入一维信号的计盒分形维数
%y是一维信号
%cellmax:方格子的最大边长,可以取2的偶数次幂次(1,2,4,8...),取大于数据长度的偶数
%D是y的计盒维数(一般情况下D>=1),D=lim(log(N(e))/log(k/e)),

cellmax=8;

if cellmax<length(y)
error('cellmax must be larger than input signal!')
end
L=length(y);%输入样点的个数
y_min=min(y);

%移位操作,将y_min移到坐标0点
y_shift=y-y_min;
%重采样,使总点数等于cellmax+1
x_ord=./(L-1);
xx_ord=./(cellmax);
y_interp=interp1(x_ord,y_shift,xx_ord);
%按比例缩放y,使最大值为2^^c
ys_max=max(y_interp);
factory=cellmax/ys_max;
yy=abs(y_interp*factory);

t=log2(cellmax)+1;%叠代次数
for e=1:t
Ne=0;%累积覆盖信号的格子的总数
cellsize=2^(e-1);%每次的格子大小
NumSeg(e)=cellmax/cellsize;%横轴划分成的段数

for j=1:NumSeg(e) %由横轴第一个段起通过计算纵轴跨越的格子数累积N(e)
begin=cellsize*(j-1)+1;%每一段的起始
tail=cellsize*j+1;
seg=;%段坐标
yy_max=max(yy(seg));
yy_min=min(yy(seg));
up=ceil(yy_max/cellsize);
down=floor(yy_min/cellsize);
Ns=up-down;% 本段曲线占有的格子数
Ne=Ne+Ns;%累加每一段覆盖曲线的格子数

end

N(e)=Ne;%记录每e下的N(e)
end

%对log(N(e))和log(k/e)进行最小二乘的一次曲线拟合,斜率就是D

r=-diff(log2(N));%去掉r超过2和小于1的野点数据
id=find(r<=2&r>=1);%保留的数据点
Ne=N(id);
e=NumSeg(id);
plot(log2(e),log2(Ne),'+');
lsline;
P=polyfit(log2(e),log2(Ne),1);%一次曲线拟合返回斜率和截距
D=P(1);
页: [1] 2
查看完整版本: 关联维数和盒维数