首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N维GP回归

N维GP回归
EN

Stack Overflow用户
提问于 2019-02-01 14:35:55
回答 2查看 901关注 0票数 3

我试图使用GPflow进行多维回归。但我对均值和方差的形状感到困惑。例如:一个二维输入空间X的形状(20,20)应该被预测.我的训练样本是形状(8,2),这意味着8个训练样本的整体两个维度。Y-值是形状(8,1),当然,这意味着每两个输入维组合的地面真相的一个值。如果我现在使用model.predict_y(X),我希望得到一个形状的平均值(20,20),但得到的形状是(20,1)。方差也是如此。我认为这个问题来自y-值的形状,但我不知道如何解决它。

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-01 15:33:06

听起来你可能混淆了输入位置网格的形状和numpy数组的形状:如果你想在一个二维的20x20网格上预测,你总共有400个点,每个都有2个值。所以X(传递给m.predict_y()的那个)应该是形状(400,2)。(请注意,第二个维度需要具有与X_sample相同的形状!)要构造这个形状数组(400,2),可以使用np.meshgrid (例如,参见What is the purpose of meshgrid in Python / NumPy?)。

m.predict_y(X)只预测每个测试点的边缘方差,因此返回的meanvar都具有形状(400,1) (与X相同的长度)。当然,您可以将其重塑为网格上的20x20值。

(计算完全协方差也是可能的,对于潜在的f,它被实现为m.predict_f_full_cov,对于形状的X (400,2)将返回一个400x400矩阵。这是相关的,如果你想要一致的样本从GP,但我怀疑这远远超出了这个问题。)

票数 5
EN

Stack Overflow用户

发布于 2019-02-02 17:09:41

我确实犯了一个错误,就是不把数组夷为平地,而这反过来又产生了这个错误。感谢您的快速反应STJ!

下面是工作代码的一个示例:

代码语言:javascript
复制
# Generate data
bound = 3.
x1 = np.linspace(-bound, bound, num)
x2 = np.linspace(-bound, bound, num)
x1_mesh,x2_mesh = np.meshgrid(x1, x2)
X = np.dstack([x1_mesh, x2_mesh]).reshape(-1, 2)
z = f(x1_mesh, x2_mesh) # evaluation of the function on the grid

# Draw samples from feature vectors and function by a given index
size = 2
np.random.seed(1991)
index = np.random.choice(range(len(x1)), size=(size,X.ndim), replace=False)
samples = utils.sampleFeature([x1,x2], index)
X1_sample = samples[0]
X2_sample = samples[1]  
X_sample = np.column_stack((X1_sample, X2_sample))
Y_sample = utils.samplefromFunc(f=z, ind=index)



# Change noise parameter
sigma_n = 0.0
# Construct models with initial guess
k = gpflow.kernels.RBF(2,active_dims=[0,1], lengthscales=1.0,ARD=True)
m = gpflow.models.GPR(X_sample, Y_sample, kern=k)
m.likelihood.variance = sigma_n
m.compile()

#print(X.shape)
mean, var = m.predict_y(X)
mean_square = mean.reshape(x1_mesh.shape) # Shape: (num,num)
var_square = var.reshape(x1_mesh.shape) # Shape: (num,num)

# Plot mean
fig = plt.figure(figsize=(16, 12))
ax = plt.axes(projection='3d')
ax.plot_surface(x1_mesh, x2_mesh, mean_square, cmap=cm.viridis, linewidth=0.5, antialiased=True, alpha=0.8)
cbar = ax.contourf(x1_mesh, x2_mesh, mean_square, zdir='z', offset=offset, cmap=cm.viridis, antialiased=True)
ax.scatter3D(X1_sample, X2_sample, offset, marker='o',edgecolors='k', color='r', s=150)
fig.colorbar(cbar)


for t in ax.zaxis.get_major_ticks(): t.label.set_fontsize(fontsize_ticks)
ax.set_title("$\mu(x_1,x_2)$", fontsize=fontsize_title)
ax.set_xlabel("\n$x_1$", fontsize=fontsize_label)
ax.set_ylabel("\n$x_2$", fontsize=fontsize_label)
ax.set_zlabel('\n\n$\mu(x_1,x_2)$', fontsize=fontsize_label)
plt.xticks(fontsize=fontsize_ticks)
plt.yticks(fontsize=fontsize_ticks)
plt.xlim(left=-bound, right=bound)
plt.ylim(bottom=-bound, top=bound)
ax.set_zlim3d(offset,np.max(z))

这导致(红色的点是从函数中提取的样本点)。注意:代码没有重构-请注意:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54481636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档