Path: blob/master/notebooks/book2/12/rjmcmc_rbf/radialDeath.m
1193 views
function [k,mu,M,aDeath,rDeath] = radialDeath(aDeath,rDeath,k,mu,M,delta,x,y,hyper,t,nabla);1% PURPOSE : Performs the death move of the reversible jump MCMC algorithm.2% INPUTS : - aDeath: Number of times the death move has been accepted.3% - rDeath: Number of times the death move has been rejected.4% - k : Number of basis functions.5% - mu : Basis functions centres.6% - M : Regressors matrix.7% - delta : Signal to noise ratio.8% - x : Input data.9% - y : Target data.10% - hyper: hyperparameters.11% - t : Current time step.12% - nabla: Hyperparameter for k.1314% AUTHOR : Nando de Freitas - Thanks for the acknowledgement :-)15% DATE : 21-01-991617if nargin < 11, error('Not enough input arguments.'); end18[N,d] = size(x); % N = number of data, d = dimension of x.19[N,c] = size(y); % c = dimension of y, i.e. number of outputs.20insideDeath=1;21uD=rand(1);2223% INITIALISE H AND P MATRICES:24% ===========================25invH=zeros(k(t)+1+d,k(t)+1+d,c);26P=zeros(N,N,c);27invHproposal=zeros(k(t)+d,k(t)+d,c);28Pproposal=zeros(N,N,c);29for i=1:c,30invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));31P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';32end;3334% CHOOSE UNIFORMLY A BASIS FUNCTION TO BE DELETED:35% ===============================================36proposalPos= d+1+unidrnd(length(mu{t}(:,1)),1,1);37if (proposalPos==d+1+k(t)),38Mproposal = [M(:,1:proposalPos-1)];39else40Mproposal = [M(:,1:proposalPos-1) M(:,proposalPos+1:k(t)+d+1)];41end;42for i=1:c,43invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+d));44Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal';45end;4647% PERFORM A DEATH MOVE:48% ====================49ratio= k(t) * sqrt(delta(t,1)) * sqrt((det(invH(:,:,1)))/(det(invHproposal(:,:,1)))) * ((hyper.gamma+y(:,1)'*P(:,:,1)*y(:,1))/(hyper.gamma + y(:,1)'*Pproposal(:,:,1)*y(:,1)))^((hyper.v+N)/2);50for i=2:c,51ratio= ratio * sqrt(delta(t,i)) * sqrt((det(invH(:,:,i)))/(det(invHproposal(:,:,i)))) * ((hyper.gamma+y(:,i)'*P(:,:,i)*y(:,i))/(hyper.gamma + y(:,i)'*Pproposal(:,:,i)*y(:,i)))^((hyper.v+N)/2);52end;53acceptance = min(1,ratio);54if (uD<acceptance),55previousMu = mu{t};56if (proposalPos==(1+d+1)),57mu{t+1} = [previousMu(2:k(t),:)];58elseif (proposalPos==(1+d+k(t))),59mu{t+1} = [previousMu(1:k(t)-1,:)];60else61mu{t+1} = [previousMu(1:proposalPos-1-d-1,:); previousMu(proposalPos-d-1+1:k(t),:)];62end;63k(t+1) = k(t)-1;64M=Mproposal;65aDeath=aDeath+1;66else67mu{t+1} = mu{t};68k(t+1) = k(t);69rDeath=rDeath+1;70M=M;71end;72737475767778798081828384