def update_density_estimate(self): # load or learn parameters if self.learn_parameters: sigma, lmbda = self.determine_sigma_lmbda() else: sigma = self.sigma0 lmbda = self.lmbda0 logger.info("Using sigma: %.2f, lmbda=%.6f" % (sigma, lmbda)) D = self.Z.shape[1] gamma = 0.5 / (sigma**2) omega, u = sample_basis(D, self.m, gamma) logger.info("Estimate density in RKHS, N=%d, m=%d" % (self.N, self.m)) theta = score_matching_sym(self.Z, lmbda, omega, u) # logger.info("Computing objective function") # J = _objective_sym(Z, sigma, lmbda, a, K, b, C) # J_xval = np.mean(xvalidate(Z, 5, sigma, self.lmbda, K)) # logger.info("N=%d, sigma: %.2f, lambda: %.2f, J(a)=%.2f, XJ(a)=%.2f" % \ # (self.N, sigma, self.lmbda, J, J_xval)) dlogq_est = lambda x: log_pdf_estimate_grad( feature_map_grad_single(x, omega, u), theta) return dlogq_est
lmbda = 1. sigma = select_sigma_grid(Z, lmbda=lmbda) K = gaussian_kernel(Z, sigma=sigma) b = _compute_b_sym(Z, K, sigma) C = _compute_C_sym(Z, K, sigma) a = score_matching_sym(Z, sigma, lmbda, K, b, C) J = _objective_sym(Z, sigma, lmbda, a, K, b, C) J_xval = np.mean(xvalidate(Z, 5, sigma, lmbda, K)) print("N=%d, sigma: %.2f, lambda: %.2f, J(a)=%.2f, XJ(a)=%.2f" % \ (N, sigma, lmbda, J, J_xval)) kernel = lambda X, Y=None: gaussian_kernel(X, Y, sigma=sigma) kernel_grad = lambda x, X=None: gaussian_kernel_grad(x, X, sigma) logq_est = lambda x: log_pdf_estimate(x, a, Z, kernel) dlogq_est = lambda x: log_pdf_estimate_grad(x, a, Z, kernel_grad) # momentum Sigma_p = np.eye(D) * .1 L_p = np.linalg.cholesky(Sigma_p) logp = lambda x: log_gaussian_pdf( x, Sigma=L_p, compute_grad=False, is_cholesky=True) dlogp = lambda x: log_gaussian_pdf( x, Sigma=L_p, compute_grad=True, is_cholesky=True) p_sample = lambda: sample_gaussian( N=1, mu=np.zeros(D), Sigma=L_p, is_cholesky=True)[0] # starting state p0 = p_sample() q0 = np.zeros(D) q0[:2] = np.array([0, -3])
# estimate density in rkhs N = 800 mu = np.zeros(D) Z = np.random.standard_t(df=nu, size=(N, D)) lmbda = 0.0001 sigma = 0.5 gamma = 0.5 * (sigma**2) m = N omega = gamma * np.random.randn(D, m) u = np.random.uniform(0, 2 * np.pi, m) logger.info("Estimating density") theta = score_matching_sym(Z, lmbda, omega, u) logq_est = lambda x: log_pdf_estimate(feature_map(x, omega, u), theta) dlogq_est = lambda x: log_pdf_estimate_grad( feature_map_grad_single(x, omega, u), theta) # momentum Sigma_p = np.eye(D) L_p = np.linalg.cholesky(Sigma_p) logp = lambda x: log_gaussian_pdf( x, Sigma=L_p, compute_grad=False, is_cholesky=True) dlogp = lambda x: log_gaussian_pdf( x, Sigma=L_p, compute_grad=True, is_cholesky=True) p_sample = lambda: sample_gaussian( N=1, mu=np.zeros(D), Sigma=L_p, is_cholesky=True)[0] # starting state p0 = p_sample() q0 = np.zeros(D) q0[:2] = np.array([-1, -1])