Documentation of segment


Global Index (short | long) | Local contents | Local Index (short | long)


Function Synopsis

[segm,V,thm,r2e]=segment(z,nn,r2,q,r1,M,th0,p0,lifelength,mu)

Help text

SEGMENT  Segments data and tracks abruptly changing systems.
   [segm,V] = SEGMENT(z,nn,r2,q)

   z : The output-input data vector z = [y u].
   nn: ARX or ARMAX model orders nn = [na nb nk] or nn = [na nb nc nk].
       See also ARX or ARMAX. The algorithm handles multi-input systems.

   r2: The equation error variance(Default:estimated, but better to guess)
   q : The probability that the system jumps at each sample.(Default 0.01)
   segm: The parameters of the segmented data. Row k is for sample # k
         The parameters are given in "alphabetical order".
   V: The loss function corresponding to segm
   The time-varying estimates th, and the estimated values of r2 are given
   by   [segm,V,th,r2] = SEGMENT(z,nn)

   Additional design variables are reached by
   [segm,V,th,r2]=SEGMENT(z,nn,r2,q,R1,M,th0,P0,ll,mu)
   R1: covariance matrix of the parameter jumps. (Default Identity matrix)
   M: Number of parallel models to be used (Default 5)
   th0:Initial parameter estimates (row vector)
   P0:Initial covariance matrix (Def 10*I). ll:Guaranteed lifelength of
   each model(Def 1). mu: Forgetting factor in r2-estimation (Def 0.97).
   Reference: P. Andersson Int J Control, Nov 1985.

Cross-Reference Information

This function calls This function is called by

Listing of function segment

function [segm,V,thm,r2e]=segment(z,nn,r2,q,r1,M,th0,p0,lifelength,mu)

%   L. Ljung 10-1-89
%   Copyright (c) 1986-98 by The MathWorks, Inc.
%   $Revision: 2.3 $  $Date: 1997/12/02 03:44:05 $
if nargin < 2
   disp('Usage: SEGM = SEGMENT(DATA,ORDERS)')
   disp(['       [SEGM,LOSS] = SEGMENT(DATA,ORDERS,NOISE_VAR,JUMP_PROB,',...
          'JUMP_SIZE,No_OF_MODELS,TH0,P0,LL,MU)'])
   return
end

[Ncap,nz]=size(z);
if Ncap<nz,disp('Warning: Have you entered the data as column vectors?'),end
nu=nz-1; nl=length(nn);
if nu==0,na=nn(1);nb=0;nc=0;nk=1;if nl>1,nc=nn(2);end
if nl>2,error('For a time series, nn = na or nn = [na nc]!'),end
else
  na=nn(1);nb=nn(2:nu+1);
  if nl==2*nu+1,nk=nn(nu+2:2*nu+1);nc=0;
  else if nl==2*nu+2,nc=nn(nu+2);nk=nn(nu+3:2*nu+2);
  else error('Incorrect number of orders specified: nn=[na nb nk] or nn=[na nb nc nk]'),end,end
end
d=na+sum(nb)+nc; % Number of parameters
if nargin<10, mu=[];end
if nargin<9, lifelength=[];end
if nargin<8 p0=[];end
if nargin<7,th0=[];end
if nargin<6 M=[];end
if nargin<5 r1=[];end
if nargin<4 q=[];end
if nargin<3 r2=[];end
if isempty(q),q=0.01;end
if isempty(r1),r1=eye(d);end
if isempty(M),M=5;end
if isempty(th0),th0=zeros(1,d);end
if isempty(p0),p0=10*eye(d);end
if isempty(lifelength),lifelength=1;end
if isempty(mu),mu=0.97;end
if isempty(r2),r2dum=1;R2v=ones(1,M);r2=r2dum;estr2=1;else estr2=0; end;
alfa=1/M*ones(1,M);%[1,zeros(1,M-1)];

thm=zeros(Ncap,d);
Phicap=zeros(Ncap,d);
th=th0'*ones(1,M);age=zeros(1,M);hist=zeros(Ncap,M);r2e=zeros(Ncap,1);
P=[]; for i=1:M,P=[P p0/r2];end;

if nc>0,nu=nu+1;nk(nu)=1;nb(nu)=nc;z(1:nc,nu+1)=zeros(nc,1);end
for i=max([na+1,max(nb+nk),nc+1]):Ncap
    phi=[-z(i-1:-1:i-na,1)];
    for ku=1:nu,
    phi=[phi;z(i-nk(ku):-1:i-nk(ku)-nb(ku)+1,1+ku)];
    end
        y=z(i,1);
        for j=1:M,
                Pj=P(:,d*(j-1)+1:d*(j-1)+d);
                den(j)=(r2+phi'*Pj*phi);

                epsi(j)=y-th(:,j)'*phi;

                alfabar(j)=alfa(j)/sqrt(den(j))*exp(-epsi(j)^2/(2*den(j)));
                th(:,j)=th(:,j)+1/den(j)*P(:,d*(j-1)+1:d*(j-1)+d)*phi*epsi(j);
        P(:,d*(j-1)+1:d*(j-1)+d)=Pj-(Pj*phi*phi'*Pj)/den(j);
        end;

        aind=find((age(1:M)>lifelength));if length(aind)>0,
        [dummy,jmin]=min(alfabar(aind));jmin=aind(jmin);
        [dummy,jmax]=max(alfabar);

        P(:,d*(jmin-1)+1:d*(jmin-1)+d)=P(:,d*(jmax-1)+1:d*(jmax-1)+d)+r1;
        th(:,jmin)=th(:,jmax);
        alfabar(jmin)=q*alfabar(jmax);age(jmin)=0;
        hist(:,jmin)=hist(:,jmax);hist(i,jmin)=1;
        else jmax=1;end
        age=age+ones(1,M);
        alfa=1/sum(alfabar)*alfabar;

        theta=th*alfa';
        epsilon=y-theta'*phi;if nc>0,z(i,nu+1)=epsilon;end
%
%       estimate R2
%
if estr2
        r2dum=r2dum+(1-mu)*(epsilon^2-r2dum);
        agedum=max(age,2)-1;
        R2v= R2v +max(ones(1,M)./agedum,(1-mu)).*(epsi.^2./den-R2v);
        Rr=R2v(find(age>d));
        if length(Rr)>0,r2=min(Rr);else r2=r2dum;end

end

%

%
        thm(i,:)=theta';r2e(i)=r2;Phicap(i,:)=phi';

%
end
hh=hist(:,jmax);
kk=find(hh==1);
kk=[1 kk' Ncap];
nn=length(kk);
for k=2:nn
segm(kk(k-1):kk(k),:)=ones(kk(k)-kk(k-1)+1,1)*thm(kk(k),:);
end
e=z(:,1)-sum(segm'.*Phicap')';
V=e'*e/Ncap;