目前我正在实施一个高斯回归过程模型,并且在尝试将其应用于我的问题范围时遇到了一些问题。我的问题是我将三个变量作为模型的输入,其中一个值 ( theta) 的影响比其他两个值大得多,alpha1而alpha2. 输入和输出具有以下值(为了更好地理解,只有几个值):
# X (theta, alpha1, alpha2)
array([[ 9.07660169, 0.61485493, 1.70396493],
[ 9.51498486, -5.49212002, -0.68659511],
[10.45737558, -2.2739529 , -2.03918961],
[10.46857663, -0.4587848 , 0.54434441],
[ 9.10133699, 8.38066374, 0.66538822],
[ 9.17279647, 0.36327109, -0.30558115],
[10.36532505, 0.87099676, -7.73775872],
[10.13681026, -1.64084098, -0.09169159],
[10.38549264, 1.80633583, 1.3453195 ],
[ 9.72533357, 0.55861224, 0.74180309])
# y
array([4.93483686, 5.66226844, 7.51133372, 7.54435854, 4.92758927,
5.0955348 , 7.26606153, 6.86027353, 7.36488184, 6.06864003])
Run Code Online (Sandbox Code Playgroud)
可以看出,thetay 的值显着改变,而alpha1和 的变化在alpha2y 上更为微妙。
我面临的情况是,我正在将模型应用于我的数据,并且在此模型之外,我正在将 Scipy 的最小化应用于模型,将其中一个输入变量固定为此最小化。下面的代码可能会更好地说明:
# …Run Code Online (Sandbox Code Playgroud) 假设我正在对我的数据应用高斯过程回归。在拟合模型之前,我将执行某种特征工程。模型拟合后,我的目标是在曲线上应用最小化,我打算限制某些值,以找到最佳 X。但是,如果我正在应用某种特征,那么问题来了工程到我的数据,并将模型拟合到该特定数据集,当我应用约束优化时,我应该如何找出我想要约束它的值,因为我改变了我的输入数据。如果这听起来令人困惑,以下带有一些代码的解释可能会有所帮助:
假设我有数据:
# X (theta, alpha1, alpha2)
array([[ 9.07660169, 0.61485493, 1.70396493],
[ 9.51498486, -5.49212002, -0.68659511],
[10.45737558, -2.2739529 , -2.03918961],
[10.46857663, -0.4587848 , 0.54434441],
[ 9.10133699, 8.38066374, 0.66538822],
[ 9.17279647, 0.36327109, -0.30558115],
[10.36532505, 0.87099676, -7.73775872],
[10.13681026, -1.64084098, -0.09169159],
[10.38549264, 1.80633583, 1.3453195 ],
[ 9.72533357, 0.55861224, 0.74180309])
# y
array([4.93483686, 5.66226844, 7.51133372, 7.54435854, 4.92758927,
5.0955348 , 7.26606153, 6.86027353, 7.36488184, 6.06864003])
Run Code Online (Sandbox Code Playgroud)
然后我应用某种特征工程,在这种情况下,一个简单的 MinMaxScaler:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) …Run Code Online (Sandbox Code Playgroud) 我最近遇到一个问题,我认为多输出 GP 可能是一个不错的选择。我目前正在对我的数据应用单输出 GP,随着维度的增加,我的结果变得越来越糟。我尝试过使用 SKlearn 进行多输出,并且能够在更高维度上获得更好的结果,但是我相信 GPy 对于此类任务来说更完整,并且我可以更好地控制模型。对于单输出 GP,我将内核设置如下:
kernel = GPy.kern.RBF(input_dim=4, variance=1.0, lengthscale=1.0, ARD = True)
m = GPy.models.GPRegression(X, Y_single_output, kernel = kernel, normalizer = True)
m.optimize_restarts(num_restarts=10)
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,X 的大小为 (20,4),Y 的大小为 (20,1)。
我从多输出高斯过程简介中获得的多输出实现 我根据示例准备数据,将 X_mult_output 设置为大小 (80,2) - 第二列是输入索引 - 并重新排列 Y至 (80,1)。
kernel = GPy.kern.RBF(1,lengthscale=1, ARD = True)**GPy.kern.Coregionalize(input_dim=1,output_dim=4, rank=1)
m = GPy.models.GPRegression(X_mult_output,Y_mult_output, kernel = kernel, normalizer = True)
Run Code Online (Sandbox Code Playgroud)
好吧,到目前为止一切似乎都有效,现在我想预测这些值。问题是我似乎无法预测这些值。据我了解,您可以通过在 Y_metadata 参数上指定输入索引来预测单个输出。由于我有 4 个输入,因此我设置了一个要预测的数组,如下所示:
x_pred = np.array([3,2,2,4])
Run Code Online (Sandbox Code Playgroud)
然后,我想我必须分别对 x_pred 数组中的每个值进行预测,如共区域回归模型(向量值回归)中所示:
Y_metadata1 = {'output_index': np.array([[0]])}
y1_pred = …Run Code Online (Sandbox Code Playgroud) python regression machine-learning non-linear-regression gpy