forward_connection
ReservoirComputing.forward_connection — Function
forward_connection([rng], [T], dims...;
forward_weight=0.1, radius=nothing, return_sparse=false,
kwargs...)Creates a reservoir based on a forward connection of weights (Elsarraj et al., 2019).
This architecture is referred to as TP5 in the original paper.
\[W_{i,j} = \begin{cases} r, & \text{if } j = i - 2 \text{ for } i = 3 \dots N \\ 0, & \text{otherwise} \end{cases}\]
Arguments
rng: Random number generator. Default isUtils.default_rng()from WeightInitializers.T: Type of the elements in the reservoir matrix. Default isFloat32.dims: Dimensions of the reservoir matrix.
Keyword arguments
forward_weight: Weight of the cycle connections in the reservoir matrix. This can be provided as a single value or an array. In case it is provided as an array please make sure that the length of the array matches the length of the sub-diagonal you want to populate. Default is 0.1.radius: The desired spectral radius of the reservoir. Ifnothingis passed, no scaling takes place. Defaults tonothing.return_sparse: flag for returning asparsematrix.truerequiresSparseArraysto be loaded. Default isfalse.sampling_type: Sampling that decides the distribution offorward_weightnegative numbers. If set to:no_samplethe sign is unchanged. If set to:bernoulli_sample!then eachforward_weightcan be positive with a probability set bypositive_prob. If set to:irrational_sample!theforward_weightis negative if the decimal number of the irrational number chosen is odd. If set to:regular_sample!, each weight will be assigned a negative sign after the chosenstrides.stridescan be a single number or an array. Default is:no_sample.positive_prob: probability of theforward_weightbeing positive whensampling_typeis set to:bernoulli_sample!. Default is 0.5.irrational: Irrational number whose decimals decide the sign offorward_weight. Default ispi.start: Which place after the decimal point the counting starts for theirrationalsign counting. Default is 1.strides: number of strides for assigning negative value to a weight. It can be an integer or an array. Default is 2.
Examples
Default kwargs:
julia> reservoir_matrix = forward_connection(5, 5)
5×5 Matrix{Float32}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.1 0.0 0.0 0.0 0.0
0.0 0.1 0.0 0.0 0.0
0.0 0.0 0.1 0.0 0.0Changing the weights magnitudes to a different unique value:
julia> forward_connection(5, 5; forward_weight=0.99)
5×5 Matrix{Float32}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.99 0.0 0.0 0.0 0.0
0.0 0.99 0.0 0.0 0.0
0.0 0.0 0.99 0.0 0.0Changing the weights signs with different sampling techniques:
julia> forward_connection(5, 5; sampling_type=:irrational_sample!)
5×5 Matrix{Float32}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
-0.1 0.0 0.0 0.0 0.0
0.0 0.1 0.0 0.0 0.0
0.0 0.0 -0.1 0.0 0.0
julia> forward_connection(5, 5; sampling_type=:irrational_sample!)
5×5 Matrix{Float32}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
-0.1 0.0 0.0 0.0 0.0
0.0 0.1 0.0 0.0 0.0
0.0 0.0 -0.1 0.0 0.0Changing the weights to random numbers. Note that the length of the given array must be at least as long as the subdiagonal one wants to fill:
julia> reservoir_matrix = forward_connection(5, 5; forward_weight=rand(Float32, 3))
5×5 Matrix{Float32}:
0.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.274221 0.0 0.0 0.0 0.0
0.0 0.111511 0.0 0.0 0.0
0.0 0.0 0.618345 0.0 0.0Returning a sparse matrix:
julia> reservoir_matrix = forward_connection(10, 10; return_sparse=true)
10×10 SparseMatrixCSC{Float32, Int64} with 8 stored entries:
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
0.1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ 0.1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ 0.1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ 0.1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ 0.1 ⋅ ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ 0.1 ⋅ ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 0.1 ⋅ ⋅ ⋅
⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 0.1 ⋅ ⋅References
- Elsarraj, D.; Qisi, M. A.; Rodan, A.; Obeid, N.; Sharieh, A. and Faris, H. (2019). Demystifying echo state network with deterministic simple topologies. International Journal of Computational Science and Engineering 19, 407–417.