def gradient_ascent(a, b, sigma, l, alpha, K_y):
"""
tune hyperparameters sigma and l for RBF kernel
:param a: input vector a
:param b: input vector b
:param sigma: output variance determines the average distance of your function away from its mean
:param l: lengthscale determines the length of the 'wiggles' in your function.
:param alpha: equals to K_inv * y
:param K_y: K_inv
:return: current sigmal and l
"""
step_size = 0.01
sqdist = ((a[:, :, None] - b[:, :, None].T) ** 2).sum(1)
# fix the output variance of RBF kernel in order to visualize it in one dimension
'''
# tune hyperparameter sigma
sigma_grad = 2 * sigma * np.exp(-.5*sqdist/(l**2))
sigma_matrix = np.dot(np.dot(alpha, alpha.T) - K_y, sigma_grad)
tr_sigma = np.diagonal(sigma_matrix).sum()
sigma_var = .5 * tr_sigma
'''
# tune hyperparameter l
l_grad = sigma**2 * np.exp(-.5*sqdist/(l**2)) * (sqdist/l**3)
l_matrix = np.dot(np.dot(alpha, alpha.T) - K_y, l_grad)
tr_l = np.diagonal(l_matrix).sum()
l_var = .5 * tr_l
# gradient ascent to maximum log marginal likelihood simultaneously
'''
sigma = sigma + step_size * sigma_var
'''
l = l + step_size * l_var
return sigma, l
tune_hyperparms_regression.py 文件源码
python
阅读 24
收藏 0
点赞 0
评论 0
评论列表
文章目录