radialSplit.m
上传用户:fsbooksir
上传日期:2013-10-19
资源大小:14k
文件大小:3k
源码类别:

matlab例程

开发平台:

Matlab

  1. function [k,mu,M,aSplit,rSplit] = radialSplit(aSplit,rSplit,k,mu,M,delta,x,y,hyper,t,bFunction,sigStar,walkInt,walk);
  2. %
  3. if nargin < 14, error('Not enough input arguments.'); end
  4. [N,d] = size(x);      % N = number of data, d = dimension of x.
  5. [N,c] = size(y);      % c = dimension of y, i.e. number of outputs.
  6. insideSplit=1;
  7. uB=rand(1);
  8. % INITIALISE H AND P MATRICES:
  9. % ===========================
  10. invH=zeros(k(t)+1+d,k(t)+1+d,c);
  11. P=zeros(N,N,c);
  12. invHproposal=zeros(k(t)+2+d,k(t)+2+d,c);
  13. Pproposal=zeros(N,N,c);
  14. for i=1:c,
  15.   invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));
  16.   P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';
  17. end;
  18. % PROPOSE A BASIS FUNCTION AND SPLIT IT INTO TWO:
  19. % ==============================================
  20. position = unidrnd(length(mu{t}(:,1)),1,1);
  21. proposal = mu{t}(position,:);
  22. uu = rand(size(proposal));
  23. mu1 = proposal - uu*sigStar;
  24. mu2 = proposal + uu*sigStar;
  25. % CONSTRAIN RANDOM WALK:
  26. % =====================
  27. for i=1:d,
  28.   mu1(:,i) = min(mu1(:,i),max(x(:,i))+walk(i));
  29.   mu1(:,i) = max(mu1(:,i),min(x(:,i))-walk(i));
  30.   mu2(:,i) = min(mu2(:,i),max(x(:,i))+walk(i));
  31.   mu2(:,i) = max(mu2(:,i),min(x(:,i))-walk(i));
  32. end
  33. % Reduce the size of M by 1:
  34. proposalPos= d+1+position;
  35. if (proposalPos==d+1+k(t)),
  36.   Mproposal = [M(:,1:proposalPos-1)];    
  37. else
  38.   Mproposal = [M(:,1:proposalPos-1) M(:,proposalPos+1:k(t)+d+1)];      
  39. end;
  40. % Add the new split components to m:
  41. Mproposal = [Mproposal feval(bFunction,mu1,x) feval(bFunction,mu2,x)];
  42. % COMPUTE THE ACCEPTANCE RATIO:
  43. % ============================
  44. for i=1:c,
  45.   invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+2+d)); 
  46.   Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal'; 
  47. end;
  48. Jacobian = sigStar;
  49. 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);     
  50. for i=2:c,
  51.   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); 
  52. end;
  53. acceptance = min(1,ratio);   
  54. % PERFORM DISTANCE TEST TO ENSURE REVERSIBILITY:
  55. % =============================================
  56. dist1 = zeros(k(t),1);
  57. dist2 = norm(mu1-mu2); 
  58. violation =0;
  59. for i=1:k(t),
  60.   if i== position,
  61.     dist1(i) = inf; 
  62.   else
  63.     dist1(i)=norm(mu1-mu{t}(i,:)); % Euclidean distance;
  64.   end;
  65.   if dist1(i)<dist2     % Don't accept.
  66.     violation=1;
  67.     acceptance = 0;
  68.   end;
  69. end; 
  70. % APPLY METROPOLIS-HASTINGS STEP:
  71. % ==============================
  72. if (uB<acceptance),
  73.   previousMu = mu{t};
  74.   if (proposalPos==(1+d+1)),
  75.     muTrunc = [previousMu(2:k(t),:)]; 
  76.   elseif (proposalPos==(1+d+k(t))),
  77.     muTrunc = [previousMu(1:k(t)-1,:)];
  78.   else
  79.     muTrunc = [previousMu(1:proposalPos-1-d-1,:); previousMu(proposalPos-d-1+1:k(t),:)];
  80.   end;
  81.   mu{t+1} = [muTrunc; mu1; mu2];
  82.   k(t+1) = k(t)+1;
  83.   M=Mproposal;
  84.   aSplit=aSplit+1;
  85. else
  86.   mu{t+1} = mu{t};
  87.   k(t+1) = k(t);
  88.   rSplit=rSplit+1;
  89.   M=M;
  90. end;