我最近一直在使用 gpflow,特别是高斯过程回归,来对我可以访问每个输入的近似矩的过程进行建模。我有一个大小为 (N,1) 的输入值 X 的向量和一个大小为 (N,1) 的响应 Y 的向量。但是,我也知道,对于每个 (x,y) 对,特定 y 值的相关方差、偏度、峰度等的近似值。
由此,我知道了一些属性,这些属性告诉我使用每个数据点的适当可能性。在最简单的情况下,我只是假设所有可能性都是高斯的,并指定每个点的方差。我通过调整以下教程创建了我的代码的最小示例:https ://nbviewer.jupyter.org/github/GPflow/GPflow/blob/develop/doc/source/notebooks/advanced/varying_noise.ipynb#Demo- 2:-分组噪声方差。
import numpy as np
import gpflow
def generate_data(N=100):
X = np.random.rand(N)[:, None] * 10 - 5 # Inputs, shape N x 1
F = 2.5 * np.sin(6 * X) + np.cos(3 * X) # Mean function values
groups = np.arange( 0, N, 1 ).reshape(-1,1)
NoiseVar = np.array([i/100.0 for i in range(N)])[groups]
Y = F + np.random.randn(N, 1) * np.sqrt(NoiseVar) # Noisy data
return X, Y, groups, NoiseVar
# Get data
X, Y, groups, NoiseVar = generate_data()
Y_data = np.hstack([Y, groups])
# Generate one likelihood per data-point
likelihood = gpflow.likelihoods.SwitchedLikelihood( [gpflow.likelihoods.Gaussian(variance=NoiseVar[i]) for i in range(Y.shape[0])])
# model construction (notice that num_latent is 1)
kern = gpflow.kernels.Matern52(input_dim=1, lengthscales=0.5)
model = gpflow.models.VGP(X, Y_data, kern=kern, likelihood=likelihood, num_latent=1)
# Specify the likelihood as non-trainable
model.likelihood.set_trainable(False)
# build the natural gradients optimiser
natgrad_optimizer = gpflow.training.NatGradOptimizer(gamma=1.)
natgrad_tensor = natgrad_optimizer.make_optimize_tensor(model, var_list=[(model.q_mu, model.q_sqrt)])
session = model.enquire_session()
session.run(natgrad_tensor)
# update the cache of the variational parameters in the current session
model.anchor(session)
# Stop Adam from optimising the variational parameters
model.q_mu.trainable = False
model.q_sqrt.trainable = False
# Create Adam tensor
adam_tensor = gpflow.train.AdamOptimizer(learning_rate=0.1).make_optimize_tensor(model)
for i in range(200):
session.run(natgrad_tensor)
session.run(adam_tensor)
# update the cache of the parameters in the current session
model.anchor(session)
print(model)
上面的代码适用于高斯似然和已知方差。检查我的真实数据,我发现它经常出现偏差,因此,我想使用非高斯可能性对其进行建模,但我不确定如何根据我所知道的情况指定这些其他可能性参数。
所以我的问题是:鉴于这种设置,到目前为止,我如何调整我的代码以在每个步骤中包含非高斯似然性,特别是根据我已知的方差、偏度、峰度等与每个步骤相关联来指定和修复它们的参数个人 y 值?