def check_extra_loglike_terms(A, B, C, D, mu_init, sigma_init, data): ex1 = LDSStates._extra_loglike_terms( A, B.dot(B.T), C, D.dot(D.T), mu_init, sigma_init, data) ex2 = LDSStates._info_extra_loglike_terms( *extra_info_params(A, B, C, D, mu_init, sigma_init, data)) assert np.isclose(ex1, ex2)
def check_extra_loglike_terms(A, B, C, D, mu_init, sigma_init, data): ex1 = LDSStates._extra_loglike_terms(A, B.dot(B.T), C, D.dot(D.T), mu_init, sigma_init, data) ex2 = LDSStates._info_extra_loglike_terms( *extra_info_params(A, B, C, D, mu_init, sigma_init, data)) assert np.isclose(ex1, ex2)
def check_filters(A, B, C, D, mu_init, sigma_init, data): def info_normalizer(J, h): out = 0. out += 1 / 2. * h.dot(np.linalg.solve(J, h)) out -= 1 / 2. * np.linalg.slogdet(J)[1] out += h.shape[0] / 2. * np.log(2 * np.pi) return out ll, filtered_mus, filtered_sigmas = kalman_filter(mu_init, sigma_init, A, B.dot(B.T), C, D.dot(D.T), data) py_partial_ll = info_normalizer( *dense_infoparams(A, B, C, D, mu_init, sigma_init, data)) partial_ll, filtered_Js, filtered_hs = kalman_info_filter( *info_params(A, B, C, D, mu_init, sigma_init, data)) ll2 = partial_ll + LDSStates._extra_loglike_terms(A, B.dot( B.T), C, D.dot(D.T), mu_init, sigma_init, data) filtered_mus2 = [ np.linalg.solve(J, h) for J, h in zip(filtered_Js, filtered_hs) ] filtered_sigmas2 = [np.linalg.inv(J) for J in filtered_Js] assert all( np.allclose(mu1, mu2) for mu1, mu2 in zip(filtered_mus, filtered_mus2)) assert all( np.allclose(s1, s2) for s1, s2 in zip(filtered_sigmas, filtered_sigmas2)) assert np.isclose(partial_ll, py_partial_ll) assert np.isclose(ll, ll2)
def check_filters(A, B, C, D, mu_init, sigma_init, data): def info_normalizer(J,h): out = 0. out += 1/2. * h.dot(np.linalg.solve(J,h)) out -= 1/2. * np.linalg.slogdet(J)[1] out += h.shape[0]/2. * np.log(2*np.pi) return out ll, filtered_mus, filtered_sigmas = kalman_filter( mu_init, sigma_init, A, B.dot(B.T), C, D.dot(D.T), data) py_partial_ll = info_normalizer(*dense_infoparams( A, B, C, D, mu_init, sigma_init, data)) partial_ll, filtered_Js, filtered_hs = kalman_info_filter( *info_params(A, B, C, D, mu_init, sigma_init, data)) ll2 = partial_ll + LDSStates._extra_loglike_terms( A, B.dot(B.T), C, D.dot(D.T), mu_init, sigma_init, data) filtered_mus2 = [np.linalg.solve(J,h) for J, h in zip(filtered_Js, filtered_hs)] filtered_sigmas2 = [np.linalg.inv(J) for J in filtered_Js] assert all(np.allclose(mu1, mu2) for mu1, mu2 in zip(filtered_mus, filtered_mus2)) assert all(np.allclose(s1, s2) for s1, s2 in zip(filtered_sigmas, filtered_sigmas2)) assert np.isclose(partial_ll, py_partial_ll) assert np.isclose(ll, ll2)
def check_info_Estep(A, B, C, D, mu_init, sigma_init, data): ll, smoothed_mus, smoothed_sigmas, ExnxT = E_step( mu_init, sigma_init, A, B.dot(B.T), C, D.dot(D.T), data) partial_ll, smoothed_mus2, smoothed_sigmas2, ExnxT2 = info_E_step( *info_params(A, B, C, D, mu_init, sigma_init, data)) ll2 = partial_ll + LDSStates._extra_loglike_terms( A, B.dot(B.T), C, D.dot(D.T), mu_init, sigma_init, data) assert np.isclose(ll,ll2) assert np.allclose(smoothed_mus, smoothed_mus2) assert np.allclose(smoothed_sigmas, smoothed_sigmas2) assert np.allclose(ExnxT, ExnxT2)
def check_info_Estep(A, B, C, D, mu_init, sigma_init, data): ll, smoothed_mus, smoothed_sigmas, ExnxT = E_step(mu_init, sigma_init, A, B.dot(B.T), C, D.dot(D.T), data) partial_ll, smoothed_mus2, smoothed_sigmas2, ExnxT2 = info_E_step( *info_params(A, B, C, D, mu_init, sigma_init, data)) ll2 = partial_ll + LDSStates._extra_loglike_terms(A, B.dot( B.T), C, D.dot(D.T), mu_init, sigma_init, data) assert np.isclose(ll, ll2) assert np.allclose(smoothed_mus, smoothed_mus2) assert np.allclose(smoothed_sigmas, smoothed_sigmas2) assert np.allclose(ExnxT, ExnxT2)
def meanfield_update_gaussian_states(self): J_init = np.linalg.inv(self.sigma_init) h_init = np.linalg.solve(self.sigma_init, self.mu_init) def get_paramseq(distns): contract = partial(np.tensordot, self.expected_states, axes=1) std_param = lambda d: d._natural_to_standard(d.mf_natural_hypparam) params = [mniw_expectedstats(*std_param(d)) for d in distns] return map(contract, zip(*params)) J_pair_22, J_pair_21, J_pair_11, logdet_pair = \ get_paramseq(self.dynamics_distns) J_yy, J_yx, J_node, logdet_node = get_paramseq(self.emission_distns) h_node = np.einsum('ni,nij->nj', self.data, J_yx) self._mf_lds_normalizer, self.smoothed_mus, self.smoothed_sigmas, \ E_xtp1_xtT = info_E_step( J_init,h_init,J_pair_11,-J_pair_21,J_pair_22,J_node,h_node) self._mf_lds_normalizer += LDSStates._info_extra_loglike_terms( J_init, h_init, logdet_pair, J_yy, logdet_node, self.data) self._set_gaussian_expected_stats( self.smoothed_mus,self.smoothed_sigmas,E_xtp1_xtT)