def sample_transition_within_subspace(model, state, hyperparams): """ MCMC iteration (Gibbs sampling) for transition matrix and covariance within the constrained subspace """ # Calculate sufficient statistics suffStats = smp.evaluate_transition_sufficient_statistics(state) # Convert to Givens factorisation form U, D = model.convert_to_givens_form() # Sample a new projected transition matrix and transition covariance rank = model.parameters['rank'][0] nu0 = rank Psi0 = rank * hyperparams['rPsi0'] nu, Psi, M, V = smp.hyperparam_update_degenerate_mniw_transition( suffStats, U, nu0, Psi0, hyperparams['M0'], hyperparams['V0']) D = la.inv(smp.sample_wishart(nu, la.inv(Psi))) FU = smp.sample_matrix_normal(M, D, V) # Project out Fold = model.parameters['F'] F = smp.project_degenerate_transition_matrix(Fold, FU, U) model.parameters['F'] = F # Convert back to eigen-decomposition form model.update_from_givens_form(U, D) return model
def sample_transition_within_subspace(model, state, hyperparams): """ MCMC iteration (Gibbs sampling) for transition matrix and covariance within the constrained subspace """ # Calculate sufficient statistics suffStats = smp.evaluate_transition_sufficient_statistics(state) # Convert to Givens factorisation form U,D = model.convert_to_givens_form() # Sample a new projected transition matrix and transition covariance rank = model.parameters['rank'][0] nu0 = rank Psi0 = rank*hyperparams['rPsi0'] nu,Psi,M,V = smp.hyperparam_update_degenerate_mniw_transition( suffStats, U, nu0, Psi0, hyperparams['M0'], hyperparams['V0']) D = la.inv(smp.sample_wishart(nu, la.inv(Psi))) FU = smp.sample_matrix_normal(M, D, V) # Project out Fold = model.parameters['F'] F = smp.project_degenerate_transition_matrix(Fold, FU, U) model.parameters['F'] = F # Convert back to eigen-decomposition form model.update_from_givens_form(U, D) return model
def sample_transition_within_subspace(model, state, hyperparams, pseudo_dof=None, pseudo_sd=None): """ MCMC iteration (Gibbs sampling) for transition matrix and covariance within the constrained subspace """ # Calculate sufficient statistics suffStats = smp.evaluate_transition_sufficient_statistics(state) # Convert to Givens factorisation form U,D = model.convert_to_givens_form() # Sampke a pseudo-observation to constrain the size of move if pseudo_dof is not None: extra_nu = pseudo_dof extra_Psi = smp.sample_wishart(pseudo_dof, D) else: extra_nu = 0 extra_Psi = 0 # Sample a new projected transition matrix and transition covariance rank = model.parameters['rank'][0] nu0 = rank + extra_nu Psi0 = rank*hyperparams['rPsi0'] + np.dot(U, np.dot(extra_Psi, U.T)) nu,Psi,M,V = smp.hyperparam_update_degenerate_mniw_transition( suffStats, U, nu0, Psi0, hyperparams['M0'], hyperparams['V0']) D = la.inv(smp.sample_wishart(nu, la.inv(Psi))) FU = smp.sample_matrix_normal(M, D, V) # Project out Fold = model.parameters['F'] F = smp.project_degenerate_transition_matrix(Fold, FU, U) model.parameters['F'] = F # Convert back to eigen-decomposition form model.update_from_givens_form(U, D) return model
def sample_transition_within_subspace(model, state, hyperparams, pseudo_dof=None, pseudo_sd=None): """ MCMC iteration (Gibbs sampling) for transition matrix and covariance within the constrained subspace """ # Calculate sufficient statistics suffStats = smp.evaluate_transition_sufficient_statistics(state) # Convert to Givens factorisation form U, D = model.convert_to_givens_form() # Sampke a pseudo-observation to constrain the size of move if pseudo_dof is not None: extra_nu = pseudo_dof extra_Psi = smp.sample_wishart(pseudo_dof, D) else: extra_nu = 0 extra_Psi = 0 # Sample a new projected transition matrix and transition covariance rank = model.parameters['rank'][0] nu0 = rank + extra_nu Psi0 = rank * hyperparams['rPsi0'] + np.dot(U, np.dot(extra_Psi, U.T)) nu, Psi, M, V = smp.hyperparam_update_degenerate_mniw_transition( suffStats, U, nu0, Psi0, hyperparams['M0'], hyperparams['V0']) D = la.inv(smp.sample_wishart(nu, la.inv(Psi))) FU = smp.sample_matrix_normal(M, D, V) # Project out Fold = model.parameters['F'] F = smp.project_degenerate_transition_matrix(Fold, FU, U) model.parameters['F'] = F # Convert back to eigen-decomposition form model.update_from_givens_form(U, D) return model