In [ ]:
from __future__ import division
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
from pybasicbayes.distributions import Regression
from pybasicbayes.util.text import progprint_xrange
from autoregressive.distributions import AutoRegression
import pyximport
pyximport.install()
import os
os.chdir('../pylds')
from models import LDS, DefaultLDS
from distributions import Regression_diag, AutoRegression_input
from obs_scheme import ObservationScheme
from user_util import gen_pars, rand_rotation_matrix, init_LDS_model, collect_LDS_stats
#npr.seed(0)
save_file = '/home/mackelab/Desktop/Projects/Stitching/results/LDS_save'
py3res = np.load(save_file + '.npz')
data = py3res['data']
T,p = data.shape
stateseq = py3res['stateseq']
n = stateseq.shape[1]
obs_scheme = py3res['obs_scheme'].reshape(1,)[0]
obs_scheme = ObservationScheme(p=p, T=T,
sub_pops=obs_scheme['sub_pops'],
obs_pops=obs_scheme['obs_pops'],
obs_time=obs_scheme['obs_time'])
m = len(py3res['likes'])-1
eps = py3res['eps']
pars_true = py3res['pars_true'].reshape(1,)[0] # some numpy (cross-version 3.x-2.x?)
tmp = {}
for i in range(len(pars_true.keys())):
tmp[str(pars_true.keys()[i])] = pars_true.values()[i]
pars_true = tmp
pars_init = py3res['pars_init'].reshape(1,)[0] # savez wierdness
tmp = {}
for i in range(len(pars_init.keys())):
tmp[str(pars_init.keys()[i])] = pars_init.values()[i]
pars_init = tmp
print('(T, p, n, m) = ', (T, p, n, m))
In [ ]:
def update(model):
model.EM_step()
return model.log_likelihood()
###################
# EM cycles #
###################
# get E-step results for init pars
model = init_LDS_model(pars_init, data, obs_scheme) # set to initialisation
model.E_step()
stats_init,_ = collect_LDS_stats(model)
# get EM-step results after one iteration
model.M_step()
model.E_step()
stats_first,pars_first = collect_LDS_stats(model)
# get EM-step results after m iterations
model = init_LDS_model(pars_init, data, obs_scheme) # reset to initialisation
print 'fitting'
likes = [update(model) for _ in progprint_xrange(m)]
stats_hat,pars_hat = collect_LDS_stats(model)
# get EM-step results from true parameters
model = init_LDS_model(pars_true, data, obs_scheme) # reset to true pars
model.E_step()
stats_true,_ = collect_LDS_stats(model)
model.M_step()
###################
# store results #
###################
from scipy.io import savemat # store results for comparison with Matlab code
from scipy.linalg import solve_discrete_lyapunov as dtlyap # solve discrete-time Lyapunov equation
save_file_m = {'x': model.states_list[0].stateseq,
'y': model.states_list[0].data,
'u' : [],
'll' : likes,
'T' : model.states_list[0].T,
'Trial': len(model.states_list),
'elapsedTime' : 0,
'ifUseB':False,
'ifUseA':True,
'epsilon':0,
'ifRDiagonal':False,
'covConvEps':0,
'truePars':pars_true,
'initPars':pars_init,
'firstPars':pars_first,
'estPars': pars_hat,
'stats_0': stats_init,
'stats_1': stats_first,
'stats_h': stats_hat,
'stats_true': stats_true,
'Pi':dtlyap(pars_true['A'], pars_true['Q']),
'Pi_h':dtlyap(pars_hat['A'], pars_hat['Q']),
'Pi_t':pars_true['A'].dot(dtlyap(pars_true['A'], pars_true['Q'])),
'Pi_t_h':pars_hat['A'].dot(dtlyap(pars_hat['A'], pars_hat['Q'])),
'obsScheme' : []}
savemat(save_file+'_mattjj',save_file_m) # does the actual saving
In [ ]:
In [ ]: