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

El circuito de expansión de Pauli.

El circuito de expansión Pauli es un circuito de codificación de datos que transforma los datos de entrada xRn\vec{x} \in \mathbb{R}^n, donde nn es el feature_dimension, como

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

Aquí, SS es un conjunto de índices qubit que describe las conexiones en el mapa de características, I\mathcal{I} es un conjunto que contiene todos estos conjuntos de índices, y Pi{I,X,Y,Z}P_i \in \{I, X, Y, Z\}. Por defecto, el mapa de datos ϕS\phi_S es

ϕ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}.

Las conexiones posibles pueden establecerse utilizando los argumentos entanglement y paulis . Por ejemplo, para rotaciones de un solo qubit ZZ e interacciones de dos qubits YYYY entre todos los pares de qubits, podemos establecer:

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

que producirá bloques de la forma

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

El circuito contiene reps repeticiones de esta transformación.

Consulte z_feature_map() para el caso de rotaciones Pauli- ZZ de un solo qubit y a zz_feature_map() para las rotaciones Pauli- ZZ de uno y dos qubits.

Parámetros

  • feature_dimension (int) – Número de qubits en el circuito.
  • reps (int) – El número de veces que se repiten las capas de evolución.
  • entanglement (str |Mapping[int, Sequence[Sequence[int]]] | Callable[[int], str |Mapping[int, Sequence[Sequence[int]]]]) – Especifica la estructura de entrelazamiento. Puede ser una cadena ('full', 'linear', 'reverse_linear', 'circular' o 'sca') o un diccionario en el que las claves representan el número de qubits y los valores son una lista de pares de números enteros que especifican los índices de los qubits que están entrelazados entre sí, por ejemplo: {1: [(0,), (2,)], 2: [(0,1), (2,0)]} o puede ser un Callable[[int], Union[str | Dict[...]]] para devolver un entrelazamiento específico para una repetición.
  • alpha (float) – El factor de rotación de Pauli, que se multiplica por las rotaciones de Pauli.
  • paulis (list[str] | None) – Una lista de cadenas para los paulis que se van a utilizar. Si no se proporciona ninguno, ['Z', 'ZZ'] se utilizará.
  • data_map_func (Callable[[Parameter], ParameterExpression] | None) – Una función de asignación para los datos x que se puede proporcionar para anular la asignación predeterminada.
  • parameter_prefix (str) – El prefijo que se utiliza cuando se generan parámetros por defecto.
  • insert_barriers (bool) – En ese caso True, se insertan barreras entre las instrucciones de evolución y las capas de Hadamard.
  • name (str) – El nombre del circuito.

Devuelve

Un circuito cuántico que implementa el mapa de características de Pauli.

Tipo de retorno

QuantumCircuit

Ejemplos

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

Referencias:

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

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.