Path: blob/master/notebooks/book2/12/rjmcmc_rbf/radialSplit.m
1193 views
function [k,mu,M,aSplit,rSplit] = radialSplit(aSplit,rSplit,k,mu,M,delta,x,y,hyper,t,bFunction,sigStar,walkInt,walk);1% PURPOSE : Performs the split move of the reversible jump MCMC algorithm.2% INPUTS : - aSplit: Number of times the split move has been accepted.3% - rSplit: Number of times the split 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% - bFunction: Type of basis function.13% - sigStar: Split/merge move parameter.14% - walk, walkInt: Parameters defining the compact set from which mu is sampled.1516% AUTHOR : Nando de Freitas - Thanks for the acknowledgement :-)17% DATE : 21-01-991819if nargin < 14, error('Not enough input arguments.'); end20[N,d] = size(x); % N = number of data, d = dimension of x.21[N,c] = size(y); % c = dimension of y, i.e. number of outputs.22insideSplit=1;23uB=rand(1);2425% INITIALISE H AND P MATRICES:26% ===========================27invH=zeros(k(t)+1+d,k(t)+1+d,c);28P=zeros(N,N,c);29invHproposal=zeros(k(t)+2+d,k(t)+2+d,c);30Pproposal=zeros(N,N,c);31for i=1:c,32invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));33P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';34end;3536% PROPOSE A BASIS FUNCTION AND SPLIT IT INTO TWO:37% ==============================================38position = unidrnd(length(mu{t}(:,1)),1,1);39proposal = mu{t}(position,:);40uu = rand(size(proposal));41mu1 = proposal - uu*sigStar;42mu2 = proposal + uu*sigStar;4344% CONSTRAIN RANDOM WALK:45% =====================46for i=1:d,47mu1(:,i) = min(mu1(:,i),max(x(:,i))+walk(i));48mu1(:,i) = max(mu1(:,i),min(x(:,i))-walk(i));49mu2(:,i) = min(mu2(:,i),max(x(:,i))+walk(i));50mu2(:,i) = max(mu2(:,i),min(x(:,i))-walk(i));51end52% Reduce the size of M by 1:53proposalPos= d+1+position;54if (proposalPos==d+1+k(t)),55Mproposal = [M(:,1:proposalPos-1)];56else57Mproposal = [M(:,1:proposalPos-1) M(:,proposalPos+1:k(t)+d+1)];58end;59% Add the new split components to m:60Mproposal = [Mproposal feval(bFunction,mu1,x) feval(bFunction,mu2,x)];6162% COMPUTE THE ACCEPTANCE RATIO:63% ============================64for i=1:c,65invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+2+d));66Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal';67end;68Jacobian = sigStar;69ratio= Jacobian * inv(prod(walkInt)) * inv(k(t)+1) * k(t) * inv(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);70for i=2:c,71ratio= ratio * inv(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);72end;73acceptance = min(1,ratio);7475% PERFORM DISTANCE TEST TO ENSURE REVERSIBILITY:76% =============================================77dist1 = zeros(k(t),1);78dist2 = norm(mu1-mu2);79violation =0;80for i=1:k(t),81if i== position,82dist1(i) = inf;83else84dist1(i)=norm(mu1-mu{t}(i,:)); % Euclidean distance;85end;86if dist1(i)<dist2 % Don't accept.87violation=1;88acceptance = 0;89end;90end;9192% APPLY METROPOLIS-HASTINGS STEP:93% ==============================94if (uB<acceptance),95previousMu = mu{t};96if (proposalPos==(1+d+1)),97muTrunc = [previousMu(2:k(t),:)];98elseif (proposalPos==(1+d+k(t))),99muTrunc = [previousMu(1:k(t)-1,:)];100else101muTrunc = [previousMu(1:proposalPos-1-d-1,:); previousMu(proposalPos-d-1+1:k(t),:)];102end;103mu{t+1} = [muTrunc; mu1; mu2];104k(t+1) = k(t)+1;105M=Mproposal;106aSplit=aSplit+1;107else108mu{t+1} = mu{t};109k(t+1) = k(t);110rSplit=rSplit+1;111M=M;112end;113114115116117118119120121122123124125126127128