Similar to RaisedCosineLinearConv but the basis functions are log-spaced.
This implementation is based on the cosine bumps used by Pillow et al. [1]
to uniformly tile the internal points of the domain.
Parameters:
n_basis_funcs (int) – The number of basis functions.
time_scaling (float) – Non-negative hyper-parameter controlling the logarithmic stretch magnitude, with
larger values resulting in more stretching. As this approaches 0, the
transformation becomes linear.
enforce_decay_to_zero (bool) – If set to True, the algorithm first constructs a basis with n_basis_funcs+ceil(width) elements
and subsequently trims off the extra basis elements. This ensures that the final basis element
decays to 0.
window_size (int) – The window size for convolution. Required if mode is ‘conv’.
label (Optional[str]) – The label of the basis, intended to be descriptive of the task variable being processed.
For example: velocity, position, spike_counts.
conv_kwargs (Optional[dict]) – Additional keyword arguments passed to nemos.convolve.create_convolutional_predictor();
These arguments are used to change the default behavior of the convolution.
For example, changing the predictor_causality, which by default is set to "causal".
Note that one cannot change the default value for the axis parameter. Basis assumes
that the convolution axis is axis=0.
This uses PEP-487 [1] to set the set_{method}_request methods. It
looks for the information available in the set default values which are
set using __metadata_request__* class attributes, or inferred
from method signatures.
The __metadata_request__* class attributes are used when a method
does not explicitly accept a metadata through its arguments or if the
developer would like to specify a request value for those metadata
which are different from the default None.
Clone the basis while preserving attributes related to input shapes.
This method ensures that input shape attributes (e.g., _input_shape_product,
_input_shape_) are preserved during cloning. Reinitializing the class
as in the regular sklearn clone would drop these attributes, rendering
cross-validation unusable.
A bank of basis filters is convolved with the input data. All the dimensions
except for the sample-axis are flattened, so that the method always returns a
matrix.
For example, if inputs are of shape (num_samples, 2, 3), the output will be
(num_samples,num_basis_funcs*2*3).
Parameters:
*xi (ArrayLike) – The input data over which to apply the basis transformation. The samples can be passed
as multiple arguments, each representing a different dimension for multivariate inputs.
This method is intended to be 1-to-1 mappable to sklearn transform method of transformer. This
means that for the method to be callable, all the state attributes have to be pre-computed in a
method that is mappable to fit, which for us is _fit_basis. It is fundamental that both
methods behaves like the corresponding transformer method, with the only difference being the input
structure: a single (X, y) pair for the transformer, a number of time series for the Basis.
Evaluate the log-spaced raised cosine basis at the sample points.
Parameters:
sample_pts (NDArray) – Spacing for basis functions. Samples will be rescaled to the interval [0, 1].
sample_pts is a n-dimensional (n >= 1) array with first axis being the samples, i.e.
sample_pts.shape[0] == n_samples.
Evaluate the basis set on a grid of equi-spaced sample points.
Parameters:
n_samples (int) – The number of points in the uniformly spaced grid. A higher number of
samples will result in a more detailed visualization of the basis functions.
compute_features() always returns a real-valued design matrix. For
complex bases (e.g., FourierEval), the real and imaginary parts are
returned as separate columns.
The number of output features can be determined only when the number of inputs
provided to the basis is known. Therefore, before the first call to compute_features,
this property will return None. After that call, or after setting the input shape with
set_input_shape, n_output_features will be available.
Set the expected input shape for the basis object.
This method configures the shape of the input data that the basis object expects.
xi can be specified as an integer, a tuple of integers, or derived
from an array. The method also calculates the total number of input
features and output features based on the number of basis functions.
The input shape specification.
- An integer: Represents the dimensionality of the input. A value of 1 is treated as scalar input.
- A tuple: Represents the exact input shape excluding the first axis (sample axis).
All elements must be integers.
An array: The shape is extracted, excluding the first axis (assumed to be the sample axis).
Raises:
ValueError – If a tuple is provided and it contains non-integer elements.
Returns:
Returns the instance itself to allow method chaining.
Return type:
self
Notes
All state attributes that depends on the input must be set in this method in order for
the API of basis to work correctly. In particular, this method is called by setup_basis,
which is equivalent to fit for a transformer. If any input dependent state
is not set in this method, then compute_features (equivalent to fit_transform) will break.
Examples
>>> importnemosasnmo>>> importnumpyasnp>>> basis=nmo.basis.RaisedCosineLogConv(5,10)>>> # Configure with an integer input:>>> _=basis.set_input_shape(3)>>> basis.n_output_features15>>> # Configure with a tuple:>>> _=basis.set_input_shape((4,5))>>> basis.n_output_features100>>> # Configure with an array:>>> x=np.ones((10,4,5))>>> _=basis.set_input_shape(x)>>> basis.n_output_features100
The method works on simple estimators as well as on nested objects
(such as Pipeline). The latter have
parameters of the form <component>__<parameter> so that it’s
possible to update each component of a nested object.
This method corresponds sklearn transformer fit. As fit, it must receive the input and
it must set all basis states, i.e. kernel_ and all the states relative to the input shape.
The difference between this method and the transformer fit is in the expected input structure,
where the transformer fit method requires the inputs to be concatenated in a 2D array, while here
each input is provided as a separate time series for each basis element.
Decompose an array along a specified axis into sub-arrays based on the number of expected inputs.
This function takes an array (e.g., a design matrix or model coefficients) and splits it along
a designated axis.
How it works:
If the basis expects an input shape (n_samples,n_inputs), then the feature axis length will
be total_n_features=n_inputs*n_basis_funcs. This axis is reshaped into dimensions
(n_inputs,n_basis_funcs).
If the basis expects an input of shape (n_samples,), then the feature axis length will
be total_n_features=n_basis_funcs. This axis is reshaped into (1,n_basis_funcs).
For example, if the input array x has shape (1,2,total_n_features,4,5),
then after applying this method, it will be reshaped into (1,2,n_inputs,n_basis_funcs,4,5).
The specified axis (axis) determines where the split occurs, and all other dimensions
remain unchanged. See the example section below for the most common use cases.
Parameters:
x (NDArray) –
The input array to be split, representing concatenated features, coefficients,
or other data. The shape of x along the specified axis must match the total
number of features generated by the basis, i.e., self.n_output_features.
Examples:
For a design matrix: (n_samples,total_n_features)
For model coefficients: (total_n_features,) or (total_n_features,n_neurons).
axis (int, optional) – The axis along which to split the features. Defaults to 1.
Use axis=1 for design matrices (features along columns) and axis=0 for
coefficient arrays (features along rows). All other dimensions are preserved.
Raises:
ValueError – If the shape of x along the specified axis does not match self.n_output_features.
Returns:
A dictionary where:
Key: Label of the basis.
Value: the array reshaped to: (...,n_inputs,n_basis_funcs,...)