Path: blob/master/notebooks/book2/12/rjmcmc_rbf/radialMerge.m
1193 views
function [k,mu,M,aMerge,rMerge] = radialMerge(aMerge,rMerge,k,mu,M,delta,x,y,hyper,t,bFunction,sigStar,walkInt);1% PURPOSE : Performs the split move of the reversible jump MCMC algorithm.2% INPUTS : - aMerge: Number of times the merge move has been accepted.3% - rMerge: Number of times the merge 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% - t : Current time step.11% - bFunction: Type of basis function.12% - sigStar: Split/merge move parameter.13% - walkInt: Parameter defining the compact set from which mu is sampled.1415% AUTHOR : Nando de Freitas - Thanks for the acknowledgement :-)16% DATE : 21-01-991718if nargin < 12, error('Not enough input arguments.'); end19[N,d] = size(x); % N = number of data, d = dimension of x.20[N,c] = size(y); % c = dimension of y, i.e. number of outputs.21insideMerge=1;22uD=rand(1);2324% INITIALISE H AND P MATRICES:25% ===========================26invH=zeros(k(t)+1+d,k(t)+1+d,c);27P=zeros(N,N,c);28invHproposal=zeros(k(t)+d,k(t)+d,c);29Pproposal=zeros(N,N,c);30for i=1:c,31invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));32P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';33end;3435% PROPOSE FIRST BASIS FUNCTION:36% ============================37position = unidrnd(length(mu{t}(:,1)),1,1);38mu1 = mu{t}(position,:);39dist = zeros(k(t),1);40for i=1:k(t),41if i== position,42dist(i) = inf;43else44dist(i)=norm(mu1-mu{t}(i,:)); % Euclidean distance;45end;46end;4748% PROPOSE SECOND BASIS FUNCTION:49% =============================50position2 = find(dist == min(dist));51mu2 = mu{t}(position2,:);52mumg = .5*(mu1 + mu2);5354% extract components:55proposalPos1 = position + d+1;56if (proposalPos1==d+1+k(t)),57Mproposal = [M(:,1:proposalPos1-1)];58else59Mproposal = [M(:,1:proposalPos1-1) M(:,proposalPos1+1:k(t)+d+1)];60end;61if position2>position,62proposalPos2 = position2 + d+1;63if (proposalPos2==d+1+k(t)),64Mproposal = [Mproposal(:,1:proposalPos2-2)];65else66Mproposal = [Mproposal(:,1:proposalPos2-2) Mproposal(:,proposalPos2:k(t)+d)];67end;68elseif position2<position,69proposalPos2 = position2 + d+1;70Mproposal = [Mproposal(:,1:proposalPos2-1) Mproposal(:,proposalPos2+1:k(t)+d)];71else72error('Something wrong with merge move');73end;74% add merged component:75Mproposal = [Mproposal feval(bFunction,mumg,x)];76for i=1:c,77invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+d));78Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal';79end;8081% PERFORM A MERGE MOVE:82% ====================83Jacobian = inv(sigStar);84ratio= Jacobian* prod(walkInt) * k(t) * inv(k(t)-1) * 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);85for i=2:c,86ratio= 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);87end;88acceptance = min(1,ratio);89if min(dist)<2*sigStar90acceptance = 0; % To ensure reversibility.91end;9293% METROPOLIS-HASTINGS STEP:94% ========================95if (uD<acceptance),96previousMu = mu{t};97if (proposalPos1==(1+d+1)),98muTrunc = [previousMu(2:k(t),:)];99elseif (proposalPos1==(1+d+k(t))),100muTrunc = [previousMu(1:k(t)-1,:)];101else102muTrunc = [previousMu(1:proposalPos1-1-d-1,:); previousMu(proposalPos1-d-1+1:k(t),:)];103end;104if position2>position,105if (proposalPos2==(1+d+k(t))),106muTrunc = [muTrunc(1:k(t)-2,:)];107else108muTrunc = [muTrunc(1:proposalPos2-1-d-2,:); muTrunc(proposalPos2-d-1:k(t)-1,:)];109end;110elseif position2<position,111if (proposalPos2==(1+d+1)),112muTrunc = [muTrunc(2:k(t)-1,:)];113else114muTrunc = [muTrunc(1:proposalPos2-1-d-1,:); muTrunc(proposalPos2-d-1+1:k(t)-1,:)];115end;116else117error('Something wrong with merge move');118end;119mu{t+1} = [muTrunc; mumg];120k(t+1) = k(t)-1;121M=Mproposal;122aMerge=aMerge+1;123else124mu{t+1} = mu{t};125k(t+1) = k(t);126rMerge=rMerge+1;127M=M;128end;129130131132133134135136137138139140141