What’s new in the package¶
A catalog of new features, improvements, and bug-fixes in each release.
v0.11.dev¶
v0.10 (January 2026)¶
Add example in gallery to compare clustering algorithms on synthetic datasets. #374 by @qbarthelemy
Enhance
pyriemann.classification.MeanField, to be used as a feature extractor. #377 by @qbarthelemyUpdate pyRiemann from Python 3.9 - 3.11 to 3.10 - 3.12. #378 by @qbarthelemy
Deprecate
fit_transform()ofpyriemann.spatialfilters.AJDCdue to incompatible dimensions. #382 by @qbarthelemyAdd
pyriemann.datasets.RandomOverSamplerfor data augmentation of positive-definite matrices. #387 by @qbarthelemyAdd
pyriemann.utils.tangentspace.transport()for parallel transport of positive-definite matrices. #388 by @qbarthelemyEnhance
pyriemann.datasets.make_matrices()to generate invertible, orthogonal, unitary or non-square matrices. #389 by @qbarthelemyDeprecate
mean_identity. #392 by @qbarthelemyEnhance
pyriemann.tangentspace.TangentSpaceto support HPD matrices. #394 by @qbarthelemySpeedup of the ALM mean
pyriemann.utils.mean.mean_alm(). #398 by @qbarthelemyAdd
pyriemann.utils.geodesic.geodesic_chol()andpyriemann.utils.mean.mean_chol(). #399 by @qbarthelemyAdd
pyriemann.utils.tangentspace.transport_logchol()for parallel transport with log-Cholesky metric. #400 by @qbarthelemyAdd Thompson metric:
pyriemann.utils.distance.distance_thompson(),pyriemann.utils.geodesic.geodesic_thompson(), andpyriemann.utils.mean.mean_thompson(). #401 by @qbarthelemyFix sklearn error
This Pipeline instance is not fitted yet. #406 by @qbarthelemyAdd
pyriemann.classification.NearestConvexHull. #405 by @qbarthelemy
v0.9 (July 2025)¶
Add conjugate transpose operator
pyriemann.utils.base.ctranspose()for real- and complex-valued ndarrays. #348 by @qbarthelemyAdd
pyriemann.embedding.TSNE, a Riemannian t-SNE implementation and update example comparing embeddings. #347 by @thibaultdesurrelFix matplotlib warning. #351 by @qbarthelemy
Enhance
pyriemann.utils.mean.mean_power()usinginit,tolandmaxiterparameters when p=0. #353 by @toncho11Enhance
pyriemann.utils.distance.pairwise_distance()to support HPD matrices for “euclid”, “harmonic”, “logchol” and “logeuclid” metrics. #350 by @qbarthelemyAvoid duplicating code when using joblib. #359 by @qbarthelemy
Fix sklearn warning
This Pipeline instance is not fitted yet. #358 by @qbarthelemyAdd
pyriemann.utils.tangentspace.log_map()andpyriemann.utils.tangentspace.exp_map(). #363 by @qbarthelemyAdd
pyriemann.clustering.MeanShift, a Riemannian mean shift clustering algorithm. #364 by @qbarthelemyFix
pyriemann.spatialfilters.Xdawnto remove the parameterssample_weightthat is not used on the fit_transformation. #371 by @bruAristimunha
v0.8 (February 2025)¶
Enhance
pyriemann.utils.mean.mean_ale()addinginitparameter, and add functioncheck_init()useful to all ajd and mean functions allowing initialization. #328 by @qbarthelemyEnhance
pyriemann.utils.mean.mean_covariance()to support “power” and “poweuclid” metrics. #329 by @qbarthelemyAdd tangent space alignment (TSA) in transfer learning module.
TLStretchis deprecated and renamed intopyriemann.transfer._estimators.TLScale, andTSclassifierintopyriemann.classification.TSClassifier. #320 by @qbarthelemyAdd an example using fNIRS data with a new estimator called
HybridBlocksfor classifying HbO and HbR signals. #323 by @timnaherAdd directional derivatives
pyriemann.utils.base.ddexpm()andpyriemann.utils.base.ddlogm(), and correctpyriemann.utils.tangentspace.log_map_logeuclid()andpyriemann.utils.tangentspace.exp_map_logeuclid(). #332 by @gabelsteinAdd
pyriemann.utils.tangentspace.exp_map_wasserstein(),pyriemann.utils.tangentspace.log_map_wasserstein()andpyriemann.utils.geodesic.geodesic_wasserstein(). #331 by @gabelsteinEnhance
pyriemann.datasets.make_matrices(), to generate symmetric and Hermitian matrices, and add parameters defining the normal distribution to draw eigen vectors. Deprecategenerate_random_spd_matrix. #339 by @qbarthelemyEnhance TSA, adding weights to transformers, and generalizing
pyriemann.transfer._estimators.TLRotatefrom one-to-one to many-to-one domain adaptation in tangent space. #337 by @qbarthelemyEnhance
pyriemann.utils.kernel.kernel_euclid()andpyriemann.utils.kernel.kernel_logeuclid()addingCrefparameter, and correctpyriemann.utils.kernel.kernel_riemann()whenYis different fromXandCrefis None. #340 by @qbarthelemySpeedup of the Wasserstein mean
pyriemann.utils.mean.mean_wasserstein()and extension of transport functionpyriemann.utils.tangentspace.transport(). #341 by @gabelstein
v0.7 (October 2024)¶
Add
kernelparameter topyriemann.embedding.LocallyLinearEmbedding. #293 by @gabelsteinAdd possibility for
target_domainparameter ofpyriemann.transfer._estimators.TLCenterto be empty, forcingtransform()to recenter matrices to the last fitted domain. #292 by @brunaaflEnhance
pyriemann.utils.ajd.ajd_pham()andpyriemann.utils.mean.mean_ale()functions to process HPD matrices. #299 by @qbarthelemyAdd
partial_fitfunction topyriemann.preprocessing.Whiteningfor online applications. #277 by @qbarthelemy and @brentgaisfordAdd
get_weightsfixture to conftest and complete tests. #305 by @qbarthelemyEnhance
pyriemann.estimation.Shrinkageto process HPD matrices. #307 by @qbarthelemyAdd remote sensing examples on radar image clustering. #306 by @AmmarMian
Add
sample_weightparameter toMDM.fit_predict,Potato.fit,Potato.partial_fit,PotatoField.fit,PotatoField.partial_fit,Whitening.partial_fit. #309 by @qbarthelemyUpdate pyRiemann from Python 3.8 - 3.10 to 3.9 - 3.11. #310 by @qbarthelemy
Add
pyriemann.utils.distance.distance_logchol()to compute log-Cholesky distance. #311 by @qbarthelemyAdd
ajd_methodparameter topyriemann.spatialfilters.CSP. #313 by @qbarthelemyAdd
pyriemann.utils.distance.distance_poweuclid()andpyriemann.utils.mean.mean_poweuclid()to use power Euclidean metric. #312 by @qbarthelemyEnhance
pyriemann.utils.mean.mean_power(): addinitparameter and fix default initialization provided in the associated paper. #324 by @toncho11Add
pyriemann.utils.distance.distance_chol(),pyriemann.utils.geodesic.geodesic_logchol(),pyriemann.utils.mean.mean_logchol(), and correctpyriemann.utils.distance.distance_logchol(). #322 by @gabelstein
v0.6 (April 2024)¶
Update pyRiemann from Python 3.7 - 3.9 to 3.8 - 3.10. #254 by @qbarthelemy
Speedup pairwise distance function
pyriemann.utils.distance.pairwise_distance()by adding individual functions for ‘euclid’, ‘harmonic’, ‘logeuclid’ and ‘riemann’ metrics. #256 by @gabelsteinAdd
pyriemann.utils.test.is_real_type()to check the type of input arrays and addpyriemann.utils.covariance.covariance_scm()allowing to process complex-valued inputs for ‘scm’ covariance estimator. #251 by @qbarthelemyUpdate to Read the Docs v2. #260 by @qbarthelemy
Correct
pyriemann.utils.distance.distance_wasserstein()andpyriemann.utils.distance.distance_kullback(), keeping only real part. #267 by @qbarthelemyDeprecate input
covmatsfor mean functions, renamed intoX. #252 by @qbarthelemyAdd support for complex covariance estimation for ‘lwf’, ‘mcd’, ‘oas’ and ‘sch’ estimators. #274 by @gabelstein
Deprecate input
covtestfor predict ofpyriemann.classification.KNearestNeighbor, renamed intoX. #259 by @qbarthelemyCorrect check for kernel_fct param of
pyriemann.classification.SVC. #272 by @qbarthelemyAdd
sample_weightparameter in TLCenter, TLStretch and TLRotate. #273 by @apmellotDeprecate
HankelCovariances, renamed intopyriemann.estimation.TimeDelayCovariances. #275 by @qbarthelemyAdd an example on augmented covariance matrix. #276 by @carraraig
Remove function
make_covariances. #280 by @qbarthelemySpeedup
pyriemann.estimation.TimeDelayCovariances. #281 by @qbarthelemyEnhance ajd module and add a generic
pyriemann.utils.ajd.ajd()function. #238 by @qbarthelemyAdd
pyriemann.utils.viz.plot_bihist(),pyriemann.utils.viz.plot_biscatter()andpyriemann.utils.viz.plot_cov_ellipse()for display. #287 by @qbarthelemy and @gcattanAdd
pyriemann.estimation.CrossSpectraand deprecateCospCovariancesrenamed intopyriemann.estimation.CoSpectra. #288 by @qbarthelemy
v0.5 (Jun 2023)¶
Fix
pyriemann.utils.distance.pairwise_distance()for non-symmetric metrics. #229 by @qbarthelemyFix
pyriemann.utils.mean.mean_covariance()used with keyword arguments. #230 by @qbarthelemyAdd functions to test HPD and HPSD matrices,
pyriemann.utils.test.is_herm_pos_def()andpyriemann.utils.test.is_herm_pos_semi_def(). #231 by @qbarthelemyAdd function
pyriemann.datasets.make_matrices()to generate SPD, SPSD, HPD and HPSD matrices. Deprecate functionpyriemann.datasets.make_covariances. #232 by @qbarthelemyAdd tests for matrix operators and distances for HPD matrices, complete doc and add references. #234 by @qbarthelemy
Enhance tangent space module to process HPD matrices. #236 by @qbarthelemy
Fix regression introduced in
pyriemann.spatialfilters.Xdawn()by #214. #242 by @qbarthelemyFix
pyriemann.utils.kernel.kernel_euclid()applied on non-symmetric matrices. #245 by @qbarthelemyAdd argument
squaredto all distances. #246 by @qbarthelemyCorrect transform and predict_proba of
pyriemann.classification.MeanField. #247 by @qbarthelemyEnhance mean module to process HPD matrices. #243 by @qbarthelemy
Correct
pyriemann.utils.distance.distance_mahalanobis(), keeping only real part. #249 by @qbarthelemyFix
pyriemann.datasets.sample_gaussian_spd()used withsampling_method=rejectionon 2D matrices. #250 by @mhurte
v0.4 (Feb 2023)¶
Add exponential and logarithmic maps for three main metrics: ‘euclid’, ‘logeuclid’ and ‘riemann’.
pyriemann.utils.tangentspace.tangent_space()is splitted in two steps: (i)log_map_*()projecting SPD matrices into tangent space depending on the metric; and (ii)pyriemann.utils.tangentspace.upper()taking the upper triangular part of matrices. Similarly,pyriemann.utils.tangentspace.untangent_space()is splitted into (i)pyriemann.utils.tangentspace.unupper()and (ii)exp_map_*(). The different metrics for tangent space mapping can now be defined intopyriemann.tangentspace.TangentSpace, then used fortransform()as well as forinverse_transform(). #195 by @qbarthelemyEnhance AJD: add
inittopyriemann.utils.ajd.ajd_pham()andpyriemann.utils.ajd.rjd(), addwarm_restarttopyriemann.spatialfilters.AJDC. #196 by @qbarthelemyAdd parameter
sampling_methodtopyriemann.datasets.sample_gaussian_spd(), withrejectionaccelerating 2x2 matrices generation. #198 by @Artim436Add geometric medians for Euclidean and Riemannian metrics:
pyriemann.utils.median_euclid()andpyriemann.utils.median_riemann(), and add an example in gallery to compare means and medians on synthetic datasets. #200 by @qbarthelemyAdd
score()topyriemann.regression.KNearestNeighborRegressor. #205 by @qbarthelemyAdd Transfer Learning module and examples, including RPA and MDWM. #189 by @plcrodrigues, @qbarthelemy and @sylvchev
Add class distinctiveness function to measure the distinctiveness between classes on the manifold,
pyriemann.classification.class_distinctiveness(), and complete an example in gallery to show how it works on synthetic datasets. #215 by @MSYamamotoAdd example on ensemble learning applied to functional connectivity, and add
pyriemann.utils.base.nearest_sym_pos_def(). #202 by @mccorsi and @sylvchevAdd kernel matrices representation
pyriemann.estimation.Kernelsand complete example comparing estimators. #217 by @qbarthelemyAdd a new covariance estimator, robust fixed point covariance, and add kwds arguments for all covariance based functions and classes. #220 by @qbarthelemy
Add example in gallery on frequency band selection using class distinctiveness measure. #219 by @MSYamamoto
Add
pyriemann.utils.covariance.covariance_mest()supporting three robust M-estimators (Huber, Student-t and Tyler) and available for all covariance based functions and classes; and add an example on robust covariance estimation for corrupted data. Add alsopyriemann.utils.distance.distance_mahalanobis()between between vectors and a Gaussian distribution. #223 by @qbarthelemy
v0.3 (July 2022)¶
Correct spectral estimation in
pyriemann.utils.covariance.cross_spectrum()to obtain equivalence with SciPy. #131 by @qbarthelemyAdd instantaneous, lagged and imaginary coherences in
pyriemann.utils.covariance.coherence()andpyriemann.estimation.Coherences. #132 by @qbarthelemyAdd
partial_fitinpyriemann.clustering.Potato, useful for an online update; and update example on artifact detection. #133 by @qbarthelemyDeprecate
pyriemann.utils.viz.plot_confusion_matrixas sklearn integrate its own version. #135 by @sylvchevAdd Ando-Li-Mathias (ALM) mean in
pyriemann.utils.mean.mean_alm(). #56 by @sylvchevAdd Schaefer-Strimmer covariance estimator in
pyriemann.utils.covariance.covariances(), and an example to compare estimators #59 by @sylvchevRefactor tests + fix refit of
pyriemann.tangentspace.TangentSpace. #136 by @sylvchevAdd
pyriemann.clustering.PotatoField, and an example on artifact detection. #142 by @qbarthelemyAdd sampling SPD matrices from a Riemannian Gaussian distribution in
pyriemann.datasets.sample_gaussian_spd(). #140 by @plcrodriguesAdd new function
pyriemann.datasets.make_gaussian_blobs()for generating random datasets with SPD matrices. #140 by @plcrodriguesAdd module
pyriemann.utils.vizin API, addpyriemann.utils.viz.plot_waveforms(), and add an example on ERP visualization. #144 by @qbarthelemyAdd a special form covariance matrix
pyriemann.utils.covariance.covariances_X(). #147 by @qbarthelemyAdd masked and NaN means with Riemannian metric:
pyriemann.utils.mean.maskedmean_riemann()andpyriemann.utils.mean.nanmean_riemann(). #149 by @qbarthelemy and @sylvchevAdd
corroption inpyriemann.utils.covariance.normalize(), to normalize covariance into correlation matrices. #153 by @qbarthelemyAdd block covariance matrix:
pyriemann.estimation.BlockCovariancesandpyriemann.utils.covariance.block_covariances(). #154 by @gabelsteinAdd Riemannian Locally Linear Embedding:
pyriemann.embedding.LocallyLinearEmbeddingandpyriemann.embedding.locally_linear_embedding(). #159 by @gabelsteinAdd Riemannian Kernel Function:
pyriemann.utils.kernel.kernel_riemann(). #159 by @gabelsteinFix
fitinpyriemann.channelselection.ElectrodeSelection. #166 by @qbarthelemyAdd power mean estimation in
pyriemann.utils.mean.mean_power(). #170 by @qbarthelemy and @plcrodriguesAdd example in gallery to compare classifiers on synthetic datasets. #175 by @qbarthelemy
Add
predict_probainpyriemann.classification.KNearestNeighbor, and correct attributeclasses_. #171 by @qbarthelemyAdd Riemannian Support Vector Machine classifier:
pyriemann.classification.SVC. #175 by @gabelstein and @qbarthelemyAdd Riemannian Support Vector Machine regressor:
pyriemann.regression.SVR. #175 by @gabelstein and @qbarthelemyAdd K-Nearest-Neighbor regressor:
pyriemann.regression.KNearestNeighborRegressor. #164 by @gabelstein, @qbarthelemy and @agramfortAdd Minimum Distance to Mean Field classifier:
pyriemann.classification.MeanField. #172 by @qbarthelemy and @plcrodriguesAdd example on principal geodesic analysis (PGA) for SSVEP classification. #169 by @qbarthelemy
Add
pyriemann.utils.distance.distance_harmonic(), and sort functions by their names in code, doc and tests. #183 by @qbarthelemyParallelize functions for dataset generation:
pyriemann.datasets.make_gaussian_blobs(). #179 by @sylvchevFix dispersion when generating datasets:
pyriemann.datasets.sample_gaussian_spd(). #179 by @sylvchevEnhance base and distance functions, to process ndarrays of SPD matrices. #186 and #187 by @qbarthelemy
Enhance utils functions, to process ndarrays of SPD matrices. #190 by @qbarthelemy
Enhance means functions, with faster implementations and warning when convergence is not reached. #188 by @qbarthelemy
v0.2.7 (June 2021)¶
Fix compatibility with scikit-learn v0.24
Correct probas of
pyriemann.classification.MDM. #100 by @qbarthelemyAdd
predict_probaforpyriemann.clustering.Potato, and an example on artifact detection. #105 by @qbarthelemyAdd weights to Pham’s AJD algorithm
pyriemann.utils.ajd.ajd_pham(). #112 by @qbarthelemyAdd
pyriemann.utils.covariance.cross_spectrum(), fixpyriemann.utils.covariance.cospectrum();pyriemann.utils.covariance.coherence()output is kept unchanged. #118 by @qbarthelemyAdd
pyriemann.spatialfilters.AJDCfor BSS and gBSS, with an example on artifact correction. #120 by @qbarthelemyAdd
pyriemann.preprocessing.Whitening, with optional dimension reduction. #122 by @qbarthelemy
v0.2.6 (March 2020)¶
Remove support for Python 2, and update code for better scikit-learn v0.22 support. #79 by @alexandrebarachant
v0.2.5 (January 2018)¶
Add
BilinearFilter.Add a permutation test for generic scikit-learn estimator.
Enhance stats module, with distance based t-test and f-test.
Remove two way permutation test.
Add support for Python 3.5 in travis.
Add
Shrinkagetransformer. #38 by @alexandrebarachantAdd
Coherencestransformer.Add
Embeddingclass. #54 by @plcrodrigues
v0.2.4 (June 2016)¶
Improve documentation.
Add
TSclassifierfor out-of the box tangent space classification.Add Wasserstein distance and mean.
Add
KNearestNeighborclassifier.Add softmax probabilities for
MDM.Add
CSPfor covariance matrices.Add approximate joint diagonalization algorithms: JADE, PHAM, UWEDGE.
Add ALE mean.
Add multiclass
CSP.Correct param name in
CospCovariancesto comply to scikit-learn.Correct attributes name in most modules to comply to the scikit-learn naming convention.
Add
HankelCovariancesestimation.Add
SPoCspatial filtering.Add harmonic mean.
Add Kullback-Leibler mean.
v0.2.3 (November 2015)¶
Add multiprocessing for
MDMwith joblib.Add Kullback-Leibler divergence.
Add Riemannian
Potato.Add sample_weight for mean estimation and
MDM.