def __posterior_kernel_cij_temporal(self, obs_model, cov_matrix, total_cov_matrix, dynamic_modified_fourier_series): """ The bread-and-butter of the method. """ y = np.matrix(dynamic_modified_fourier_series).T c_ij = cov_matrix * obs_model.H * matrix_division(divider = total_cov_matrix, divided = y, side = "left", cholesky = "no") return np.real(np.fft.fftshift(np.fft.ifft(np.fft.ifftshift(np.array(c_ij).flatten()), axis = 0)))
def __get_sample(self, block_matrices, number_sources, number_time_points): number_points = block_matrices["block_green_matrix"].shape[0] operator = utility.matrix_division(divider = np.identity(number_points) - block_matrices["block_green_matrix"]*block_matrices["block_kernel_matrix"]*block_matrices["block_moving_average_matrix"], divided = block_matrices["block_green_matrix"], side = "left", cholesky = "no") driving_noise = np.matrix(np.random.normal(loc=0.0, scale=1.0, size=(number_points, 1))) sample = np.reshape(operator*driving_noise, newshape = (number_sources, number_time_points)) return sample
def __get_log_marginal_likelihood(self, covariance_matrix, data, time_series_index, jitter): log_marginal_likelihood = 0 number_points = len(data[0][time_series_index,:]) jittered_covariance_matrix = covariance_matrix + jitter*np.identity(number_points) cholesky_factor = np.linalg.cholesky(jittered_covariance_matrix) log_determinant = 2*np.sum(np.log(np.diag(cholesky_factor))) for sample in data: time_series = sample[time_series_index,:].T whitened_time_series = matrix_division(divider = cholesky_factor, divided = np.reshape(time_series, (len(time_series),1)), side = "left", cholesky = "no") data_factor = whitened_time_series.T*whitened_time_series sample_log_marginal_likelihood = - 0.5*number_points*np.log(np.pi) - 0.5*log_determinant - 0.5*data_factor log_marginal_likelihood += sample_log_marginal_likelihood return log_marginal_likelihood
def posterior_kernel_cij_temporal_parwrap(parallel_args_struct): """ The bread-and-butter of the method. """ # unpack y = np.matrix(parallel_args_struct['Px_j']).T covariance_matrices = parallel_args_struct['cov'] observation_models = parallel_args_struct['obs_models'] i = parallel_args_struct['i'] j = parallel_args_struct['j'] total_cov_matrix = self.__get_total_covariance_matrix(covariance_matrices, observation_models, j, self.noise_level) c_ij = covariance_matrices * observation_models[i].H \ * matrix_division(divider = total_cov_matrix, divided = y, side = "left", cholesky = "no") return np.real(np.fft.fftshift(np.fft.ifft(np.fft.ifftshift(np.array(c_ij).flatten()), axis = 0)))