|
14 | 14 | %
|
15 | 15 | % Authors: Junfeng Wen (University of Alberta)
|
16 | 16 | % Martha White (Indiana University)
|
17 |
| -% Released: March 2015 |
| 17 | +% Last Update: Nov 2015 |
18 | 18 |
|
19 | 19 | if nargin < 1
|
20 | 20 | error('rarma requires at least data matrix X = [X1, ..., XT]');
|
|
46 | 46 | opts = RarmaUtilities.getOptions(opts, DEFAULTS);
|
47 | 47 | end
|
48 | 48 |
|
| 49 | +% Validity check |
| 50 | +if opts.madim < 0 || opts.ardim < 0 |
| 51 | + error('Incorrect parameters'); |
| 52 | +end |
| 53 | + |
49 | 54 | % Solve for RARMA, AR or MA dependning on madim and ardim choices
|
50 | 55 | ar_solver = @solve_rarma;
|
51 | 56 | if opts.madim < 1
|
|
64 | 69 | % Initialize variables for learning
|
65 | 70 | [xdim, numsamples] = size(X);
|
66 | 71 | sizeA = [xdim, xdim*opts.ardim];
|
67 |
| -Ainit = initAParams(sizeA); |
68 | 72 | sizeZ = [xdim*opts.madim, numsamples];
|
| 73 | +if opts.ardim > 0 |
| 74 | + Ainit = initAParams(); |
| 75 | +end |
| 76 | +if opts.madim > 0 |
| 77 | + Zinit = zeros(sizeZ); |
| 78 | +end |
69 | 79 |
|
70 | 80 | % START the outer optimization; save any learned variables in model along the way
|
71 | 81 | model = [];
|
|
90 | 100 | % Note: the code is currently not well-designed to do long-horizon prediction
|
91 | 101 | % with only a moving average models, since future moving average
|
92 | 102 | % components are not imputed; should work, however, for 1-step prediction
|
93 |
| - [Z, obj, iter, msg] = opts.optimizer(@(Zvec)(objZ(Zvec, zeros(sizeA))), zeros(sizeZ)); |
| 103 | + [Z, obj, iter, msg] = opts.optimizer(@(Zvec)(objZ(Zvec, zeros(sizeA))), Zinit(:)); |
94 | 104 | model.Z = reshape(Z, sizeZ);
|
95 | 105 | model.A = zeros(sizeA);
|
96 | 106 | if opts.recover == 1
|
97 | 107 | [model.B, model.Epsilon] = recoverModels(Z);
|
98 |
| - end |
99 |
| - model.predict = @(Xstart, horizon, ... |
100 |
| - opts)(RarmaFcns.iterate_predict(Xstart, [], model, horizon, opts)); |
| 108 | + end |
| 109 | + % Cannot really 'predict' without autoregressive component |
| 110 | + model.predict = @(Xstart, horizon, opts)... |
| 111 | + (RarmaFcns.iterate_predict(Xstart, [], model, horizon, opts)); |
101 | 112 | end
|
102 | 113 |
|
103 | 114 |
|
104 | 115 | function [model,obj] = solve_rarma()
|
105 | 116 | %% SOLVE_RARMA
|
106 | 117 | % Solve for A first (with Z = 0), then iterate between Z and A
|
107 |
| - Z = zeros(sizeZ); |
108 |
| - [A, obj, iter, msg] =opts.optimizer(@(Avec)(objA(Avec, X, Z)), Ainit(:)); |
| 118 | + [A, obj, iter, msg] = opts.optimizer(@(Avec)(objA(Avec, X, Zinit)), Ainit(:)); |
109 | 119 | A = reshape(A, sizeA);
|
110 |
| - [Z, prev_obj] = iterateZ(Z,A,opts.init_stepsize); |
| 120 | + [Z, prev_obj] = iterateZ(Zinit, A, opts.init_stepsize); |
111 | 121 |
|
112 | 122 | for i = 1:opts.maxiter
|
113 | 123 | % Do A first since it returns the incorrect obj
|
114 |
| - A = iterateA(A,Z,opts.init_stepsize/i); % adaptive stepsize |
115 |
| - [Z, obj] = iterateZ(Z,A,opts.init_stepsize/i); |
| 124 | + A = iterateA(A, Z, opts.init_stepsize/i); % adaptive stepsize |
| 125 | + [Z, obj] = iterateZ(Z, A, opts.init_stepsize/i); |
116 | 126 |
|
117 | 127 | if abs(prev_obj-obj) < opts.TOL % doing minimization
|
118 |
| - break; |
| 128 | + break; |
119 | 129 | end
|
120 | 130 | prev_obj = obj;
|
121 | 131 | end
|
|
189 | 199 | f = f + opts.reg_wgt_ma * f2;
|
190 | 200 | end
|
191 | 201 |
|
192 |
| -function Aparams = initAParams(sizeA) |
| 202 | +function Aparams = initAParams() |
193 | 203 | % INITAPARAMS
|
194 | 204 | % Could initialize in many ways; for speed, we choose
|
195 | 205 | % a regression between X = AXhist
|
|
0 commit comments