Гауссовская регрессия процесса с несколькими переменными: адаптация ядер - PullRequest
0 голосов
/ 06 февраля 2019

Хорошо, я знаю, что этот вопрос уже задавался много, но я не могу найти никакого объяснения, хорошего ответа на него.Сам мой вопрос прост: при выполнении регрессии гауссовского процесса с множественными переменными 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(), результат останется точно таким же, что не может быть правильным (первое измерение далеко не периодическое), так что вы ожидаете некоторого худшего илипо крайней мере, другой результат.

Короче говоря: если у вас есть входные данные с несколькими переменными и вы создали ядра, которые содержат некоторые, но не все переменные, как определить, какое ядро ​​содержит какую переменную?

1 Ответ

0 голосов
/ 19 февраля 2019

Я обнаружил, что пакет George очень полезен в этом случае.Во-первых, вы можете использовать lot больше анизотропных ядер, так что это большой плюс.Во-вторых, вы можете указать, на какое измерение они действуют.Например, ExpSquaredKernel(length_scale=1, ndim=4, axes=1) - это RBF-ядро, которое действует на второе измерение (см. Параметр axes).данные, которые состоят из 4 измерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...