glhmm.glhmm

Gaussian Linear Hidden Markov Model @author: Diego Vidaurre 2023

class glhmm.glhmm.glhmm(K=10, covtype='shareddiag', model_mean='state', model_beta='state', dirichlet_diag=10, connectivity=None, Pstructure=None, Pistructure=None)[source]

Bases: object

Gaussian Linear Hidden Markov Model class to decode stimulus from data.

Attributes:

Kint, default=10

number of states in the model.

covtypestr, {‘shareddiag’, ‘diag’,’sharedfull’,’full’}, default ‘shareddiag’

Type of covariance matrix. Choose ‘shareddiag’ to have one diagonal covariance matrix for all states, or ‘diag’ to have a diagonal full covariance matrix for each state, or ‘sharedfull’ to have a shared full covariance matrix for all states, or ‘full’ to have a full covariance matrix for each state.

model_meanstr, {‘state’, ‘shared’, ‘no’}, default ‘state’

Model for the mean. If ‘state’, the mean will be modelled state-dependent. If ‘shared’, the mean will be modelled globally (shared between all states). If ‘no’ the mean of the timeseries will not be used to drive the states.

model_betastr, {‘state’, ‘shared’, ‘no’}, default ‘state’

Model for the beta. If ‘state’, the regression coefficients will be modelled state-dependent. If ‘shared’, the regression coefficients will be modelled globally (shared between all states). If ‘no’ the regression coefficients will not be used to drive the states.

dirichlet_diagfloat, default=10

The value of the diagonal of the Dirichlet distribution for the transition probabilities. The higher the value, the more persistent the states will be. Note that this value is relative; the prior competes with the data, so if the timeseries is very long, the dirichlet_diag may have little effect unless it is set to a very large value.

connectivityarray_like of shape (n_states, n_states), optional

Matrix of binary values defining the connectivity of the states. This parameter can only be used with a diagonal covariance matrix (i.e., covtype=’diag’).

Pstructurearray_like, optional

Binary matrix defining the allowed transitions between states. The default is a (n_states, n_states) matrix of all ones, allowing all possible transitions between states.

Pistructurearray_like, optional

Binary vector defining the allowed initial states. The default is a (n_states,) vector of all ones, allowing all states to be used as initial states.

Notes:

This class requires the following modules: numpy, math, scipy, sys, warnings, copy, and time.

decode(X, Y, indices=None, files=None, viterbi=False, set=None, serial=False, gpu_acceleration=0, gpuChunks=1)[source]

Calculates state time courses for all the data using either parallel or sequential processing.

Parameters:

Xarray-like of shape (n_samples, n_parcels)

The timeseries of set of variables 1.

Yarray-like of shape (n_samples, n_parcels)

The timeseries of set of variables 2.

indicesarray-like of shape (n_sessions, 2), optional, default=None

The start and end indices of each trial/session in the input data.

fileslist of str, optional, default=None

List of filenames corresponding to the indices.

viterbibool, optional, default=False

Whether or not the Viterbi algorithm should be used.

setint, optional, default=None

Index of the sessions set to decode.

Returns:

If viterbi=True:
vpatharray of shape (n_samples,)

The most likely state sequence.

If viterbi=False:
Gammaarray of shape (n_samples, n_states)

The state probability timeseries.

Xiarray of shape (n_samples - n_sessions, n_states, n_states)

The joint probabilities of past and future states conditioned on data.

scalearray-like of shape (n_samples,)

The scaling factors from the inference, used to compute the free energy. In normal use, we would do

Gamma,Xi,_ = hmm.decode(X,Y,indices)

Raises:

Exception

If the model has not been trained. If both ‘files’ and ‘Y’ arguments are provided.

dual_estimate(X, Y, indices=None, Gamma=None, Xi=None, for_kernel=False)[source]

Dual estimation of HMM parameters.

Parameters:

Xarray-like of shape (n_samples, n_variables_1)

The timeseries of set of variables 1.

Yarray-like of shape (n_samples, n_variables_2)

The timeseries of set of variables 2.

indicesarray-like of shape (n_sessions, 2), optional

The start and end indices of each trial/session in the input data. If None, a single segment spanning the entire sequence is used.

Gammaarray-like of shape (n_samples, n_states), optional

The state probabilities. If None, it is computed from the input observations.

Xiarray-like of shape (n_samples - n_sessions, n_states, n_states), optional

The joint probabilities of past and future states conditioned on data. If None, it is computed from the input observations.

for_kernelbool, optional

Whether purpose of dual estimation is kernel (gradient) computation, or not If True, function will also return Gamma and Xi (default False)

Returns:

hmm_dualobject

A copy of the HMM object with updated dynamics and observation distributions.

get_P()[source]

Returns transition probability matrix

Returns:

P: ndarray of shape (K,K), where K is the number of states

Raises:

Exception

If the model has not yet been trained.

get_Pi()[source]

Returns initial probabilities

Returns:

