0

我最近一直在使用 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 值?

4

1 回答 1

0

首先,您需要选择使用哪种非高斯似然。GPflow 在likelihoods.py. 然后你需要调整这条线

likelihood = gpflow.likelihoods.SwitchedLikelihood(
    [gpflow.likelihoods.Gaussian(variance=NoiseVar[i]) for i in range(Y.shape[0])]
)

列出您的非高斯可能性。

哪种可能性可以利用您的偏度和峰度信息是一个统计问题。根据您的想法,您可能需要实现自己的可能性类,这可以通过继承来完成Likelihood。您应该能够从likelihoods.py.

于 2019-09-04T09:57:26.877 回答