Odhad sm si s dynamickým ukazovátkem a statickými komponentami 1 dvourozm rný výstup, bez ízení simulovaná data inicializace odhadu - za²um né parametry ze simulace standardní odhad / odhad s pevnými kovariancemi ²um komponent model ukazovátka f (c t c t 1, α) = α ct c t 1 Simulují se data ze sm si normálních, dvourozm rných regresních komponent a statického ukazovátka y t = θ i + e t, i = 1, 2,, n c kde y t je výstup v ase t, [ ] (θ1 ) θ i = i jsou parametry statických komponent s dvourozm rným výstupem, (θ 2 ) i n c je po et komponent. P edpoklady: e N (0, r), r konstantní. Sci zna ení: y - yt, θ - th, r - cv. Úloha: Simulace, odhad a predikce s dynamickým modelem sm si statických komponent - základní kongurace pro odhad sm si. Poznámky 1. Dynamické ukazovátko umoº uje predikci aktivní komponenty, protoºe dává do souvislosti po sob jdoucí aktivity komponent. 2. Inicializace odhadu sm si komponent je velice d leºitá. Pokud nejsou po áte ní centra komponent dostate n blízko dat, jsou váhy w t prakticky nulové (hodnota distribuce normálního rozd lení velmi rychle klesá se vzdáleností od st ední hodnoty) a odhad je velmi nep esný nebo dokonce selhává. Proto je vºdy t eba po áte nímu nastavení center (st edních hodnot) a ²í ce (kovarian ní matici) odhadovaných komponent v novat pat i nou pé i. Zde pro inicializaci vyuºijeme znalost skute ných parametr ze simulace. Jako po áte ní hodnoty parametr v odhadu pouºijeme skute né hodnoty parametr, a ty více nebo mén za²umíme. Tento trik v inicializaci, který je z praktického hlediska nefér pouºijeme proto, ºe nám zde jde spí²e o testování odhadu sm si (p i kterém zkou²íme, co tento odhad dokáºe), neº o skute ný odhad, nap. pro reálná data, kde samoz ejm skute né parametry neznáme. 1 Tato úloha je paralelní s úlohou T71MixStat a li²í se jen modelem ukazovátka, který je zde dynamický. 1
Doporu ené experimenty (Jsou stejné, jako pro statickou sm s. Zde je uvedeme jen zkrácen. Podrobn ji jsou v T71Mix1Stat) 1. Zkuste nastavit své vlastní soustavy a ov te procento správných klasikací. 2. Zkuste nastavit parametry ru n a sledujte jejich vliv na odhad (zejména jeho po áte ní fázi). 3. Jedna z velice úsp ²ných moºností jak p im t odhad, aby se na za átku chytil, je bu neodhadovat rozptyly komponent a ponechat je po áte ní malé nebo s jejich odhadem za ít aº v pr b hu odhadování. Odhad/neodhad rozptyl je moºno zvolit pomocí parametru IstCov. Zpoºd né odhadování je t eba doprogramovat: if t>100,, Zkuste odhadovat r znými zp soby a porovnejte výsledky. 4. (nové) Dynamické ukazovátko znamená, ºe výb r aktivní komponenty závisí na minulé aktivní komponent. Tedy v p epínání aktivních komponent je ur itý ád, daný modelem ukazovátka (kategorický dynamický model). P edvolený model ukazovátka je dán rovnom rnou tabulkou Sim.Cp.th. Zvolte sv j vlastní model ukazovátka (nap. deterministický) a sledujte efekt, který do odhadu takové sm si p iná²í. Program Popis programu 1. Simulace hodnot ukazovátka a podle toho generování dat z p íslu²né komponenty. 2. Odhad se provádí podle standardních vzorc : (a) výpo et vah W t a w t pro zm ený výstup y t. (b) P epo et statistik komponent a ukazovátka. (c) Konstrukce bodových odhad parametr. Tady je moºnost volby: i. pr b ºné odhadování kovarian ních matic komponent, ii. pouºití po áte ních kovarian ních matic bez pr b ºného p epo tu. Tato varianta je bezpe n j²í. P i pr b ºném odhadu se m ºe stát, ºe jedna komponenta p ekryje ostatní a výsledek je daný práv jen touto komponentou. Moºná je také varianta, kdy v prvé ásti odhadování ponecháme kovarian ní matice pevné, a v dal²í ásti je jiº odhadujeme. 3. Jako výsledek se ukazují hodnoty odhadovaného ukazovátka ve srovnání se simulovaným. Tím úloha získává charakter klasikace. Kód programu 2
// P71Mix2Dyn.sce // Mixture estimation - static components and dynamic pointer model // - simulated two-dimensional data // - initialization by parameters from simulation + noise // - dynamic components [u,t,n]=file(); // find working directory chdir(dirname(n(2))); // set working directory clear("u","t","n") // clear auxiliary data exec("scintro.sce",-1),mode(0) // intro to sesion rand('seed',0) nd=100; nc=3; I_estCov=0; // number of data // number of componentd // estimation of noise covariances? 0 1 no yes // simulated reg.coef. Sim.nc=nc; Sim.Cy(1).th=[0.9 -.5]'; Sim.Cy(2).th=[0.4 0.6]'; Sim.Cy(3).th=[-.7 -.5]'; // noise covariances r=.1; // amplitude of noise covariances Sim.Cy(1).sd=r*[1 0;0,1]; Sim.Cy(2).sd=r*[1 0;0,1]; Sim.Cy(3).sd=r*[1 0;0,1]; // simulated noise covariances Sim.Cp.th=fnorm(rand(nc,nc,'u')+.1,2); Sim.ct(1)=1; // initial poiner // initial parameters a=.5; // std of scattering init.params from simulated ones for j=1:nc // from those used in simulation [mr,mc]=size(sim.cy(j).th); Ps=[Sim.Cy(j).th;1]+[a*rand(mr,mc,'n');0]; // initial parameters Est.Cy(j).V=Ps*Ps'; // statistics Est.Cy(j).th=Sim.Cy(j).th+a*rand(2,1,'n'); // pt.est. of reg.coef Est.Cy(j).sd=.1*eye(2,2); // standard deviation Est.ka=ones(1,nc); // counter Est.Cp.V=.1*ones(nc,nc); // pointer statistics Est.Cp.th=fnorm(rand(nc,nc,'u')+.1); // pointer parameter w=fnorm(ones(1,nc)); // weights // SIMULATION ========================================================== for t=2:nd i=sim.ct(t-1); // last active component Sim.ct(t)=sum(rand(1,1,'u')>cumsum(Sim.Cp.th(i,:)))+1; // pointer j=sim.ct(t); // active component 3
y=sim.cy(j).th+sim.cy(j).sd*rand(2,1,'norm'); Sim.yt(:,t)=y; // output // stor // ESTIMATION ========================================================== printf(' ') for t=2:nd if t/10==fix(t/10), printf('.'); for j=1:nc [xxx,g(j)]=gaussn(sim.yt(:,t),est.cy(j).th,est.cy(j).sd); // likelihood Lq=G-max(G); // rough normlization q=exp(lq); // exponent ww=(q*w)'.*est.cp.th; // matrix weights W=ww/sum(ww); // normalization - f(c(t),c(t-1) d(t)) w=sum(w,1); // marginalization - f(c(t) d(t)) wt(:,t)=w'; // stor // Update of statistic Est.ka=Est.ka+w; Est.Cp.V=Est.Cp.V+W; Ps=[Sim.yt(:,t)' 1]; for i=1:nc Est.Cy(i).V=Est.Cy(i).V+w(i)*Ps'*Ps; // counter // ptr.stat. update // exted reg.vec. // information matrix //nove rozdeleni informacni matice V Vyy=Est.Cy(i).V(1:2,1:2); // part Vyy - psi.psi' Vy=Est.Cy(i).V($,1:2); // part Vy - psi.y V1=Est.Cy(i).V($,$); // part V1 - y.y Est.Cy(i).th=inv(V1+1e-8*eye(V1))*Vy; // pt.est. - reg.coef. Est.Cy(i).tht(:,t)=Est.Cy(i).th(:); // pt.est. - covar. if I_estCov~=0 // pt.est. of noise covariance - used or not Est.Cy(i).cv=(Vyy-Vy'*inv(V1+1e-8*eye(V1))*Vy)/Est.ka(i); Est.Cp.th=fnorm(Est.Cp.V,2); // pt.est. of pointer parameter [ss,est.ct(1,t)]=max(w); // store pointer values // Results disp(sim.cp.th,'pt.pars_sim') disp(est.cp.th,'pt.pars_est') s=2:nd; wr=sum(sim.ct(s)~=est.ct(s)'); printf('\n Wrong classifications %d from %d\n',wr,length(s)) 4
set(scf(1),'position',[50 50 400 400]) plot(s,sim.ct(s),'bo',s,est.ct(s),'rx') title 'Pointer values and their predictions' set(scf(2),'position',[550 50 400 600]) for i=1:nc subplot(nc,1,i) plot(est.cy(i).tht') title('evolution of parameter estimates '+string(i)) 5