Хорошо, я знаю, что этот вопрос уже задавался много, но я не могу найти никакого объяснения, хорошего ответа на него.Сам мой вопрос прост: при выполнении регрессии гауссовского процесса с множественными переменными X, как определить, какое ядро содержит какую переменную?
Пример, вероятно, прояснит это.Посмотрите на следующий код:
import matplotlib as mpl
mpl.use('TkAgg')
from matplotlib import pyplot as plt
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
from sklearn.gaussian_process.kernels import ExpSineSquared, WhiteKernel, ConstantKernel
np.random.seed(0)
X = np.array([[0, 1, 2], [1, 3, 4], [2, 5, 1], [3, 7, 5], [4, 9, 7], [5, 0, 8], [6, 1, 2], [7, 3, 4], [8, 5, 1],
[9, 7, 5], [10, 9, 7], [11, 0, 8], [12, 1, 2], [13, 3, 4], [14, 5, 1], [15, 7, 5],
[16, 9, 7], [17, 9, 8]])
y = np.random.uniform(200, 300, len(X))
gp_kernel = 1**2*RBF(length_scale=[0, 0.01, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel()
gpr = GaussianProcessRegressor(kernel=gp_kernel, n_restarts_optimizer=2, normalize_y=True)
gpr.fit(X, y)
X1 = np.vstack((X, np.array([18, 3, 5])))
y_pred, sigma = gpr.predict(X1, return_std=True)
print(y_pred)
plt.plot(range(len(X)), y)
plt.plot(range(len(X1)), y_pred)
plt.show()
Если вы посмотрите на X, то увидите, что во втором измерении он явно периодический.Я хочу это указать, поэтому моей первой попыткой было что-то вроде ExpSineSquared([0, 0.2, 0], 6, periodicity_bounds='fixed')
, где я скопировал подход большинства ответов, найденных мной на этот вопрос, и поставил 0 для переменных, для которых ядро не содержит,Но, к сожалению, ExpSineSquared не допускает массив в качестве входных данных для параметра length_scale
.
Поэтому я попытался умножить его на что-то, что позволяет это, например, RBF, и посмотрел на результаты.Это дает мне некоторый прогноз, однако, если мы изменим gp_kernel = 1**2*RBF(length_scale=[0, 0.01, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel()
на gp_kernel = 1**2*RBF(length_scale=[0.01, 0, 0]) * ExpSineSquared(0.02, 6, periodicity_bounds='fixed') + WhiteKernel()
, результат останется точно таким же, что не может быть правильным (первое измерение далеко не периодическое), так что вы ожидаете некоторого худшего илипо крайней мере, другой результат.
Короче говоря: если у вас есть входные данные с несколькими переменными и вы создали ядра, которые содержат некоторые, но не все переменные, как определить, какое ядро содержит какую переменную?