def diagonal_hessian_log_partition(self, eta): base_log_partition = self.base_model.log_partition(eta[1:]) exp_base_log_partition = safe_exp(base_log_partition) exp_x0 = safe_exp(eta[0]) exp_sum = safe_exp(eta[0] + base_log_partition) sum_exp = exp_base_log_partition + exp_x0 sq_sum_exp = safe_sq(sum_exp) diag_hess_base = self.base_model.diagonal_hessian_log_partition(eta[1:]) sq_grad_base = safe_sq(self.base_model.grad_log_partition(eta[1:])) numerator = np.zeros(diag_hess_base.shape) numerator[:,sq_sum_exp != np.inf] = (sum_exp[sq_sum_exp != np.inf] * diag_hess_base[:, sq_sum_exp != np.inf] + exp_x0[sq_sum_exp != np.inf] * sq_grad_base[:, sq_sum_exp != np.inf]) / sq_sum_exp[sq_sum_exp != np.inf] return np.concatenate(((exp_sum / sq_sum_exp)[:,np.newaxis].T, exp_base_log_partition * numerator), axis=0)
def diagonal_hessian_log_partition(self, eta): base_log_partition = self.base_model.log_partition(eta[1:]) exp_base_log_partition = safe_exp(base_log_partition) exp_x0 = safe_exp(eta[0]) exp_sum = safe_exp(eta[0] + base_log_partition) sum_exp = exp_base_log_partition + exp_x0 sq_sum_exp = safe_sq(sum_exp) diag_hess_base = self.base_model.diagonal_hessian_log_partition( eta[1:]) sq_grad_base = safe_sq(self.base_model.grad_log_partition(eta[1:])) numerator = np.zeros(diag_hess_base.shape) numerator[:, sq_sum_exp != np.inf] = ( sum_exp[sq_sum_exp != np.inf] * diag_hess_base[:, sq_sum_exp != np.inf] + exp_x0[sq_sum_exp != np.inf] * sq_grad_base[:, sq_sum_exp != np.inf] ) / sq_sum_exp[sq_sum_exp != np.inf] return np.concatenate(((exp_sum / sq_sum_exp)[:, np.newaxis].T, exp_base_log_partition * numerator), axis=0)
def hessian_log_partition(self, eta): return np.array([[-0.5 / eta[1], 0.5 * eta[0] / safe_sq(eta[1])], [ 0.5 * eta[0] / safe_sq(eta[1]), (eta[1] - safe_sq(eta[0])) / (2 * eta[1]**3) ]])
def grad_log_partition(self, eta): return np.array([ -0.5 * eta[0] / eta[1], (safe_sq(eta[0]) - 2 * eta[1]) / (4 * safe_sq(eta[1])) ])
def log_partition(self, eta): return -safe_sq(eta[0]) / (4 * eta[1]) - 0.5 * np.log(-2 * eta[1])
def sufficient_statistics(self, x): return np.array([x, safe_sq(x)]).T
def diagonal_hessian_log_partition(self, eta): return np.array( [polygamma(1, eta[0] + 1), (eta[0] + 1) / safe_sq(eta[1])])
def hessian_log_partition(self, eta): return np.array([[polygamma(1, eta[0] + 1), -1.0 / eta[1]], [-1.0 / eta[1], (eta[0] + 1) / safe_sq(eta[1])]])
def diagonal_hessian_log_partition(self, eta): return np.array([polygamma(1, eta[0] + 1), (eta[0] + 1) / safe_sq(eta[1])])
def hessian_log_partition(self, eta): exp_eta = safe_exp(eta) return -exp_eta / safe_sq(exp_eta + 1)
def diagonal_hessian_log_partition(self, eta): return np.array([-0.5 / eta[1], (eta[1] - safe_sq(eta[0])) / (2*eta[1]**3)])
def hessian_log_partition(self, eta): return np.array([[-0.5 / eta[1],0.5 * eta[0] / safe_sq(eta[1])], [0.5 * eta[0] / safe_sq(eta[1]),(eta[1] - safe_sq(eta[0])) / (2*eta[1]**3)]])
def grad_log_partition(self, eta): return np.array([-0.5 * eta[0] / eta[1], (safe_sq(eta[0]) - 2*eta[1]) / (4 * safe_sq(eta[1]))])
def log_partition(self, eta): return -safe_sq(eta[0]) / (4*eta[1]) - 0.5 * np.log(-2 * eta[1])
def diagonal_hessian_log_partition(self, eta): return np.array( [-0.5 / eta[1], (eta[1] - safe_sq(eta[0])) / (2 * eta[1]**3)])