问题描述
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 (将#修改为@)