Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确使用scikit learn';二维输入的s高斯过程,一维输出回归?_Python_Regression_Gaussian - Fatal编程技术网

Python 如何正确使用scikit learn';二维输入的s高斯过程,一维输出回归?

Python 如何正确使用scikit learn';二维输入的s高斯过程,一维输出回归?,python,regression,gaussian,Python,Regression,Gaussian,在发布之前,我做了很多搜索,发现了可能正是我的问题。然而,我尝试了答案中的建议,但不幸的是,这并没有解决它,我无法添加评论以要求进一步解释,因为我是这里的新成员 无论如何,我想在一个简单但真实的案例中使用Python中的scikit learn的高斯过程(使用scikit learn文档中提供的示例)。我有一个2D输入集(8对2个参数),名为X。我有8个相应的输出,收集在1D数组y中 # Inputs: 8 points X = np.array([[p1, q1],[p2, q2],[p3

在发布之前,我做了很多搜索,发现了可能正是我的问题。然而,我尝试了答案中的建议,但不幸的是,这并没有解决它,我无法添加评论以要求进一步解释,因为我是这里的新成员

无论如何,我想在一个简单但真实的案例中使用Python中的scikit learn的高斯过程(使用scikit learn文档中提供的示例)。我有一个2D输入集(8对2个参数),名为X。我有8个相应的输出,收集在1D数组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上进行1D预测y\u 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中的GPs相当陌生(不久前也开始使用Python),所以我想我在这里遗漏了一些东西。。。任何回答都会很有帮助,非常感谢,谢谢

我对使用scikit学习高斯过程也相当陌生。但经过一些努力,我成功地实现了一个三维高斯过程回归。有很多一维回归的例子,但在更高的输入维度上却没有

也许您可以显示您正在使用的值

我发现,有时发送输入的格式会产生一些问题。尝试将输入X格式化为:

X = np.array([param1, param2]).T
并将输出格式化为:

gp.fit(X, y.reshape(-1,1))

此外,据我所知,实现假定平均函数m=0。如果您试图回归的输出显示的平均值与0显著不同,则应将其标准化(这可能会解决您的问题)。标准化参数空间也会有所帮助。

您正在使用两个功能来预测第三个。与
plot\u surface
等3D绘图不同,如果使用能够显示第三维信息的2D绘图(如
hist2d
pcolormesh
),通常会更清晰。下面是一个使用与问题类似的数据/代码的完整示例:

from itertools import product
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C

X = np.array([[0,0],[2,0],[4,0],[6,0],[8,0],[10,0],[12,0],[14,0],[16,0],[0,2],
                    [2,2],[4,2],[6,2],[8,2],[10,2],[12,2],[14,2],[16,2]])

y = np.array([-54,-60,-62,-64,-66,-68,-70,-72,-74,-60,-62,-64,-66,
                    -68,-70,-72,-74,-76])

# Input space
x1 = np.linspace(X[:,0].min(), X[:,0].max()) #p
x2 = np.linspace(X[:,1].min(), X[:,1].max()) #q
x = (np.array([x1, x2])).T

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)

x1x2 = np.array(list(product(x1, x2)))
y_pred, MSE = gp.predict(x1x2, return_std=True)

X0p, X1p = x1x2[:,0].reshape(50,50), x1x2[:,1].reshape(50,50)
Zp = np.reshape(y_pred,(50,50))

# alternative way to generate equivalent X0p, X1p, Zp
# X0p, X1p = np.meshgrid(x1, x2)
# Zp = [gp.predict([(X0p[i, j], X1p[i, j]) for i in range(X0p.shape[0])]) for j in range(X0p.shape[1])]
# Zp = np.array(Zp).T

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
ax.pcolormesh(X0p, X1p, Zp)

plt.show()
输出:

看起来很简单,但我的示例数据也是如此。一般来说,您不应该期望通过这几个数据点得到特别有趣的结果

此外,如果确实需要曲面打印,可以将
pcolormesh
行替换为原来的(或多或少):

输出:


我也尝试过使用GPy和pyGPs,但由于它们的文档记录比sklearn略少,所以我在2D方面也没有走得很远。但如果您认为其中一个可能仍然是解决我问题的更好选择,而不是scikit学习,请让我知道-以及为什么!谢谢。在上面,您应用的RBF内核具有相同的超参数初始化(即
[5,5]
)和范围(即
(1e-2,1e2)
),但有两个输入功能。是否有一种方法可以指定只有一个输入1进入一个内核,只有输入2进入具有不同超参数的第二个内核?这种2D输入和1D输入的方法是否也适用于此处提供的支持向量机和相关向量机工具包?
ax = fig.add_subplot(111, projection='3d')            
surf = ax.plot_surface(X0p, X1p, Zp, rstride=1, cstride=1, cmap='jet', linewidth=0, antialiased=False)