Pi: ndarray of shape (K,), where K is the number of states

Raises:

Exception

If the model has not yet been trained.

get_active_K()[source]

Returns the number of active states

Returns:

K_activeint

Number of active states.

get_beta(k=0)[source]

Returns the regression coefficients (beta) for the specified state.

Parameters:

kint, optional, default=0

The index of the state for which to retrieve the beta value.

Returns:

beta: ndarray of shape (n_variables_1 x n_variables_2)

The regression coefficients of each variable in X on each variable in Y for the specified state.

Raises:

Exception

If the model has not yet been trained. If the model has no beta.

get_betas()[source]

Returns the regression coefficients (beta) for all states.

Returns:

betas: ndarray of shape (n_variables_1 x n_variables_2 x n_states)

The regression coefficients of each variable in X on each variable in Y for all states.

Raises:

Exception

If the model has not yet been trained. If the model has no beta.

get_covariance_matrix(k=0)[source]

Returns the covariance matrix for the specified state.

Parameters:

kint, optional

The index of the state. Default=0.

Returns:

array of shape (n_parcels, n_parcels)

The covariance matrix for the specified state.

Raises:

Exception

If the model has not been trained.

get_fe(X, Y, Gamma, Xi, scale=None, indices=None, todo=None, non_informative_prior_P=False)[source]

Computes the Free Energy of an HMM depending on observation model.

Parameters:

Xarray of shape (n_samples, n_parcels)

The timeseries of set of variables 1.

Yarray of shape (n_samples, n_parcels)

The timeseries of set of variables 2.

Gammaarray of shape (n_samples, n_states), default=None

The state timeseries probabilities.

Xiarray-like of shape (n_samples - n_sessions, n_states, n_states)

The joint probabilities of past and future states conditioned on data.

scalearray-like of shape (n_samples,), default=None

The scaling factors used to compute the free energy of the dataset. If None, scaling is automatically computed.

indicesarray-like of shape (n_sessions, 2), optional, default=None

The start and end indices of each trial/session in the input data.

todo: bool of shape (n_terms,) or None, default=None

Whether or not each of the 5 elements (see fe_terms) should be computed. Only for internal use.

non_informative_prior_P: array-like of shape (n_states, n_states), optional, default=False

Prior of transition probability matrix Only for internal use.

Returns:

fe_termsarray of shape (n_terms,)

The variational free energy, separated into different terms: - element 1: Gamma Entropy - element 2: Data negative log-likelihood - element 3: Gamma negative log-likelihood - element 4: KL divergence for initial and transition probabilities - element 5: KL divergence for the state parameters

Raises:

Exception

If the model has not been trained.

Notes:

This function computes the variational free energy using a specific algorithm. For more information on the algorithm, see [^1].

References:

[^1] Smith, J. et al. “A variational approach to Bayesian learning of switching dynamics in dynamical systems.” Journal of Machine Learning Research, vol. 18, no. 4, 2017.

get_inverse_covariance_matrix(k=0)[source]

Returns the inverse covariance matrix for the specified state.

Parameters:

kint, optional

The index of the state. Default=0.

Returns:

array of shape (n_parcels, n_parcels)

The inverse covariance matrix for the specified state.

Raises:

Exception

If the model has not been trained.

get_mean(k=0)[source]

Returns the mean for the specified state.

Parameters:

kint, optional, default=0

The index of the state for which to retrieve the mean.

Returns:

mean: ndarray of shape (n_variables_2,)

The mean value of each variable in Y for the specified state.

Raises:

Exception

If the model has not yet been trained. If the model has no mean.

get_means()[source]

Returns the means for all states.

Returns:

means: ndarray of shape (n_variables_2, n_states)

The mean value of each variable in Y for all states.

Raises:

Exception

If the model has not yet been trained. If the model has no mean.

get_r2(X, Y, Gamma, indices=None)[source]

Computes the explained variance per session/trial and per column of Y

Parameters:

Xarray of shape (n_samples, n_variables_1)

The timeseries of set of variables 1.

Yarray of shape (n_samples, n_variables_2)

The timeseries of set of variables 2.

Gammaarray of shape (n_samples, n_states), default=None

The state timeseries probabilities.

indicesarray-like of shape (n_sessions, 2), optional, default=None

The start and end indices of each trial/session in the input data.

Returns:

r2array of shape (n_sessions, n_variables_2)

The R-squared (proportion of the variance explained) for each session and each variable in Y.

Raises:

Exception

If the model has not been trained, or if it does not have neither mean or beta

Notes:

This function does not take the covariance matrix into account

initialize(p, q)[source]

Initialize the parameters of the HMM with initial random values. IMPORTANT: This should not be run before training. This is only useful for sampling data, and should be combined with subsequent calls to set_beta, set_mean, set_covariance_matrix, set_P and set_Pi.

Parameters:

p : number of channels in X (not used if only Y is modelled) q : number of channels in Y

loglikelihood(X, Y)[source]

