使用 GPFlow 向高斯过程添加概率随机效应

问题描述

随机效应在统计学中常用来包括实验单元的效应,例如

y = f(x) + Zη + ε,

其中 f(x) 是对固定效应建模的函数,Z 是实验设计的模型矩阵,η 是随机斜率分布为 ~N(0,σ²I) 的向量,ε 是误差。

统计学中,f(x) 通常是一个线性模型,因为 f(x) = Xβ。

在对几位患者的纵向数据进行建模时,为了 f(x),我可以使用 PyMC3 的潜在 GP,如 PyMC3 discourse site 所示。然而,它的扩展性很差,因为 PyMC3 没有潜在 GP 的稀疏近似。

github 上的 a solution 展示了 GPytorch 如何处理此类模型。可以用GPFlow和tensorflow-probability来完成吗?

以下代码是在没有随机效果的情况下编写的。它用于 GPR,但我期待将其用于 SGPR、VGP 和 SVGP。

import gpflow
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow_probability as tfp

data = pd.read_csv('https://gist.githubusercontent.com/essicolo/f31641cee96e855772d4ca4151bc8cdf/raw/48043931bbd619ef4992ed202e45c9a292c44b62/sim-data.csv')

# standardize
data_sc = (
    data
    .drop("id",axis = 1)
    .apply(lambda x: (x-x.mean()) / x.std(),axis=0)
    .assign(id = data.id)
)

# X and y arrays
X_sc = data_sc.drop(["id","y"],axis=1).values
y_sc = data_sc.y.values.reshape(-1,1)

# indices for the random effect (to be used later)
idx = data_sc.id.values - 1
n_idx = np.unique(idx).shape[0]

# gpflow
## the model
k = gpflow.kernels.Matern52()
m = gpflow.models.GPR(
    data=(X_sc,y_sc),kernel=k,mean_function=None
)

## hyperparameter priors
m.kernel.variance.prior = tfp.distributions.HalfCauchy(
    loc = to_default_float(0),scale = to_default_float(2)
)
m.kernel.lengthscales.prior = tfp.distributions.Halfnormal(
    scale = to_default_float(5)
)

## optimizer
opt = gpflow.optimizers.Scipy()

## fit
opt_logs = opt.minimize(
    m.training_loss,m.trainable_variables,options=dict(maxiter=10)
)

## check
meanp_ysc,varp_ysc = m.predict_f(X_sc)
plt.plot(y_sc,meanp_ysc[:,0],'.')
plt.axis('square');

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...