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

matlab例程

开发平台:

Matlab

  1. % PURPOSE : To approximate a noisy nolinear function with RBFs, where the number
  2. %           of parameters and parameter values are estimated via reversible jump
  3. %           Markov Chain Monte Carlo (MCMC) simulation.
  4.  
  5. clear;
  6. echo off;
  7. % INITIALISATION AND PARAMETERS:
  8. % =============================
  9. N = 100;                       % Number of time steps.
  10. t = 1:1:N;                    % Time.
  11. chainLength = 2000;           % Length of the Markov chain simulation.
  12. burnIn = 1000;                % Burn In period.
  13. bFunction = 'rjGaussian'      % Type of basis function.
  14. par.doPlot = 0;               % 1 plot. 0 don't plot.
  15. par.a = 2;                    % Hyperparameter for delta.  
  16. par.b = 10;                   % Hyperparameter for delta.
  17. par.e1 = 0.0001;              % Hyperparameter for nabla.    
  18. par.e2 = 0.0001;              % Hyperparameter for nabla.   
  19. par.v = 0;                    % Hyperparameter for sigma    
  20. par.gamma = 0;                % Hyperparameter for sigma. 
  21. par.kMax = 50;                % Maximum number of basis.
  22. par.arbC = 0.25;              % Constant for birth and death moves.
  23. par.merge = .1;               % Split-Merge parameter.
  24. par.Lambda = .5;              % Hybrid Metropolis decision parameter.
  25. par.sRW = .001;               % Variance of noise in the random walk.
  26. par.walkPer = 0.1;            % Percentange of random walk interval. 
  27. % GENERATE THE DATA:
  28. % =================
  29. noiseVar = 0.5;
  30. x = 4*rand(N,1)-2;                    % Input data - uniform in [-2,2].
  31. u = randn(N,1);
  32. noise = sqrt(noiseVar)*u;             % Measurement noise
  33. varianceN=var(noise)
  34. y = x + 2*exp(-16*(x.^(2))) + 2*exp(-16*((x-.7).^(2)))   + noise;  % Output data.
  35. x=(x+2)/4;                            % Rescaling to [0,1].
  36. ynn = y-noise;
  37. xv = 4*rand(N,1)-2;                    % Input data - uniform in [-2,2].
  38. uv = randn(N,1);
  39. noisev = sqrt(noiseVar)*uv;   
  40. yv = xv + 2*exp(-16*(xv.^(2))) + 2*exp(-16*((xv-.7).^(2)))   + noisev;  % Output data.
  41. xv=(xv+2)/4;               
  42. yvnn = yv-noisev;
  43. figure(1)
  44. subplot(211)
  45. plot(x,y,'b+');
  46. ylabel('Output data','fontsize',15);
  47. xlabel('Input data','fontsize',15);
  48. %axis([0 1 -3 3]);
  49. subplot(212)
  50. plot(noise)
  51. ylabel('Measurement noise','fontsize',15);
  52. xlabel('Time','fontsize',15);
  53. fprintf('n')
  54. fprintf('Press a key to continue')
  55. fprintf('n')
  56. pause;
  57. % PERFORM REVERSE JUMP MCMC WITH RADIAL BASIS:
  58. % ===========================================
  59. [k,mu,alpha,sigma,nabla,delta,yp,ypv,post] = rjnn(x,y,chainLength,N,bFunction,par,xv,yv);
  60. % COMPUTE CENTROID, MAP AND VARIANCE ESTIMATES:
  61. % ============================================
  62. [l,m]=size(mu{1});
  63. [Nv,d]=size(xv);
  64. l=chainLength-burnIn;
  65. muvec=zeros(l,m);
  66. alphavec=zeros(m+d+1,l);
  67. ypred = zeros(N,l+1);
  68. ypredv = zeros(Nv,l+1);
  69. for i=1:N;
  70.   ypred(i,:) = yp(i,1,burnIn:chainLength);
  71. end;
  72. for i=1:Nv;
  73.   ypredv(i,:) = ypv(i,1,burnIn:chainLength);
  74. end;
  75. ypred = mean(ypred');
  76. ypredv = mean(ypredv');
  77. fevTrain =(y-ypred')'*(y-ypred')*inv((y-mean(y)*ones(size(y)))'*(y-mean(y)*ones(size(y))))
  78. fevTest = (yv-ypredv')'*(yv-ypredv')*inv((yv-mean(yv)*ones(size(yv)))'*(yv-mean(yv)*ones(size(yv))))
  79. % PLOTS:
  80. % =====
  81. figure(1)
  82. clf;
  83. [xv,i]=sort(xv);
  84. yvnn=yvnn(i);
  85. ypredv=ypredv(i);
  86. yv=yv(i);
  87. [x,i]=sort(x);
  88. ynn=ynn(i);
  89. ypred=ypred(i);
  90. y=y(i);
  91. clf;
  92. subplot(211)
  93. plot(x,ynn,'m--',x,y,'b+',x,ypred,'r')
  94. ylabel('Train output','fontsize',15)
  95. xlabel('Train input','fontsize',15)
  96. subplot(212)
  97. plot(xv,yvnn,'m--',xv,yv,'b+',xv,ypredv,'r')
  98. ylabel('Test output','fontsize',15)
  99. xlabel('Test input','fontsize',15)
  100. legend('True function','Test data','Prediction');
  101. % COMPUTE THE MOST LIKELY MODES:
  102. % =============================
  103. pInt=2;
  104. support=[1:1:4];
  105. probk=zeros((chainLength)/pInt,length(support));
  106. for p=pInt:pInt:chainLength,  
  107.   [probk(p/pInt,:),kmodes]=hist(k(1:p),support);
  108.   probk(p/pInt,:)=probk(p/pInt,:)/p;
  109. end;
  110. figure(2)
  111. clf;
  112. plot(pInt:pInt:chainLength,probk(:,1),'k--',pInt:pInt:chainLength,probk(:,2),'k:',pInt:pInt:chainLength,probk(:,3),'k',pInt:pInt:chainLength,probk(:,4),'k-.');
  113. xlabel('Chain length','fontsize',15)
  114. ylabel('p(k|y)','fontsize',15)
  115. legend('1','2','3','4')
  116. modes = probk(chainLength/2,:);
  117. % HISTOGRAMS:
  118. % ==========
  119. figure(3)
  120. clf;
  121. subplot(321)
  122. hist(delta(burnIn:chainLength),80)
  123. ylabel('Regularisation parameter','fontsize',15);
  124. subplot(322)
  125. plot(delta)
  126. ylabel('Regularisation parameter','fontsize',15);
  127. subplot(323)
  128. hist(sigma(burnIn:chainLength),80)
  129. ylabel('Noise variance','fontsize',15);
  130. subplot(324)
  131. plot(sigma)
  132. ylabel('Noise variance','fontsize',15);
  133. subplot(325)
  134. hist(nabla(burnIn:chainLength),80)
  135. ylabel('Poisson parameter','fontsize',15);
  136. subplot(326)
  137. plot(nabla)
  138. ylabel('Poisson parameter','fontsize',15);