Computes the likelihood of the model per state and time point given the data X and Y.

Parameters:

Xarray-like of shape (n_samples, n_parcels)

The timeseries of set of variables 1.

Yarray-like of shape (n_samples, n_parcels)

The timeseries of set of variables 2.

Returns:

Larray of shape (n_samples, n_states)

The likelihood of the model per state and time point given the data X and Y.

Raises:

Exception

If the model has not been trained.

sample(size, X=None, Gamma=None)[source]

Generates Gamma and Y for timeseries of lengths specified in variable size.

Parameters:

sizearray of shape (n_sessions,) or (n_sessions, 2)

If size is 1-dimensional, each element represents the length of a session. If size is 2-dimensional, each row of size represents the start and end indices of a session in a timeseries.

Xarray of shape (n_samples, n_parcels), default=None

The timeseries of set of variables 1.

Gammaarray of shape (n_samples, n_states), default=None

The state probability timeseries.

Returns:

If X is not None:
Xarray of shape (n_samples, n_parcels)

The timeseries of set of variables 1.

Y: array of shape (n_samples,n_parcels)

The timeseries of set of variables 2.

Gammaarray of shape (n_samples, n_states)

The state probability timeseries.

sample_Gamma(size)[source]

Generates Gamma, for timeseries of lengths specified in variable size.

Parameters:

sizearray

Array of shape (n_sessions,) or (n_sessions, 2). If size is 1-dimensional, each element represents the length of a session. If size is 2-dimensional, each row of size represents the start and end indices of a session in a timeseries.

Returns:

Gammaarray of shape (n_samples, n_states)

The state probability timeseries.

set_P(P)[source]

Set transition probability matrix. Useful to create synthetic data for simulations.

Parameters:

P: ndarray of shape (K,K), where K is the number of states

set_Pi(Pi)[source]

Returns initial probabilities. Useful to create synthetic data for simulations.

Parameters:

Pi: ndarray of shape (K,), where K is the number of states

set_beta(beta, k=0)[source]

Sets the regression coefficients (beta) to specific values. Useful to create synthetic data for simulations.

Parameters:

beta: ndarray of shape (n_variables_1 x n_variables_2)

The regression coefficients of each variable in X on each variable in Y for the specified state k.

kint, optional, default=0

The index of the state for which to retrieve the beta value.

set_covariance_matrix(shape, self, k=0)[source]

Sets the covariance matrix to specific values. Useful to create synthetic data for simulations.

Parameters:

ratendarray of shape (n_variables_2 x n_variables_2),

The rate parameter of the covariance

shape : int, the shape parameter of the covariance k : int, optional

The index of the state. Default=0.

set_mean(mean, k=0)[source]

Sets the mean to specific values. Useful to create synthetic data for simulations.

Parameters:

mean: ndarray of shape (n_variables_2,)

The mean value of each variable in Y for the specified state.

kint, optional, default=0

The index of the state for which to retrieve the beta value.

train(X=None, Y=None, indices=None, files=None, Gamma=None, Xi=None, scale=None, options=None)[source]

Train the GLHMM on input data X and Y, which most general formulation is Y = mu_k + X beta_k + noise where noise is Gaussian with mean zero and standard deviation Sigma_k

It supports both standard and stochastic variational learning; for the latter, data must be supplied in files format

Parameters:

Xarray-like of shape (n_samples, n_variables_1)

The timeseries of set of variables 1.

Yarray-like of shape (n_samples, n_variables_2)

The timeseries of set of variables 2.

indicesarray-like of shape (n_sessions, 2), optional

The start and end indices of each trial/session in the input data. If None, one big segment with no cuts is assumed.

filesstr or list of str, optional

The filename(s) containing the data to load. If not None, X, Y, and indices are ignored.

Gammaarray-like of shape (n_samples, n_states), optional

The initial values of the state probabilities.

Xiarray-like of shape (n_samples - n_sessions, n_states, n_states), optional

The joint probabilities of past and future states conditioned on data.

scalearray-like of shape (n_samples,), optional

The scaling factors used to compute the free energy of the dataset. If None, scaling is automatically computed.

optionsdict, optional

A dictionary with options to control the training process.

Returns:

Gammaarray-like of shape (n_samples, n_states)

The state probabilities. To avoid unnecessary use of memory, Gamma is only returned if learning is non-stochastic; otherwise it is returned as an empty numpy array. To get Gamma after stochastic learning, use the decode method.

Xiarray-like of shape (n_samples - n_sessions, n_states, n_states)

The joint probabilities of past and future states conditioned on data. To avoid unnecessary use of memory, Xi is only returned if learning is non-stochastic; otherwise it is returned as an empty numpy array. To get Xi after stochastic learning, use the decode method.

fearray-like

The free energy computed at each iteration of the training process.

Raises:

Exception

If files and Y are both provided or if neither are provided. If X is not provided and the hyperparameter ‘model_beta’ is True.

If ‘files’ is not provided and stochastic learning is called upon