Я наткнулся на реализацию с нуля для гауссовских процессов: http://krasserm.github.io/2018/03/19/gaussian-processes/
Там изотропное квадратное экспоненциальное ядро реализовано в numpy.Это выглядит так:
Реализация:
def kernel(X1, X2, l=1.0, sigma_f=1.0):
sqdist = np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T)
return sigma_f**2 * np.exp(-0.5 / l**2 * sqdist)
соответствует реализации Nando de Freitas: https://www.cs.ubc.ca/~nando/540-2013/lectures/gp.py
Однако я не совсем уверен, насколько эта реализация соответствует предоставленной формуле, особенно в части sqdist.На мой взгляд, это неправильно, но работает (и дает те же результаты, что и cdist Сципи с квадратом евклидова расстояния).Почему я думаю, что это неправильно?Если вы умножите умножение двух матриц, вы получите
, что равно скалярной или nxn-матрице для вектора x_i, в зависимости отот того, определяете ли вы x_i как вектор столбцов или нетОднако реализация возвращает вектор nx1 с квадратами.
Я надеюсь, что любой может пролить свет на это.