Разложение Холецкого работает только для положительно определенных матриц. Таким образом, операция разложения Холецкого не выполняется, если входной аргумент не является положительно определенным, или, что эквивалентно, другими словами, когда входная матрица имеет какие-либо отрицательные собственные значения. Когда это происходит, часто бывает полезно вычислить собственные значения матрицы ядра (например, np.linalg.eigvals(tf.Session().run(k.K(X)))
).
Существуют два разных случая, по которым собственные значения матрицы ядра могут быть отрицательными: Наиболее распространенная причина «почти положительные» отрицательные собственные значения из-за проблем с конечной числовой точностью - вот почему мы обычно добавляем матрицу джиттера (диагональная матрица с 10 ^ (- 6) на диагонали) перед вычислением разложения Холецкого в GPflow. Вторая причина заключается в том, что существует ошибка в вычислении матрицы ядра. Это имеет место здесь:
X = np.linspace(0, 10, 11)[:,None] # dummy 1D data matrix
session = gpflow.get_default_session()
K = session.run(k.K(X))
np.linalg.eigvals(K)
выводит
array([-9.00767547, 1.78835489, 1.51465032, 1.18585391, 0.97478308,
0.79231475, 0.67625953, 0.5866432 , 0.52938737, 0.4691057 ,
0.49032271])
В то время как сумма двух ядер (положительно определенных матриц) всегда дает действительное ядро (другую положительно определенную матрицу), это свойство не выполняется для разности в общем случае .
ОБНОВЛЕНИЕ: В очень специфических c случаях различие двух ядер может быть другим допустимым положительно определенным ядро. Это относится к конструкции Durrande et al. Для periodi c и aperiodi c ядер класса Matern . Их конструкция специфична c для ядер семейства Matern и отличается от общей реализации ядер periodi c на основе любого стационарного ядра, которое было реализовано в gpflow.kernels.Periodic
.
GPflow не предоставляет Durrande et al. / periodi c Ядра Matern из коробки, хотя было бы легко реализовать их поверх GPflow, и проект GPflow был бы рад рассмотреть запрос на извлечение, который добавляет эти ядра в базу кода GPflow.