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

matlab例程

开发平台:

Matlab

  1. function [k,mu,M,match,aUpdate,rUpdate] = radialUpdate(match,aUpdate,rUpdate,k,mu,M,delta,x,y,hyper,t,bFunction,walkInt,walk);
  2. % PURPOSE :
  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. insideUpdate=1;
  7. uU=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)+1+d,k(t)+1+d,c);
  13. Pproposal=zeros(N,N,c);
  14. proposal=zeros(1,d);
  15. % UPDATE EACH CENTRE:
  16. % ==================   
  17. if k(t)==0
  18.   mu{t+1}=mu{t};   
  19. end;
  20. for basis=1:k(t),
  21.   for i=1:c,
  22.     invH(:,:,i) = (M'*M + (1/delta(t,i))*eye(k(t)+1+d));
  23.     P(:,:,i) = eye(N) - M*inv(invH(:,:,i))*M';
  24.   end;
  25.   % PROPOSE A BASIS FUNCTION TO BE UPDATED:
  26.   % ======================================
  27.   for i=1:d,
  28.     proposal(1,i)= (min(x(:,i))-walk(i)) + ((max(x(:,i))+walk(i))-(min(x(:,i))-walk(i)))*rand(1,1);
  29.   end;
  30.   % CHECK IF THE PROPOSED CENTRE ALREADY EXISTS:
  31.   % =========================================== 
  32.   match1=0;
  33.   notEnded=1;
  34.   i=1;
  35.   while ((match1==0)&(notEnded==1)),
  36.     if (mu{t}(i,:)==proposal),
  37.       match1=1;
  38.     elseif (i<k(t)),
  39.       i=i+1;
  40.     else
  41.       notEnded=0;
  42.     end;
  43.   end;
  44.   match2=0;
  45.   notEnded=1;
  46.   i=1;
  47.   if basis>1,
  48.     match2=0;
  49.     notEnded=1;
  50.     i=1;
  51.     while ((match2==0)&(notEnded==1)),
  52.       if (mu{t+1}(i,:)==proposal),
  53.         match2=1;
  54.       elseif (i<basis-1),
  55.         i=i+1;
  56.       else
  57.         notEnded=0;
  58.       end;
  59.     end;
  60.   end; 
  61.   if (match1>0),
  62.     match=match+1;
  63.     mu{t+1}(basis,:)=mu{t}(basis,:);
  64.   elseif (match2>0),
  65.     match=match+1;
  66.     mu{t+1}(basis,:)=mu{t}(basis,:);
  67.   else
  68.     % IF IT DOESN'T EXIST, PERFORM AN UPDATE MOVE:
  69.     % ===========================================
  70.     Mproposal = M;
  71.     Mproposal(:,d+1+basis) = feval(bFunction,proposal,x);
  72.     for i=1:c,
  73.       invHproposal(:,:,i) = (Mproposal'*Mproposal + inv(delta(t,i))*eye(k(t)+1+d));
  74.       Pproposal(:,:,i) = eye(N) - Mproposal*inv(invHproposal(:,:,i))*Mproposal'; 
  75.     end;
  76.     ratio = 1;
  77.     for i=1:c,
  78.      ratio = 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)); 
  79.     end;
  80.     acceptance = min(1,ratio);
  81.     if (uU<acceptance),
  82.       mu{t+1}(basis,:) = proposal;
  83.       M=Mproposal;
  84.       aUpdate=aUpdate+1;
  85.     else
  86.       mu{t+1}(basis,:) = mu{t}(basis,:);
  87.       rUpdate=rUpdate+1;
  88.       M=M;
  89.     end;
  90.   end;
  91. end;
  92. k(t+1) = k(t); % Don't change dimension.
  93. M = M;         % Return the last value of M.