diff --git a/doc_source/modules/DAF/Forecasting.rst b/doc_source/modules/DAF/Forecasting.rst index 0844e55e..dfb0479e 100644 --- a/doc_source/modules/DAF/Forecasting.rst +++ b/doc_source/modules/DAF/Forecasting.rst @@ -67,7 +67,7 @@ This page outlines the available time series forecasting functions. ax2.plot(X_model[1,:],'r', label="Forecast") ax2.plot(X_meas[1,:], '.b', label="Measurement") ax2.plot([],[]) - ax2.set_title('x', fontsize='x-large') + ax2.set_title('y', fontsize='x-large') ax2.tick_params(axis='both', which='major', labelsize='x-large') ax2.set_ylim((-30,30)) @@ -76,7 +76,7 @@ This page outlines the available time series forecasting functions. ax3.plot(X_meas[2,:], '.b', label="Measurement") ax3.plot([],[]) ax3.legend(fontsize='large', loc='upper left') - ax3.set_title('x', fontsize='x-large') + ax3.set_title('z', fontsize='x-large') ax3.tick_params(axis='both', which='major', labelsize='x-large') ax3.set_ylim((0,60)) diff --git a/docs/_modules/teaspoon/DAF/data_assimilation.html b/docs/_modules/teaspoon/DAF/data_assimilation.html index 935a8b19..739c0fe3 100644 --- a/docs/_modules/teaspoon/DAF/data_assimilation.html +++ b/docs/_modules/teaspoon/DAF/data_assimilation.html @@ -143,6 +143,7 @@
from gudhi.wasserstein import wasserstein_distance from teaspoon.DAF.forecasting import get_forecast from teaspoon.DAF.forecasting import forecast_time +from teaspoon.DAF.forecasting import random_feature_map_model try: import tensorflow as tf @@ -293,6 +294,66 @@
+[docs] +def rafda(u_obs, Dr, Gamma, M=1000, g=1000, w=0.005, b=4.0, beta=4e-5, seed=None): + """ + Function for generating a RAFDA model based on the method presented in https://doi.org/10.1016/j.physd.2021.132911. + + Args: + u_obs (array): Array of observations (D x N) D is the dimension, N is the number of training points. + Dr (int): Reservoir dimension + Gamma (array): Observational covariance matrix. + M (int): Ensemble size. + g (float): Initial random weight ensemble distribution parameter. + w (float): Random feature weight matrix distribution width parameter. + b (float): Random feature bias vector distribution parameter. + beta (float): Ridge regression regularization parameter. + seed (int): Random seed (optional) + + Returns: + W_RAFDA (array): Optimal RAFDA model weights. + W_in (array): Random weight matrix. + b_in (array): Random bias vector. + """ + D = np.shape(u_obs)[0] + N = np.shape(u_obs)[1] + W_LR, W_in, b_in = random_feature_map_model(u_obs, Dr, w=w, b=b, beta=beta, seed=seed) + W_LR = W_LR.ravel() + + # Sample initial ensemble (u_obs \in R^D) + u_o = np.random.multivariate_normal(u_obs[:,0], Gamma,size=M).T + w_o = np.random.multivariate_normal(W_LR, g*np.identity(D*Dr),size=M).T + Z_a = np.vstack([u_o,w_o]) + H = np.hstack([np.identity(D),np.zeros((D,D*Dr))]) + Z_f = np.zeros((D+D*Dr, M)) + + for n in range(1, N): + # Ensemble steps + print(n) + phi = np.tanh(W_in @ Z_a[:D,:] + b_in) + W_a_prev = Z_a[D:,:].reshape((D, Dr, M)) + + W_a_flat = W_a_prev.reshape(W_a_prev.shape[0] * W_a_prev.shape[1], M) + u_f = np.einsum('ijk,jk->ik', W_a_prev, phi) + + Z_f = np.vstack((u_f, W_a_flat)) + Z_f_mean = np.mean(Z_f, axis=1, keepdims=True) + Z_f_hat = Z_f - Z_f_mean + + P_f = (1/(M-1))*Z_f_hat@Z_f_hat.T + Uo = np.tile(u_obs[:,n][:, np.newaxis],M) - np.sqrt(Gamma)@np.random.normal(size=(D,M)) + + Z_a = Z_f - P_f@H.T@np.linalg.inv(H@P_f@H.T+Gamma)@(H@Z_f-Uo) + Z_f = np.copy(Z_a) + + W_RAFDA = np.mean(Z_a[D:, :], axis=1).reshape((D,Dr)) + + return W_RAFDA, W_in, b_in
# Get distances between all pairs of off-diagonal points
# When we fix this for more q options,
- if q == np.infty:
+ if q == np.inf:
metric = 'chebyshev'
elif q == 1:
metric = 'l1'
diff --git a/docs/_sources/modules/DAF/Forecasting.rst.txt b/docs/_sources/modules/DAF/Forecasting.rst.txt
index 0844e55e..dfb0479e 100644
--- a/docs/_sources/modules/DAF/Forecasting.rst.txt
+++ b/docs/_sources/modules/DAF/Forecasting.rst.txt
@@ -67,7 +67,7 @@ This page outlines the available time series forecasting functions.
ax2.plot(X_model[1,:],'r', label="Forecast")
ax2.plot(X_meas[1,:], '.b', label="Measurement")
ax2.plot([],[])
- ax2.set_title('x', fontsize='x-large')
+ ax2.set_title('y', fontsize='x-large')
ax2.tick_params(axis='both', which='major', labelsize='x-large')
ax2.set_ylim((-30,30))
@@ -76,7 +76,7 @@ This page outlines the available time series forecasting functions.
ax3.plot(X_meas[2,:], '.b', label="Measurement")
ax3.plot([],[])
ax3.legend(fontsize='large', loc='upper left')
- ax3.set_title('x', fontsize='x-large')
+ ax3.set_title('z', fontsize='x-large')
ax3.tick_params(axis='both', which='major', labelsize='x-large')
ax3.set_ylim((0,60))
diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle
index 834b01aa..9a8109d4 100644
Binary files a/docs/doctrees/environment.pickle and b/docs/doctrees/environment.pickle differ
diff --git a/docs/doctrees/modules/DAF/DataAssimilation.doctree b/docs/doctrees/modules/DAF/DataAssimilation.doctree
index 81fd163c..dffef3eb 100644
Binary files a/docs/doctrees/modules/DAF/DataAssimilation.doctree and b/docs/doctrees/modules/DAF/DataAssimilation.doctree differ
diff --git a/docs/doctrees/modules/DAF/Forecasting.doctree b/docs/doctrees/modules/DAF/Forecasting.doctree
index 92ad24c6..94f76497 100644
Binary files a/docs/doctrees/modules/DAF/Forecasting.doctree and b/docs/doctrees/modules/DAF/Forecasting.doctree differ
diff --git a/docs/doctrees/modules/SP/stoch_bif.doctree b/docs/doctrees/modules/SP/stoch_bif.doctree
index 77742569..9c2690c5 100644
Binary files a/docs/doctrees/modules/SP/stoch_bif.doctree and b/docs/doctrees/modules/SP/stoch_bif.doctree differ
diff --git a/docs/doctrees/modules/TDA/fast_zigzag.doctree b/docs/doctrees/modules/TDA/fast_zigzag.doctree
index 0a25cb6c..6f350340 100644
Binary files a/docs/doctrees/modules/TDA/fast_zigzag.doctree and b/docs/doctrees/modules/TDA/fast_zigzag.doctree differ
diff --git a/docs/genindex.html b/docs/genindex.html
index 35c57622..10cd6a19 100644
--- a/docs/genindex.html
+++ b/docs/genindex.html
@@ -571,6 +571,8 @@ R