Advertisement
arentij

Untitled

Jun 19th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.60 KB | None | 0 0
  1. % code by Brian Hunt with input from Zhixin Lu & Jaideep Pathak
  2. % prediction based on Jaeger reservoir model
  3. % modified by Artur Perevalov
  4.  
  5.  
  6. % load res_sample
  7. start = 120;
  8. training_length = 25000;
  9. after_training = 5000;
  10.  
  11. % filtering if necessary
  12. windowsize = 1;  %parameters for box averaging
  13. b = (1/windowsize)*ones(1,windowsize);
  14. a = 1;
  15.  
  16. %% defining the data
  17. % just creating some powers of sin
  18. t = [1:50000]/1024;
  19. w1 = 4*2*pi;
  20. w2 = 7.2*2*pi;
  21. data = [sin(w1*t).^5; 2*sin(w2*t).^7; sin((w1+w2)*t).^8]';
  22.  
  23. % data = filter(b, a, data);
  24.  
  25. data_norm_coef = 100; %normalising to 1 over this coeff
  26. stdd = std(data(:));
  27. data = data/data_norm_coef; %normalising
  28. mean_d = mean(data);
  29. data = data - ones(length(data),1) * mean_d; %substracting mean values
  30.  
  31.  
  32. %% Cutting data for training and prediction
  33. Utr = data(start:start+training_length,:);      % training data
  34. Ute = data(start+training_length+1:start+training_length+after_training,:);  % test data
  35.  
  36. trans = 100;   % transient time
  37. rng(0);         % seed random number generator
  38. reg = 1e-5; % regularization parameter
  39. rho = 1.1;  % spectral radius
  40. p = 0.095;  % connection probability
  41. N = 2000;   % reservoir size
  42. scale_rho = 0.3; % input strength
  43. alpha =  1; % slowing down parameter
  44.  
  45. train = size(Utr,1);        % training time
  46. dim = size(Utr,2);          % number of coordinates
  47. scale = scale_rho*ones(1,dim);    % input strength for each coordinate
  48. coord = 1;                 % coordinate to graph
  49.  
  50. U = Utr;
  51.  
  52. A = sparse(double(rand(N) < p));        % apply connection probability
  53. A(A~=0) = 2*rand(1,length(find(A)))-1;  % randomize nonzero entries
  54. A = rho*A/abs(eigs(A,1));               % scale spectral radius
  55.  
  56. Win = (2*rand(N,dim)-1)*diag(scale);    % input weights
  57.  
  58. X = zeros(train+1, N);                          % preallocate
  59. X(1,:) = 2*rand(1,N)-1;
  60.  
  61. % initialize reservoir
  62. for n = 1:train    % listening phase
  63.     X(n+1,:) = (1-alpha) * X(n,:) + alpha*tanh(X(n,:)*A' + U(n,:)*Win');   % reservoir with input
  64. end
  65.  
  66. init = X(train+1,:);        % initial state for prediction
  67. X = X((trans+1):train,:);   % throw away transient
  68. U = U((trans+1):train,:);
  69.  
  70. %% Here is the magic
  71. Wout = (X'*X + reg*eye(N))\(X'*U);  % fit X*Wout to U with regularization
  72.  
  73. %% plots
  74. plots = 1; %1 if you need to visualise plots
  75.  
  76. if plots == 1
  77.     figure(1)
  78.     tvals = (trans+1):train;
  79.     subplot(2,1,1)              % graph training signal versus reservoir output
  80.     plot(tvals, U(:,coord), 'b', tvals, X*Wout(:,coord), 'r'); axis tight
  81.     subplot(2,1,2)              % graph normalized RMS error
  82.     %                                 plot(tvals, sqrt(sum((X*Wout-U).^2,2)./(1)))
  83.     plot(tvals, sqrt(sum((X*Wout-U).^2,2)./(sum((X*Wout).^2,2)+sum(U.^2,2))))
  84.  
  85.     axis tight
  86. end
  87.  
  88. test = size(Ute,1);             % testing time
  89. %                             U = Ute - ones(test,1)*shift;   % subtract training mean
  90. U = Ute;
  91.  
  92. XX = zeros(test, N);
  93. XX(1,:) = init;
  94.  
  95. for n = 1:(test-1)      % predict using autonomous reservoir with feedback
  96.     XX(n+1,:) = (1-alpha) * XX(n,:) + alpha*tanh(XX(n,:)*A' + (XX(n,:)*Wout)*Win');
  97. end
  98.  
  99. if plots == 1
  100.     figure(2)
  101.     tvals = 1:test;
  102.     subplot(2,1,1)              % graph test signal versus reservoir prediction
  103.     plot(tvals, U(:,coord), 'b', tvals, XX*Wout(:,coord), 'r'); axis tight
  104.     subplot(2,1,2)              % graph normalized RMS error
  105. %                                 plot(tvals, sqrt(sum((XX*Wout-U).^2,2)./(1)))
  106.     plot(tvals, sqrt(sum((XX*Wout-U).^2,2)./(sum((XX*Wout).^2,2)+sum(U.^2,2))))
  107.  
  108.     axis tight
  109. end
  110.  
  111. %% evaluating errors
  112. error_type = 2;
  113.  
  114. if error_type == 1
  115.     er_vec = zeros(1, dim);  % error vector
  116.     for i = 1:dim
  117.         er_vec(1, i) = sqrt(sum( (U(:,i)-XX*Wout(:,i)).^2 ))/sqrt(after_training);
  118.     end
  119.  
  120.     aae = sum(er_vec)*data_norm_coef/dim;
  121.  
  122.  
  123. elseif error_type == 2
  124.     er_matr = zeros(after_training,dim);
  125.     s = std(U);
  126.     for i = 1:dim
  127.         er_matr(:,i) = (abs(U(:,i)-XX*Wout(:,i)))/s(i);
  128.     end
  129.  
  130.     er_vec = zeros(after_training,1);
  131.    
  132.     for i = 1:after_training
  133.         er_vec(i) = sqrt(sum(er_matr(i,:).^2)/dim);
  134.     end
  135.  
  136.     aae = mean(er_vec);
  137.  
  138. end
  139.  
  140. if plots == 1
  141.     if error_type == 2
  142.         figure(3)
  143.         plot(er_vec)
  144.     end
  145. end
  146.  
  147. prediction = U;
  148. experiment = XX*Wout;
  149.  
  150. clearvars A after_training coord dim init
  151. clearvars n N out p reg rho scale shift start test train training_length
  152. clearvars trans  Ute Utr Win  i scale_rho Ustd data_norm_coef k fid ans timestep
  153. clearvars tvals a b windowsize plots error_type data
  154. clearvars Wout X U XX mean_d s stdd ww
  155. clearvars alpha t w1 w2 aae c
  156. clearvars er_matr er_vec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement