16非平稳时间序列突变检测的启发式分割算法(BG算法)MATLAB源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

非平稳时间序列突变检测的启发式分割算法(BG算法)MATLAB

源代码

本源码的算法主要参考了下面参考文献:封国林,龚志强,董文杰等.基于启发式分割算法的气候突变检测研究[J].物理学报,2005,54(11):5494-5499。

function [FLAG,AllT,AllTmax,AllPTmax]=BGA(X,P0,L0)

%% 非平稳时间序列突变检测的启发式分割算法

%% 输入参数列表

% X 待检测的数据,列向量存储

% P0 显著性水平门限值,低于此值的不再分割

% L0 最小分割尺度,子段长度小于此值的不再分割

%% 输出参数列表

% FLAG 分割点标记,列向量存储,长度与X相同

% AllT 与分割点对应的全部t检验序列,其首位数字为起点坐标

% AllTmax 与分割点对应的全部t检验序列的最大值

% AllPTmax 与分割点对应的全部t检验序列对应的统计显著性

%% 第一步:变量初始化

N=length(X);

FLAG=zeros(N,1);

FLAG(1)=0.1;

FLAG(N)=0.1;

AllT=cell(0,0);

AllTmax=cell(0,0);

AllPTmax=cell(0,0);

%% 第二步:产生第一个突变点,并对序列进行分割

[T,Tmax,p,PTmax]=Tseries(X);

T=[1;T];

if PTmax

flag=FLAG;

flag(1)=0;

flag(N)=0;

pos3=flag(pos2);

return

end

%记录输出数据

FLAG(p)=1;

AllT=[AllT;T];

AllTmax=[AllTmax;Tmax];

AllPTmax=[AllPTmax;PTmax];

%以下为两个控制计数器

counter=2;%下一个突变点的序号

TC=0;%临时计数器

%%

while 1%设置死循环

%% 第三步:对每个段进行突变检测,能分割则分割,直到不能分割为止pos=find(FLAG>0);

M=length(pos)-1;%当前子段数目

for m=1:M

s=pos(m);

t=pos(m+1);

L=length(SubX);

if L>=L0

[T,Tmax,p,PTmax]=Tseries(SubX);

T=[s;T];

if PTmax>=P0

TC=TC+1;

FLAG(s+p-1)=counter;

AllT=[AllT;T];

AllPTmax=[AllPTmax;PTmax];

counter=counter+1;

end

end

end

%% 第四步:返回输出数据

if TC==0

flag=FLAG;

flag(1)=0;

flag(N)=0;

pos3=flag(pos2);

FLAG=[pos2,pos3];

return

end

%%

TC=0;

%%

end

function [T,Tmax,p,PTmax]=Tseries(x)

%% 计算t检验统计序列的子函数

%% 参数列表

% x 时间序列,N×1列向量

% T t检验序列,N×1列向量

% Tmax t检验序列的最大值

% p t检验序列最大值对应的下标

% PTmax Tmax对应的统计显著性

%% 参数初始化

N=length(x);

T=zeros(N,1);

%% 以下是主循环,用于创建t检验序列

for i=3:(N-2)%最左边以及最右边的两个点没有对应的t检验值(或者说,其值初始化为0)x1=x(1:i);%序列左边部分

N1=length(x1);%左边序列的长度

x2=x(i:N);%序列右边部分

N2=length(x2);%右边序列的长度

mean_x2=mean(x2);%右边部分的均值

std_x2=std(x2);%右边部分的标准差

%下面是计算合并偏差的公式,中英文文献里的这个公式略有不同,此处以英文文献为准

SD=sqrt(1/N1+1/N2)*sqrt(((N1-1)*std_x1^2+(N2-1)*std_x2^2)/(N1+N2-2));

T(i)=abs((mean_x1-mean_x2)/SD);

end

%% 计算其它三个输出参数

Tmax=max(T);%t检验序列的最大值

pos=find(T==Tmax);

Eta=4.19*log(N)-11.54;%计算PTmax用的参数

Delta=0.40;%计算PTmax用的参数

v=N-2;%计算PTmax用的参数

c=v/(v+Tmax^2);%不完全B函数的下标

PTmax=(1-betainc(c,Delta*Eta,Delta));%调用不完全beta函数

源代码运行结果展示

相关文档
最新文档