Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
probml
GitHub Repository: probml/pyprobml
Path: blob/master/notebooks/book2/12/rjmcmc_rbf/radialSplit.m
1193 views
1
function [k,mu,M,aSplit,rSplit] = radialSplit(aSplit,rSplit,k,mu,M,delta,x,y,hyper,t,bFunction,sigStar,walkInt,walk);
2
% PURPOSE : Performs the split move of the reversible jump MCMC algorithm.
3
% INPUTS : - aSplit: Number of times the split move has been accepted.
4
% - rSplit: Number of times the split move has been rejected.
5
% - k : Number of basis functions.
6
% - mu : Basis functions centres.
7
% - M : Regressors matrix.
8
% - delta : Signal to noise ratio.
9
% - x : Input data.
10
% - y : Target data.
11
% - hyper: hyperparameters.
12
% - t : Current time step.
13
% - bFunction: Type of basis function.
14
% - sigStar: Split/merge move parameter.
15
% - walk, walkInt: Parameters defining the compact set from which mu is sampled.
16
17
% AUTHOR : Nando de Freitas - Thanks for the acknowledgement :-)
18
% DATE : 21-01-99
19
20
if nargin < 14, error('Not enough input arguments.'); end
21
[N,d] = size(x); % N = number of data, d = dimension of x.
22
[N,c] = size(y); % c = dimension of y, i.e. number of outputs.
23
insideSplit=1;
24
uB=rand(1);
25
26
% INITIALISE H AND P MATRICES:
27
% ===========================
28
invH=zeros(k(t)+1+d,k(t)+1+d,c);
29
P=zeros(N,N,c);
30
invHproposal=zeros(k(t)+2+d,k(t)+2+d,c);
31
Pproposal=zeros(N,N,c);
32
for i=1:c,
33
invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));
34
P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';
35
end;
36
37
% PROPOSE A BASIS FUNCTION AND SPLIT IT INTO TWO:
38
% ==============================================
39
position = unidrnd(length(mu{t}(:,1)),1,1);
40
proposal = mu{t}(position,:);
41
uu = rand(size(proposal));
42
mu1 = proposal - uu*sigStar;
43
mu2 = proposal + uu*sigStar;
44
45
% CONSTRAIN RANDOM WALK:
46
% =====================
47
for i=1:d,
48
mu1(:,i) = min(mu1(:,i),max(x(:,i))+walk(i));
49
mu1(:,i) = max(mu1(:,i),min(x(:,i))-walk(i));
50
mu2(:,i) = min(mu2(:,i),max(x(:,i))+walk(i));
51
mu2(:,i) = max(mu2(:,i),min(x(:,i))-walk(i));
52
end
53
% Reduce the size of M by 1:
54
proposalPos= d+1+position;
55
if (proposalPos==d+1+k(t)),
56
Mproposal = [M(:,1:proposalPos-1)];
57
else
58
Mproposal = [M(:,1:proposalPos-1) M(:,proposalPos+1:k(t)+d+1)];
59
end;
60
% Add the new split components to m:
61
Mproposal = [Mproposal feval(bFunction,mu1,x) feval(bFunction,mu2,x)];
62
63
% COMPUTE THE ACCEPTANCE RATIO:
64
% ============================
65
for i=1:c,
66
invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+2+d));
67
Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal';
68
end;
69
Jacobian = sigStar;
70
ratio= 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);
71
for i=2:c,
72
ratio= 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);
73
end;
74
acceptance = min(1,ratio);
75
76
% PERFORM DISTANCE TEST TO ENSURE REVERSIBILITY:
77
% =============================================
78
dist1 = zeros(k(t),1);
79
dist2 = norm(mu1-mu2);
80
violation =0;
81
for i=1:k(t),
82
if i== position,
83
dist1(i) = inf;
84
else
85
dist1(i)=norm(mu1-mu{t}(i,:)); % Euclidean distance;
86
end;
87
if dist1(i)<dist2 % Don't accept.
88
violation=1;
89
acceptance = 0;
90
end;
91
end;
92
93
% APPLY METROPOLIS-HASTINGS STEP:
94
% ==============================
95
if (uB<acceptance),
96
previousMu = mu{t};
97
if (proposalPos==(1+d+1)),
98
muTrunc = [previousMu(2:k(t),:)];
99
elseif (proposalPos==(1+d+k(t))),
100
muTrunc = [previousMu(1:k(t)-1,:)];
101
else
102
muTrunc = [previousMu(1:proposalPos-1-d-1,:); previousMu(proposalPos-d-1+1:k(t),:)];
103
end;
104
mu{t+1} = [muTrunc; mu1; mu2];
105
k(t+1) = k(t)+1;
106
M=Mproposal;
107
aSplit=aSplit+1;
108
else
109
mu{t+1} = mu{t};
110
k(t+1) = k(t);
111
rSplit=rSplit+1;
112
M=M;
113
end;
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128