3D-Гауссова регрессия процесса - PullRequest
0 голосов
/ 27 июня 2018

Я очень новичок в гауссовских процессах и Python. Я пытаюсь создать очень простую гауссовскую регрессию для 3d-модели.

У меня есть очень простой код Python для функции:

import numpy as np

def exponential_cov(x, y, params):

    return params[0] * np.exp( -0.5 * params[1] * np.subtract.outer(x, y)**2)

def conditional(x_new, x, y, params):

    B = exponential_cov(x_new, x, params)
    C = exponential_cov(x, x, params)
    A = exponential_cov(x_new, x_new, params)
    mu = np.linalg.inv(C).dot(B.T).T.dot(y)
    sigma = A - B.dot(np.linalg.inv(C).dot(B.T))
    return(mu.squeeze(), sigma.squeeze())

import matplotlib.pylab as plt

# GP PRIOR
tu = [1, 10]
Si_tu = exponential_cov(0, 0, tu)
xpts = np.arange(-5, 5, step=0.01)

plt.errorbar(xpts, np.zeros(len(xpts)), yerr=Si_tu, capsize=0, color='#95daed', alpha=0.5, label='error')  #error
plt.plot(xpts, np.zeros(len(xpts)), linestyle='dashed', color='#3105b2', linewidth=2.5, label='mu'); #mu

# GP FOR 1ST POINT
x = [1.]
y = np.sin(x)+np.cos(np.sqrt(15)*x)

Si_1 = exponential_cov(x, x, tu)

def predict(x, data, kernel, params, sigma, t):

    k = [kernel(x, y, params) for y in data]
    Sinv = np.linalg.inv(sigma)
    y_pred = np.dot(k, Sinv).dot(t)
    sigma_new = kernel(x, x, params) - np.dot(k, Sinv).dot(k)
    return y_pred, sigma_new

x_pred = np.linspace(-5, 5, 1000) #change step here!!
print "x_pred="
print(x_pred)
predictions = [predict(i, x, exponential_cov, tu, Si_1, y) for i in x_pred]
y_pred, sigmas = np.transpose(predictions)
print "y_pred ="
print(y_pred )
print "sigmas ="
print(sigmas )


# GP FOR 2ND POINT
m, s = conditional([-1], x, y, tu)
y2 = np.sin(-1)+np.cos(np.sqrt(15)*(-1))

x.append(-1)
y=np.append(y,y2)
Si_2 = exponential_cov(x, x, tu)
predictions = [predict(i, x, exponential_cov, tu, Si_2, y) for i in x_pred]
y_pred, sigmas = np.transpose(predictions)
print "y_pred ="
print(y_pred )
print "sigmas ="
print(sigmas )

Используя этот код, я получаю очень хорошие результаты подгонки для функции np.sin(x) + np.cos(np.sqrt(15) * x), но я действительно хочу попробовать тот же гауссовский процесс для функции Z = np.sin(2*X) * np.cos(2*Y) / 2.

Я знаю, что идея в основном та же, но я не могу адаптировать свой код Python для ввода [x, y], чтобы получить z.

Я буду очень признателен за вашу помощь, советы или ссылки!

1 Ответ

0 голосов
/ 14 августа 2018

В предыдущем случае ввод вашей функции был 1-D, а затем новая функция была 2-D. Поэтому вам нужно изменить ковариационную функцию, например, использовать ядро ​​на основе ard, пожалуйста, обратитесь к кулинарной книге для ядра . Кроме того, вы можете сделать изотропное ядро ​​для 2-D, просто убедитесь, что выбрана подходящая функция расстояния (например, L2-норма) и единственная шкала длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...