Sophie

Sophie

distrib > Mageia > 6 > x86_64 > media > core-release > by-pkgid > 44a57478e44aacd6feb6b6f780eab143 > files > 306

ocaml-gpr-devel-1.2.1-2.mga6.x86_64.rpm

% Octave script for testing Gaussian process regression results
%
% Copyright (C) 2009-  Markus Mottl
% email: markus.mottl@gmail.com
% WWW:   http://www.ocaml.info

format long

global log_sf2;

load data/inputs
load data/targets
load data/inducing_points
load data/sigma2
load data/log_ell
load data/log_sf2

global epsilon = 1e-6;
sigma = sqrt(sigma2);
global log_sf2 = log_sf2;
global log_sf2_e = log_sf2 + epsilon;
global inv_ell2 = exp(-2 * log_ell);
global inv_ell2_e = exp(-2*(log_ell + epsilon));
log_inv_ell2 = log(inv_ell2);
[dim, N] = size(inputs);
[dim, M] = size(inducing_points);

function res = eval_rbf2(r2, a, b)
  res = exp(a + -0.5 * b * r2);
end

function res = kf(x, y, a, b)
  [dim, n1] = size(x);
  n2 = size(y, 2);
  r2 = repmat(sum(x' .* x', 2), 1, n2) - 2 * x' * y + repmat(sum(y' .* y', 2)', n1, 1);
  res = eval_rbf2(r2, a, b);
  [dim, N] = size(res);
  if (dim == N)
    jitter = 1e-6;
    res = res + jitter*eye(N);
  endif
  res = res';
end

function res = k(x, y)
  global log_sf2 inv_ell2;
  res = kf(x, y, log_sf2, inv_ell2);
end

function res = k_e(x, y)
  global log_sf2 log_sf2_e inv_ell2 inv_ell2_e epsilon;
  res = kf(x, y, log_sf2, inv_ell2_e);
end

function res = kf_diag(x, a, b)
  r2 = zeros(size(x, 2), 1);
  res = eval_rbf2(r2, a, b);
end

function res = k_diag(x)
  global log_sf2 inv_ell2;
  res = kf_diag(x, log_sf2, inv_ell2);
end

function res = k_diag_e(x)
  global log_sf2 log_sf2_e inv_ell2 inv_ell2_e epsilon;
  res = kf_diag(x, log_sf2, inv_ell2_e);
end


%%%%%%%%%%%%%%%%%%%% Covariance matrices %%%%%%%%%%%%%%%%%%%%

Km = k(inducing_points, inducing_points);
Km_e = k_e(inducing_points, inducing_points);
dKm = (Km_e - Km) / epsilon;

Knm = k(inducing_points, inputs);
Knm_e = k_e(inducing_points, inputs);
dKnm = (Knm_e - Knm) / epsilon;

Kn_diag = k_diag(inputs);
Kn_e_diag = k_diag_e(inputs);
dKn_diag = (Kn_e_diag - Kn_diag) / epsilon;


%%%%%%%%%%%%%%%%%%%% Main definitions %%%%%%%%%%%%%%%%%%%%

y = targets;

cholKm = chol(Km);
V = Knm / cholKm;

r = Kn_diag - sum(V .^ 2, 2);
s = r + sigma2;
is = ones(size(s, 1), 1) ./ s;
is_2 = sqrt(is);

inv_lam_sigma = repmat(is_2, 1, size(Knm, 2));

Knm_ = inv_lam_sigma .* Knm;

[Q, R] = qr([Knm_; chol(Km)], 1);
SF = diag(sign(diag(R)));
Q = Q(1:N,1:end)*SF;
R = SF*R;
S = inv_lam_sigma .* Q / R';

B = Km + Knm_' * Knm_;

%%%%%%%%%%%%%%%%%%%% Standard %%%%%%%%%%%%%%%%%%%%

%%%%%% Log evidence

l1 = ...
  -0.5*(...
    2*sum(log(diag(R))) - 2*sum(log(diag(cholKm))) + sum(log(s)) ...
    + N * log(2*pi))

y_ = is_2 .* y;
t = S'*y;
u = y_ - Q*(Q'*y_);
l2 = -0.5*(u'*y_)

l = l1 + l2


%%%%%% Log evidence derivative

T = inv(Km) - inv(B);

U = V / cholKm';

v1 = is .* (ones(size(Q, 1), 1) - sum(Q .^ 2, 2));
U1 = repmat(sqrt(v1), 1, size(U, 2)) .* U;
W1 = T - U1'*U1;
X1 = S - repmat(v1, 1, size(U, 2)) .* U;

dl1 = -0.5*(v1' * dKn_diag - trace(W1'*dKm)) - trace(X1'*dKnm)

w = is_2 .* u;
v2 = w .* w;
U2 = repmat(w, 1, size(U, 2)) .* U;
W2 = t*t' - U2'*U2;
X2 = w*t' - repmat(v2, 1, size(U, 2)) .* U;

dl2 = 0.5*(v2' * dKn_diag - trace(W2'*dKm)) + trace(X2'*dKnm)

dl = dl1 + dl2


%%%%%% Log evidence derivative wrt. noise

dls1 = -0.5*sum(v1)
dls2 = 0.5*sum(v2)
dls = dls1 + dls2


%%%%%%%%%%%%%%%%%%%% Variational %%%%%%%%%%%%%%%%%%%%

%%%%%% Log evidence

vl1 = l1 + -0.5*is'*r
vl = vl1 + l2


%%%%%% Log evidence derivative

vv1 = is .* (2*ones(size(Q, 1), 1) - is .* r - sum(Q .* 2, 2));
vU1 = repmat(sqrt(vv1), 1, size(U, 2)) .* U;
vW1 = T - vU1'*vU1;
vX1 = S - repmat(vv1, 1, size(U, 2)) .* U;

vdl1 = -0.5*(vv1' * dKn_diag - trace(vW1'*dKm)) - trace(vX1'*dKnm)
vdl = vdl1 + dl2


%%%%%% Log evidence derivative wrt. noise

vdls1 = -0.5*(sum(vv1) - sum(is))
vdls = vdls1 + dls2


%%%%%%%%%%%%%%%%%%%%%%%%% Ed Snelson's stuff %%%%%%%%%%%%%%%%%%%%%%%%%

hyp = [log_inv_ell2; log_sf2; log(sigma2)];
ew = [reshape(inducing_points', M*dim, 1); hyp];
[eds_neg_log_likelihood, dfw] = spgp_lik(ew, y, inputs', M);
eds_evidence = -eds_neg_log_likelihood
eds_dlog_ell = -(-dfw(end - 2) * 2)
eds_dlog_sf2 = -dfw(end - 1)
eds_dsigma2 = -dfw(end) / sigma2