def create_error_models(self): """ In order to calculate the total error of the individual GPs an error model is created for each GP. The inputs to this are the error between the individual GP predictions and the truth value at all available truth data points. The prior_error value is subtracted from the difference to ensure that the points are centred around 0. """ gp_error_models = [] for i in range(self.num_models): gpmodel_mean, gpmodel_var = self.gp_models[i].predict_var( self.x_true) gpmodel_mean = gpmodel_mean * self.model_std[i] + self.model_mean[i] error = np.abs(self.y_true - gpmodel_mean) self.err_mean.append(np.mean(error)) self.err_std.append(np.std(error)) if self.err_std[i] == 0: self.err_std[i] = 1 new_model = gp_model(self.x_true, (error - self.err_mean[i]) / self.err_std[i], self.err_model_hp["l"][i], self.err_model_hp["sf"][i], self.err_model_hp["sn"][i], self.num_dim, self.kernel) gp_error_models.append(new_model) return gp_error_models
def create_fused_GP(self, x_test, l_param, sigma_f, sigma_n, kernel): """ In this function we create the fused model by calculating the fused mean and variance at the x_test values and then fitting a GP model using the given hyperparameters """ model_mean = [] model_var = [] for i in range(len(self.gp_models)): m_mean, m_var = self.gp_models[i].predict_var(x_test) m_mean = m_mean * self.model_std[i] + self.model_mean[i] m_var = m_var * (self.model_std[i]**2) model_mean.append(m_mean) err_mean, err_var = self.gp_err_models[i].predict_var(x_test) err_mean = err_mean * self.err_std[i] + self.err_mean[i] model_var.append((err_mean)**2 + m_var) fused_mean, fused_var = reification(model_mean, model_var) self.fused_y_mean = np.mean(fused_mean[0:400:12]) self.fused_y_std = np.std(fused_mean[0:400:12]) if self.fused_y_std == 0: self.fused_y_std = 1 fused_mean = (fused_mean - self.fused_y_mean) / self.fused_y_std self.fused_GP = gp_model(x_test[0:400:12], fused_mean[0:400:12], l_param, sigma_f, abs(fused_var[0:400:12])**(0.5), self.num_dim, kernel) return self.fused_GP
def create_gps(self): """ GPs need to be created for each of the lower dimension information sources as used in the reification method. These can be multi-dimensional models. As a result, the x_train and y_train data needs to be added to the class as a list of numpy arrays. """ gp_models = [] for i in range(self.num_models): new_model = gp_model( self.x_train[i], (self.y_train[i] - self.model_mean[i]) / self.model_std[i], self.model_hp["l"][i], self.model_hp["sf"][i], self.model_hp["sn"][i], self.num_dim, self.kernel) gp_models.append(new_model) return gp_models