Есть ли способ определить "разнородный" дизайн ядра для включения линейных операторов в регрессию для GPflow (или GPytorch/GPy/...)?
Я пытаюсь выполнить регрессию GP с линейными операторами, как описано, например, в этой статье Särkkä: https://users.aalto.fi/%7Essarkka/pub/spde.pdf В этом примере мы можем видеть из уравнения (8), что мне нужна другая функция ядра для четырех блоков ковариации (обучающих и тестовых данных) в полной матрице ковариации.
Это определенно возможно и правильно, но я хотел бы включить это в определение ядра (желательно) GPflow, или GPytorch, GPy и т.п.
Однако в документации по разработке ядра в Gpflow единственная возможность - определить ковариационную функцию, которая действует на все блоки ковариации. В принципе, описанный выше метод должен быть простым, чтобы добавить себя (выражения функций ядра могут быть получены аналитически), но я не вижу никакого способа включения "гетерогенных" функций ядра в классы регрессии или ядра. Я пытался проконсультироваться с другими пакетами, такими как Gpytorch и Gpy, но опять же, дизайн ядра, похоже, не позволяет этого.
Возможно, мне здесь что-то не хватает, может быть, я недостаточно знаком с базовой реализацией, чтобы оценить это, но если кто-то делал это раньше или видит (что должно быть достаточно простым?) Возможность реализации, я был бы счастлив выяснить.
Заранее большое спасибо за ответ!
С уважением
1 ответ
Это должно быть достаточно просто, хотя и требует создания собственного ядра. По сути, вам нужно ядро, которое может знать для каждого входа, что такое линейный оператор для соответствующего выхода (будь то функция наблюдения / тождества, интегральное наблюдение, производное наблюдение и т. Д.). Вы можете добиться этого, включив дополнительный столбец во входную матрицу
X
, аналогично тому, как это делается для
gpflow.kernels.Coregion
ядро (см. этот блокнот). Затем вам нужно будет определить новое ядро с
K
и
K_diag
методы, которые для каждого типа линейного оператора находят соответствующие строки во входной матрице и передают их в соответствующую ковариационную функцию (используя
tf.dynamic_partition
и
tf.dynamic_stitch
, это используется очень похожим образом в GPflow SwitchedLikelihood
класс).
Полная реализация, вероятно, займет полдня или около того, что выходит за рамки того, что я могу здесь сделать, но я надеюсь, что это полезный начальный указатель, и вы очень можете присоединиться к слабину GPflow (ссылка для приглашения в README GPflow) и обсудим это подробнее там!