我正在尝试使用 GPflow 进行多维回归。但我对均值和方差的形状感到困惑。例如:应该预测形状为 (20,20) 的二维输入空间 X。我的训练样本的形状为 (8,2),这意味着两个维度总共有 8 个训练样本。y 值的形状为 (8,1),这当然意味着 2 个输入维度的每个组合的一个真实值。如果我现在使用 model.predict_y(X) 我希望得到形状的平均值 (20,20) 但获得形状 (20,1)。方差也是如此。我认为这个问题来自 y 值的形状,但我不知道如何解决它。
bound = 3
num = 20
X = np.random.uniform(-bound, bound, (num,num))
print(X_sample.shape) # (8,2)
print(Y_sample.shape) # (8,1)
k = gpflow.kernels.RBF(input_dim=2)
m = gpflow.models.GPR(X_sample, Y_sample, kern=k)
m.likelihood.variance = sigma_n
m.compile()
gpflow.train.ScipyOptimizer().minimize(m)
mean, var = m.predict_y(X)
print(mean.shape) # (20, 1)
print(var.shape) # (20, 1)
Run Code Online (Sandbox Code Playgroud)
听起来您可能对输入位置网格的形状和 numpy 数组的形状感到困惑:如果您想在 20 x 20 的二维网格上进行预测,您总共有 400 个点,每个点有 2 个值. 所以 X(你传递给 的那个m.predict_y())应该有形状 (400, 2)。(请注意,第二个维度需要与 X_sample 具有相同的形状!)要构造这个形状数组 (400,2),您可以使用np.meshgrid(例如,请参阅Python/NumPy 中的网格网格的目的是什么?)。
m.predict_y(X)只预测每个测试点的边际方差,因此返回的mean和var都具有形状 (400,1)(与 X 相同的长度)。您当然可以将它们重塑为网格上的 20 x 20 值。
(也可以计算全协方差,对于潜在F该作为实现m.predict_f_full_cov,这对于形状(400,2的X)将返回一个400×400矩阵。如果你想从GP一致的样本这是相关的,但我怀疑这远远超出了这个问题。)
| 归档时间: |
|
| 查看次数: |
634 次 |
| 最近记录: |