Path: blob/master/notebooks/book2/12/rjmcmc_rbf/radialRW.m
1193 views
function [k,mu,M,match,aRW,rRW] = radialRW(match,aRW,rRW,k,mu,M,delta,x,y,hyper,t,bFunction,sWalk,walk);1% PURPOSE : Performs the random walk move of the reversible jump MCMC algorithm.2% INPUTS : - match: Number of times a basis function already exists (probability zero in theory).3% For completeness sake, I don't allow for duplicate basis functions here.4% - aRW: Number of times the random walk move has been accepted.5% - rRW: Number of times the random walk move has been rejected.6% - k : Number of basis functions.7% - mu : Basis functions centres.8% - M : Regressors matrix.9% - delta : Signal to noise ratio.10% - x : Input data.11% - y : Target data.12% - hyper: hyperparameters.13% - t : Current time step.14% - bFunction: Type of basis function.15% - walk: Parameter defining the compact set from which mu is sampled.16% - sWalk: Random walk variance.1718% AUTHOR : Nando de Freitas - Thanks for the acknowledgement :-)19% DATE : 21-01-992021if nargin < 14, error('Not enough input arguments.'); end22[N,d] = size(x); % N = number of data, d = dimension of x.23[N,c] = size(y); % c = dimension of y, i.e. number of outputs.24insideRW=1;25uU=rand(1);2627% INITIALISE H AND P MATRICES:28% ===========================29invH=zeros(k(t)+1+d,k(t)+1+d,c);30P=zeros(N,N,c);31invHproposal=zeros(k(t)+1+d,k(t)+1+d,c);32Pproposal=zeros(N,N,c);3334% UPDATE EACH CENTRE:35% ==================36for basis=1:k(t),37for i=1:c,38invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));39P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';40end;4142% PROPOSE AND CONSTRAIN RANDOM WALK:43% =================================44proposal = mu{t}(basis,:) + sqrt(sWalk)*randn(size(mu{t}(basis,:)));45for i=1:d,46proposal(:,i) = min(proposal(:,i),max(x(:,i))+walk(i));47proposal(:,i) = max(proposal(:,i),min(x(:,i))-walk(i));48end;4950% CHECK IF THE PROPOSED CENTRE ALREADY EXISTS:51% ===========================================52match1=0;53notEnded=1;54i=1;55while ((match1==0)&(notEnded==1)),56if (mu{t}(i,:)==proposal),57match1=1;58elseif (i<k(t)),59i=i+1;60else61notEnded=0;62end;63end;64match2=0;65notEnded=1;66i=1;67if basis>1,68match2=0;69notEnded=1;70i=1;71while ((match2==0)&(notEnded==1)),72if (mu{t+1}(i,:)==proposal),73match2=1;74elseif (i<basis-1),75i=i+1;76else77notEnded=0;78end;79end;80end;81if (match1>0),82match=match+1;83mu{t+1}(basis,:)=mu{t}(basis,:);84elseif (match2>0),85match=match+1;86mu{t+1}(basis,:)=mu{t}(basis,:);87else88% IF IT DOESN'T EXIST, PERFORM AN UPDATE MOVE:89% ===========================================90Mproposal = M;91Mproposal(:,d+1+basis) = feval(bFunction,proposal,x);92for i=1:c,93invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+1+d));94Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal';95end;96ratio = 1;97for i=1:c,98ratio = ratio*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));99end;100acceptance = min(1,ratio);101if (uU<acceptance),102mu{t+1}(basis,:) = proposal;103M=Mproposal;104aRW=aRW+1;105else106mu{t+1}(basis,:) = mu{t}(basis,:);107rRW=rRW+1;108M=M;109end;110end;111end;112k(t+1) = k(t); % Don't change dimension.113M = M; % Return the last value of M.114115116117118119120121122123124125126127