Skip to main content
IBM Quantum Platform

qiskit.circuit.library.pauli_feature_map

qiskit.circuit.library.pauli_feature_map(feature_dimension, reps=2, entanglement='full', alpha=2.0, paulis=None, data_map_func=None, parameter_prefix='x', insert_barriers=False, name='PauliFeatureMap')

GitHub

Le circuit d'expansion de Pauli.

Le circuit d'expansion de Pauli est un circuit d'encodage de données qui transforme les données d'entrée xRn\vec{x} \in \mathbb{R}^n, où nn est le feature_dimension, comme suit

UΦ(x)=exp(iSIϕS(x)iSPi).U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}} \phi_S(\vec{x})\prod_{i\in S} P_i\right).

Ici, SS est un ensemble d'indices de qubits qui décrit les connexions dans la carte de caractéristiques, I\mathcal{I} est un ensemble contenant tous ces ensembles d'indices, et Pi{I,X,Y,Z}P_i \in \{I, X, Y, Z\}. Par défaut, la cartographie des données ϕS\phi_S est

ϕS(x)={xi if S={i}jS(πxj) if S>1.\phi_S(\vec{x}) = \begin{cases} x_i \text{ if } S = \{i\} \\ \prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1 \end{cases}.

Les connexions possibles peuvent être définies à l'aide des arguments entanglement et paulis . Par exemple, pour les rotations du qubit unique ZZ et les interactions du qubit double YYYY entre toutes les paires de qubits, nous pouvons définir :

circuit = pauli_feature_map(..., paulis=["Z", "YY"], entanglement="full")

qui produira des blocs de la forme

┌───┐┌─────────────┐┌──────────┐                                            ┌───────────┐
┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘

Le circuit contient reps répétitions de cette transformation.

Veuillez vous référer à z_feature_map() pour le cas des rotations de Pauli- ZZ à qubit unique et à zz_feature_map() pour les rotations de Pauli- ZZ à un ou deux qubits.

Paramètres

  • feature_dimension (int) – Nombre de qubits dans le circuit.
  • reps (int) – Le nombre de fois où les couches d'évolution sont répétées.
  • entanglement (str |Mapping[int, Sequence[Sequence[int]]] | Callable[[int], str |Mapping[int, Sequence[Sequence[int]]]]) – Définit la structure d'intrication. Il peut s'agir d'une chaîne de caractères ('full', 'linear', 'reverse_linear', 'circular' ou 'sca') ou d'un dictionnaire dont les clés représentent le nombre de qubits et dont les valeurs sont des listes de paires d'entiers indiquant les indices des qubits intriqués les uns avec les autres, par exemple : {1: [(0,), (2,)], 2: [(0,1), (2,0)]} ou peut être un Callable[[int], Union[str | Dict[...]]] pour renvoyer un enchevêtrement spécifique à une répétition.
  • alpha (float) – Le facteur de rotation de Pauli, qui se multiplie par les rotations de Pauli.
  • paulis (list[str] | None) – Une liste de chaînes de caractères destinées aux paulis. Si aucune valeur n'est fournie, ['Z', 'ZZ'] sera utilisé.
  • data_map_func (Callable[[Parameter], ParameterExpression] | None) – Une fonction de mappage pour les données x qui peut être fournie afin de remplacer le mappage par défaut.
  • parameter_prefix (str) – Préfixe utilisé lorsque des paramètres par défaut sont générés.
  • insert_barriers (bool) – Dans ce cas True, des barrières sont insérées entre les instructions d'évolution et les couches de Hadamard.
  • name (str) – Le nom du circuit.

Retours

Un circuit quantique mettant en œuvre la carte de caractéristiques de Pauli.

Type de retour

QuantumCircuit

Exemples

>>> prep = pauli_feature_map(2, reps=1, paulis=["ZZ"])
>>> print(prep)
     ┌───┐
q_0: ┤ H ├──■──────────────────────────────────────■──
     ├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
     └───┘└───┘└────────────────────────────────┘└───┘
>>> prep = pauli_feature_map(2, reps=1, paulis=["Z", "XX"])
>>> print(prep)
     ┌───┐┌─────────────┐┌───┐                                            ┌───┐
q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
     ├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
     └───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
>>> prep = pauli_feature_map(2, reps=1, paulis=["ZY"])
>>> print(prep)
     ┌───┐┌──────────┐                                            ┌───────────┐
q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2)
     ├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
     └───┘            └───┘└────────────────────────────────┘└───┘
>>> from qiskit.circuit.library import efficient_su2
>>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
>>> wavefunction = efficient_su2(3)
>>> classifier = prep.compose(wavefunction)
>>> classifier.num_parameters
27
>>> classifier.count_ops()
OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])

Références :

[1] Havlicek et al. Supervised learning with quantum enhanced feature spaces, Nature 567, 209-212 (2019).

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.