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

Der Pauli-Expansionskreislauf.

Die Pauli-Expansionsschaltung ist eine Datenkodierungsschaltung, die die Eingangsdaten x⃗∈Rn\vec{x} \in \mathbb{R}^n, wobei nn die feature_dimension ist, wie folgt transformiert

UΦ(x⃗)=exp⁡(i∑S∈IϕS(x⃗)∏i∈SPi).U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}} \phi_S(\vec{x})\prod_{i\in S} P_i\right).

Dabei ist SS ein Satz von Qubit-Indizes, der die Verbindungen in der Feature-Map beschreibt, I\mathcal{I} ist ein Satz, der alle diese Indexsätze enthält, und Pi∈{I,X,Y,Z}P_i \in \{I, X, Y, Z\}. Standardmäßig ist das Daten-Mapping ϕS\phi_S

ϕS(x⃗)={xi if S={i}∏j∈S(π−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}.

Die möglichen Verbindungen können mit den Argumenten entanglement und paulis festgelegt werden. Zum Beispiel können wir für Ein-Qubit-Rotationen ZZ und Zwei-Qubit-Wechselwirkungen YYYY zwischen allen Qubit-Paaren festlegen:

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

die Blöcke der Form

┌───┐┌─────────────┐┌──────────┐                                            ┌───────────┐
┤ 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) ├
└───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘

Die Schaltung enthält reps Wiederholungen dieser Transformation.

Bitte beachten Sie z_feature_map() für den Fall von Ein-Qubit-Pauli- ZZ Rotationen und auf zz_feature_map() für die Ein- und Zwei-Qubit-Pauli- ZZ Rotationen.

Parameter

  • feature_dimension (int) – Anzahl der Qubits im Schaltkreis.
  • reps (int) – Die Anzahl der Wiederholungen der Evolutionsschichten.
  • entanglement (str |Mapping[int, Sequence[Sequence[int]]] | Callable[[int], str |Mapping[int, Sequence[Sequence[int]]]]) – Legt die Verschränkungsstruktur fest. Es kann sich um eine Zeichenkette ('full', 'linear', 'reverse_linear', 'circular' oder 'sca') handeln oder um ein Wörterbuch, bei dem die Schlüssel die Anzahl der Qubits darstellen und die Werte eine Liste von Ganzzahlpaaren sind, die die Indizes der miteinander verschränkten Qubits angeben, zum Beispiel: {1: [(0,), (2,)], 2: [(0,1), (2,0)]} oder es kann ein sein Callable[[int], Union[str | Dict[...]]] , um eine für eine Wiederholung spezifische Verschränkung zurückzugeben.
  • alpha (float) – Der Pauli-Rotationsfaktor, der mit den Pauli-Rotationen multipliziert wird.
  • paulis (list[str] | None) – Eine Liste von Zeichenfolgen für die zu verwendenden Paulis. Wenn keine angegeben werden, ['Z', 'ZZ'] wird verwendet.
  • data_map_func (Callable[[Parameter], ParameterExpression] | None) – Eine Zuordnungsfunktion für die Daten, x die übergeben werden kann, um die Standardzuordnung zu überschreiben.
  • parameter_prefix (str) – Das Präfix, das verwendet wird, wenn Standardparameter generiert werden.
  • insert_barriers (bool) – In True diesem Fall werden zwischen den Evolutionsanweisungen und den Hadamard-Schichten Barrieren eingefügt.
  • name (str) – Der Name der Rennstrecke.

Rückgabe

Ein Quantenschaltkreis, der die Pauli-Feature-Map implementiert.

Rückgabetyp

QuantumCircuit

Beispiele

>>> 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)])

Quellenangaben:

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

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.