Source code for pyriemann_qiskit.optimization.mean

"""Quantum mean estimators for SPD matrices.

Notes
-----
.. versionchanged:: 0.6.0
    Moved from ``pyriemann_qiskit.utils.mean`` to
    ``pyriemann_qiskit.optimization.mean``.
"""

from docplex.mp.model import Model
from pyriemann.utils.base import expm, logm
from pyriemann.utils.mean import mean_functions
from qiskit_optimization.algorithms import ADMMOptimizer

from .docplex import ClassicalOptimizer


[docs] def qmean_euclid(X, sample_weight=None, optimizer=ClassicalOptimizer()): """Euclidean mean with Constraint Programming Model. Constraint Programming Model (CPM) [1]_ formulation of the mean with Euclidean distance. Parameters ---------- X : ndarray, shape (n_matrices, n_channels, n_channels) Set of SPD matrices. sample_weights : None | ndarray, shape (n_matrices,), default=None Weights for each matrix. Never used in practice. It is kept only for standardization with pyRiemann. optimizer : pyQiskitOptimizer, default=ClassicalOptimizer() An instance of :class:`pyriemann_qiskit.optimization.docplex.pyQiskitOptimizer`. Returns ------- mean : ndarray, shape (n_channels, n_channels) CPM-optimized Euclidean mean. Notes ----- .. versionadded:: 0.0.3 .. versionchanged:: 0.0.4 Add regularization of the results. .. versionchanged:: 0.2.0 Rename from `fro_mean_convex` to `qmean_euclid`. Remove shrinkage. References ---------- .. [1] \ http://ibmdecisionoptimization.github.io/docplex-doc/cp/creating_model.html """ n_matrices, n_channels, _ = X.shape channels = range(n_channels) matrices = range(n_matrices) prob = Model() X_mean = optimizer.spdmat_var(prob, channels, "fro_mean") def _dist_euclid(A, B): A = optimizer.convert_spdmat(A) return prob.sum_squares(A[r, c] - B[r, c] for r in channels for c in channels) objectives = prob.sum(_dist_euclid(X[i], X_mean) for i in matrices) prob.set_objective("min", objectives) result = optimizer.solve(prob) return result
[docs] def qmean_logeuclid( X, sample_weight=None, optimizer=ClassicalOptimizer(optimizer=ADMMOptimizer()) ): """Log-Euclidean mean with Constraint Programming Model. Constraint Programming Model (CPM) [2]_ formulation of the mean with Log-Euclidean distance [1]_. Parameters ---------- X : ndarray, shape (n_matrices, n_channels, n_channels) Set of SPD matrices. sample_weights : None | ndarray, shape (n_matrices,), default=None Weights for each matrix. Never used in practice. It is kept only for standardization with pyRiemann. optimizer : pyQiskitOptimizer, default=ClassicalOptimizer() An instance of :class:`pyriemann_qiskit.optimization.docplex.pyQiskitOptimizer`. Returns ------- mean : ndarray, shape (n_channels, n_channels) CPM-optimized Log-Euclidean mean. Notes ----- .. versionadded:: 0.2.0 References ---------- .. [1] \ Geometric means in a novel vector space structure on symmetric positive-definite matrices V. Arsigny, P. Fillard, X. Pennec, and N. Ayache. SIAM Journal on Matrix Analysis and Applications. Volume 29, Issue 1 (2007). .. [2] \ http://ibmdecisionoptimization.github.io/docplex-doc/cp/creating_model.html """ log_X = logm(X) result = qmean_euclid(log_X, sample_weight, optimizer) return expm(result)
mean_functions["qeuclid"] = qmean_euclid mean_functions["qlogeuclid"] = qmean_logeuclid