def evidence_approximation(self,
X,
T,
alpha=1e-2,
beta=1e-2,
tol=1e-3,
max_iter=int(1e2)):
n_basis = self.n_basis
n_sample = X.shape[0]
Phi = self.nonlinear_transformation(X)
PhiTPhi = np.outer(Phi, Phi) if Phi.ndim < 2 else Phi.T.dot(Phi)
lamb = linalg.eigvalsh(PhiTPhi)
gamma = np.sum(lamb / (lamb + alpha))
for iteration in range(max_iter):
post_cov = linalg.inv(alpha * np.eye(n_basis) + beta * PhiTPhi)
post_mean = beta * post_cov.dot(Phi.T.dot(T))
alpha = gamma / linalg.norm(post_mean)**2
beta = (n_sample -
gamma) / linalg.norm(T - Phi.dot(post_mean))**2 # FIXME
gamma_new = np.sum(lamb / (lamb + alpha))
if (linalg.norm(gamma_new - gamma) / linalg.norm(gamma) < tol):
break
gamma = gamma_new
self.mean = post_mean
self.prior_precision = alpha
self.noise_precision = beta
return self
评论列表
文章目录