Я хотел бы вычислить определитель ковариационной матрицы регрессии GP в GPFlow. Я предполагаю, что могу получить ковариационную матрицу с помощью этой функции:
GPModel.predict_f_full_cov
Эта функция была предложена здесь:
https://gpflow.readthedocs.io/en/develop/notebooks/regression.html
Однако я понятия не имею, как использовать эту функцию или что она возвращает. Мне нужно знать функцию, которая возвращает ковариационную матрицу для всей моей модели, а затем мне нужно знать, как вычислить ее определитель.
После некоторых усилий я выяснил, как поставить вgnett_f_full_cov несколько интересующих меня моментов, как мы видим здесь:
c = m.predict_f_full_cov(np.array([[.2],[.4],[.6],[.8]])))
Это вернуло два массива, первый из которых является средним значением предсказанной функции для точек, которые я запрашивал вдоль оси x. Второй массив немного загадочный. Я предполагаю, что это ковариационная матрица. Я вытащил это, используя это:
covMatrix = m.predict_f_full_cov(np.array([[.2],[.4],[.6],[.8]]))[1][0]
Затем я посмотрел, как вычислить определитель, вот так:
x = np.linalg.det(covMatrix)
Затем я вычислил логарифм, чтобы получить энтропию для ковариационной матрицы:
print(-10*math.log(np.linalg.det(covMatrix)))
Я запускал это дважды, используя два разных набора данных. У первого был высокий уровень шума, у второго - низкий уровень шума. Как ни странно, энтропия возросла для набора данных шума low . Я в растерянности.
Я обнаружил, что если я просто вычисляю ковариационную матрицу для небольшой области, которая должна быть линейной, то увеличение и уменьшение шума не даст ожидаемого результата. Кроме того, если я регрессирую GP к большому количеству пунктов, детерминант идет к 0.0.
Вот код, который я использую:
import gpflow
import numpy as np
N = 300
noiseSize = 0.01
X = np.random.rand(N,1)
Y = np.sin(12*X) + 0.66*np.cos(25*X) + np.random.randn(N,1)*noiseSize + 3
k = gpflow.kernels.Matern52(1, lengthscales=0.3)
m = gpflow.models.GPR(X, Y, kern=k)
m.likelihood.variance = 0.01
aRange = np.linspace(0.1,0.9,200)
newRange = []
for point in aRange:
newRange.append([point])
covMatrix = m.predict_f_full_cov(newRange)[1][0]
import math
print("Determinant: " + str(np.linalg.det(covMatrix)))
print(-10*math.log(np.linalg.det(covMatrix)))