Есть ли способ определить "разнородный" дизайн ядра для включения линейных операторов в регрессию для 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) и обсудим это подробнее там!

Другие вопросы по тегам