【发布时间】:2017-05-25 03:11:44
【问题描述】:
在发布之前,我做了很多搜索,发现 this question 这可能正是我的问题。但是,我尝试了答案中提出的建议,但不幸的是,这并没有解决它,我无法添加评论以请求进一步解释,因为我是这里的新成员。
无论如何,我想在 Python 中使用带有 scikit-learn 的高斯过程,从一个简单但真实的案例开始(使用 scikit-learn 文档中提供的示例)。我有一个名为 X 的 2D 输入集(8 对 2 个参数)。我有 8 个对应的输出,收集在一维数组 y 中。
# Inputs: 8 points
X = np.array([[p1, q1],[p2, q2],[p3, q3],[p4, q4],[p5, q5],[p6, q6],[p7, q7],[p8, q8]])
# Observations: 8 couples
y = np.array([r1,r2,r3,r4,r5,r6,r7,r8])
我定义了一个输入测试空间x:
# Input space
x1 = np.linspace(x1min, x1max) #p
x2 = np.linspace(x2min, x2max) #q
x = (np.array([x1, x2])).T
然后我实例化 GP 模型,将其拟合到我的训练数据 (X,y),并在我的输入空间 x 上进行一维预测 y_pred :
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
kernel = C(1.0, (1e-3, 1e3)) * RBF([5,5], (1e-2, 1e2))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=15)
gp.fit(X, y)
y_pred, MSE = gp.predict(x, return_std=True)
然后我制作了一个 3D 绘图:
fig = pl.figure()
ax = fig.add_subplot(111, projection='3d')
Xp, Yp = np.meshgrid(x1, x2)
Zp = np.reshape(y_pred,50)
surf = ax.plot_surface(Xp, Yp, Zp, rstride=1, cstride=1, cmap=cm.jet,
linewidth=0, antialiased=False)
pl.show()
这是我得到的:
当我修改内核参数时,我得到这样的东西,类似于我上面提到的海报:
这些图甚至与原始训练点的观察结果不匹配([65.1,37] 的响应较低,[92.3,54] 的响应最高)。
我对 2D 领域的 GP 相当陌生(不久前也开始使用 Python),所以我认为我在这里遗漏了一些东西......任何答案都会有所帮助并非常感谢,谢谢!
【问题讨论】:
-
我也尝试过使用 GPy 和 pyGP,但由于它们的文档记录比 sklearn 略少,所以我在 2D 方面也没有走得太远。但是,如果您认为其中一个可能仍然是解决我的问题的更好选择,而不是 scikit-learn,请告诉我 - 以及为什么!谢谢。
标签: python regression gaussian