braintools.analysis.population.rdm

Contents

braintools.analysis.population.rdm#

braintools.analysis.population.rdm(x, metric='correlation')#

Representational dissimilarity matrix between conditions.

Entry (i, j) is the dissimilarity between the activity patterns of conditions i and j (rows of x) [1]:

  • 'correlation': \(1 - r(x_i, x_j)\), one minus the Pearson correlation across features;

  • 'cosine': \(1 - x_i \cdot x_j / (\lVert x_i\rVert \lVert x_j\rVert)\);

  • 'euclidean': \(\lVert x_i - x_j \rVert_2\).

Parameters:
  • x (array_like or brainunit.Quantity) – Condition-by-feature patterns, shape (C, D).

  • metric (str) – Dissimilarity measure (same definitions as scipy.spatial.distance.pdist).

Returns:

Symmetric (C, C) matrix with a zero diagonal. 'euclidean' carries the unit of x; the other metrics are dimensionless. Off-diagonal entries involving a zero-norm ('cosine') or constant ('correlation') pattern are nan, as in scipy.

Return type:

jax.Array or brainunit.Quantity

Raises:

ValueError – If x is not 2-D or metric is unknown.

See also

rsa

Compare two RDMs.

Notes

Equal to scipy.spatial.distance.squareform(pdist(x, metric)). The Euclidean metric is computed from explicit differences (memory O(C^2 D)) for accuracy. Jittable, vmappable and differentiable (the Euclidean branch has a zero subgradient at zero distance).

References

Examples

>>> import jax.numpy as jnp
>>> from braintools.analysis import population
>>> x = jnp.array([[0., 0.], [3., 4.], [1., 0.]])
>>> population.rdm(x, metric='euclidean')
Array([[0.      , 5.      , 1.      ],
       [5.      , 0.      , 4.472136],
       [1.      , 4.472136, 0.      ]], dtype=float32)