May 03, 2024 | 6 min read

\( \renewcommand{\bra}[1]{\langle #1|} \) \( \renewcommand{\ket}[1]{|#1\rangle} \) \( \renewcommand{\braket}[2]{\langle #1|#2\rangle} \) \( \newcommand{\ketbra}[2]{| #1\rangle \langle #2|} \) \( \renewcommand{\i}{{\color{blue} i}} \) \( \newcommand{\Hil}{{\mathbb H}} \) \( \newcommand{\boldn}{{\bf n}} \) \( \newcommand{\tr}{{\rm tr}}\) \( \newcommand{\bn}{{\bf n}} \)

Consulta la notaci贸n que se ha utilizado durante todo el documento en el siguiente enlace.

4. Quantum Support Vector Machines (QSVM)#

En esta secci贸n, se tratar谩n las m谩quinas de vectores de soporte o de soporte vectorial (en ingl茅s Support Vector Machines, SVM) tanto en computaci贸n cl谩sica como en computaci贸n cu谩ntica. En este 煤ltimo caso, la soluci贸n es conocida como m谩quinas de vectores de soporte cu谩nticos (en su sigla en ingl茅s QSVM). A su vez, se presentar谩n algunas implementaciones de ambas computaciones.

4.1. Support Vector Machines (SVM)#

Las m谩quinas de vectores de soporte o de soporte vectorial son un conjunto de modelos de aprendizaje supervisado propuesto por Vladimir Vapnik .atl en 1964 y posteriormente fueron mejorados en diferentes versiones [38], [8]. Los SVMs se pueden aplicar en procesos de clasificaci贸n, regresi贸n y detecci贸n de valores at铆picos (en ingl茅s, outliers).

En clasificaci贸n, es conocido como clasificador de vectores de soporte (SVC, en sus siglas en ingl茅s). El SVC construye el hiperplano 贸ptimo que maximiza la distancia entre dos categor铆as del conjunto de datos para una mejor predicci贸n. Es decir, busca el hiperplano con la mayor distancia de separaci贸n entre las dos categor铆as del conjunto de datos. Esta caracter铆stica lo diferencia de los modelos de perceptr贸n, que buscan el hiperplano que distingue las dos categor铆as del conjunto de datos. Intuitivamente, una buena separaci贸n se consigue mediante el hiperplano que tiene la mayor distancia al punto de datos de entrenamiento m谩s cercano de cualquier categor铆a (llamado margen funcional), ya que, en general, cuanto mayor es el margen, menor es el error de generalizaci贸n del clasificador [15].

En la Fig. 7 se visualizan tres posibles hiperplanos para separar las dos clases/categor铆as del conjunto de datos, representadas por puntos negros y blancos. Los ejes \(x_{1}\) y \(x_{2}\) corresponden a las caracter铆sticas de cada instancia en el conjunto de datos. El hiperplano H1 no separa adecuadamente las clases del conjunto de datos; el hiperplano H2 las separa con un margen peque帽o y, en cambio, el hiperplano H3 las distingue con la distancia 贸ptima. En consecuencia, se genera la frontera de decisi贸n adecuada u 贸ptima para la predicci贸n. En otras palabras, el SVM con el hiperplano H3 distinguir谩 con mayor probabilidad la clase a la que pertenece un nuevo punto.

../../_images/Svm_separating_hyperplanes.png

Fig. 7 SVM con distintos hiperplanos#

En general, un conjunto de datos no es linealmente separable y el SVC no encontrar铆a un hiperplano 贸ptimo. En estos casos, se aplica el m茅todo del kernel, que permite el mapeo de los datos a otro espacio de caracter铆sticas con mayor dimensi贸n, donde ser铆a m谩s sencillo encontrar el hiperplano 贸ptimo. Para m谩s detalle de los m茅todos kernel, visualice el notebook 5. Quantum Kernels.

4.2. Clasificador de vectores de soporte cu谩ntico#

El clasificador de vectores de soporte cu谩ntico (QSVC, en sus siglas en ingl茅s) es la aplicaci贸n del SVC en computaci贸n cu谩ntica, como se ilustra en la Fig. 8. Aprovecha la capacidad del SVC para trabajar con m茅todos kernel, los cuales pueden calcularse de manera eficiente en computaci贸n cu谩ntica. De esta manera, se beneficia de la alta dimensionalidad del espacio de Hilbert [16], [37]. Para m谩s detalles de los m茅todos kernel, visualice el notebook 5. Quantum Kernels.

../../_images/qsvm_kernel.jpg

Fig. 8 Flujo de trabajo del QSVC#

El QSVC corresponde en varios pasos como se visualiza en la Fig. 8:

  1. La generaci贸n de un kernel cu谩ntico, \(K\):

    1. Mapeo de cada dato cl谩sico, \(\mathbf{x_{i}}\), en un estado cu谩ntico \(\vert \Phi{(\mathbf{x_{i}})} \rangle\). Esto se puede lograr con el circuito cu谩ntico \(\mathcal{U}_{\Phi{(\mathbf{x_{i}})}}\), \(\mathcal{U}_{\Phi{(\mathbf{x_{i}})}} \vert 0^{\otimes N} \rangle = \vert \Phi{(\mathbf{x_{i}})} \rangle\), donde el valor inicial de cada qubit es \(\ket{0}\) y \(N\) es el n煤mero de caracter铆sticas o qubits.

    2. Obtenci贸n de la matriz del kernel, cada elemento de la matriz del kernel se calcula, \(K_{i,j} = |\braket{\Phi(\mathbf{x_{i}})}{\Phi(\mathbf{x_{j}})}|^2 = |\bra{0^{\otimes N}} \mathcal{U}^\dagger_{ \Phi(\mathbf{x_{i}})} \mathcal{U}_{ \Phi{(\mathbf{x_{j}})}} \ket{0^{\otimes N}}|^2 \) donde \(i,j = 0...M\) y \(M\) es el n煤mero de vectores de caracter铆sticas en el conjunto de datos. \(K_{i,j}\) se interpreta como una medida de similitud o de distancia entre estados cu谩nticos.

  2. Se aplica la matriz de kernel en el algoritmo de SVC cl谩sico para entrenar y obtener la predicci贸n.

4.2.1. Ejemplo de QSVM en Qibo#

El ejemplo se basa en un tutorial de pennylane [34]. En este, se usar谩 el SVM de la librer铆a scikit-learn, sklearn. La interfaz permite proporcionar kernel adicional en dos formas:

  1. La funci贸n que calcula la matriz del kernel.

    • (kernel= nombrefunci贸n)

  2. La matriz del kernel calculada.

    • (kernel=鈥減recomputed鈥)

En el ejemplo, se aplicar谩 la primera forma, facilitando la funci贸n que calcula la matriz del kernel. A su vez, el famoso conjunto de datos, Iris, [11]. Este conjunto de datos, que data de 1936, consta de 150 muestras de cuatro caracter铆sticas cada una y da lugar a un problema de clasificaci贸n y se utilizar谩 solo las primeras 100 muestras.

Se cargan las librer铆as necesarias:

import numpy as np 
import matplotlib.pyplot as plt

# librer铆a con SVM
from sklearn import svm

# Carga el conjunto de datos y algunas funciones adicionales
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Librer铆a cu谩ntico (Qibo)
import qibo
from qibo import gates
from qibo.models import Circuit

#Uso de backend de numpy en Qibo
qibo.set_backend("numpy")
[Qibo 0.1.12.dev0|INFO|2024-06-11 12:06:45]: Using numpy backend on /CPU:0

Se carga el conjunto de datos, \(X\), se seleccionan las primeras 100 muestras y luego se adaptan los datos aplicando un escalado peri贸dico mediante la codificaci贸n a datos cu谩nticos. Este proceso implica la transformaci贸n de los datos a la distribuci贸n normal est谩ndar, tambi茅n conocida como la distribuci贸n Z.

A su vez, el conjunto de datos se divide en dos grupos:

  • Entrenamiento

  • Testeo

X, y = load_iris(return_X_y=True)

# Se selecciona solo la dos primeras clases del conjunto 
# de datos debido a que el clasificador es binario
X = X[:100]
y = y[:100]

# Escalar los datos a distribuci贸n normal est谩ndar debido a la 
# codificaci贸n datos es peri贸dica
scaler = StandardScaler().fit(X)
X_scaled = scaler.transform(X)

# Escalar las etiquetas a -1 y 1 debido que es importante para SVM
y_scaled = 2 * (y - 0.5)

# Se divide en entrenamiento y testeo
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled)

La codificaci贸n de los datos cl谩sicos a estados cu谩nticos se llevar谩 a cabo mediante la codificaci贸n en 谩ngulo, utilizando puertas de rotaci贸n. Para obtener m谩s detalles sobre la codificaci贸n cu谩ntica, consulte el notebook 2. Feature encoding. En el ejemplo, se aplica la puerta de rotaci贸n en el eje Y para codificar los datos cl谩sicos en estados cu谩nticos. Esta puerta no introduce componentes imaginarias.

Dado que cada vector de caracter铆sticas consta de cuatro caracter铆sticas, se necesitar谩n cuatro qubits para codificar los estados cu谩nticos, por lo tanto, \(N = 4\).

Para estimar la distancia entre dos estados cu谩nticos, es decir, el producto escalar, se aplica el test invertido o quantum kernel estimation [16]. Para obtener m谩s detalles sobre los kernels, consulte el notebook 5. Quantum Kernels. En el ejemplo, el circuito cu谩ntico representa el c谩lculo de la distancia entre dos estados cu谩nticos como \(K_{i,j} = |\braket{\Phi(\mathbf{x_{i}})}{\Phi(\mathbf{x_{j}})}|^2 = |\bra{0^{\otimes N}} \mathcal{U}^\dagger_{ \Phi(\mathbf{x_{i}})} \mathcal{U}_{ \Phi{(\mathbf{x_{j}})}} \ket{0^{\otimes N}}|^2 \). El estado cu谩ntico resultante \(\ket{\phi}\) se mide con respecto al estado computacional \(\ket{0^{\otimes N}}\), y el resultado es la probabilidad \(|\braket {0^{\otimes N}} {\phi}|^2\) de observar la base computacional \(\ket{0^{\otimes N}}\) del estado cu谩ntico actual \(\ket{\phi}\). Este c谩lculo se basa en las reglas de Born [1].

Para obtener las probabilidades en la base computacional \(\ket{0^{\otimes N}}\) en una computadora cu谩ntica, el circuito cu谩ntico debe ser ejecutado varias veces o shots. Seg煤n el art铆culo Supervised learning with quantum-enhanced feature spaces [16], el circuito deber铆a ejecutarse 50000 veces. En el ejemplo, se usa 8000 por limitaci贸n del computador cu谩ntico.

# kernel cu谩ntico
def distancia_circuit(x,y):
    
    # cuatro c煤bits: cuatro caracter铆sticas
    n_qubits = len(X_train[0]) 
    n_shots = 8000

    # Create an empty circuit
    circuit = Circuit(n_qubits)

    # Codificaci贸n cu谩ntica en puertas RY 
    for pos in range(n_qubits):
        circuit.add(gates.RY(pos, y[pos]))
        circuit.add(gates.RY(pos, x[pos]).dagger())
        circuit.add(gates.M(pos))

    # ejecuci贸n del circuito n veces (n_shots)
    result = circuit.execute(nshots=n_shots)
    # Devuelve las probabilidades anal铆ticas
    return result.probabilities()
       
# Se devuelve el probabilidad del base computacional "0000"
kernel = lambda x1, x2: distancia_circuit(x1, x2)[0]

Se verifica que el kernel cu谩ntico funciona correctamente con el vector de caracter铆sticas \(\mathbf{x}\) consigo mismo. El resultado deber铆a ser 1, es decir, la probabilidad del estado inicial \(\ket{\phi}{\text{inicial}} = \ket{0^N}\) es igual a la probabilidad del estado final \(\ket{\phi}{\text{final}} = \ket{0^N}\).

x = np.array([np.pi/2,np.pi/2,np.pi/2,np.pi/2])
kernel(x,x)
1.0

Se define una funci贸n que calcula una matriz de kernel para los vectores de caracter铆sticas en dos conjuntos de datos diferentes \(A, B\). Si \(A=B\), la matriz del kernel es conocida como la matriz de Gram [5].

def kernel_matrix(A, B):
    return np.array([[kernel(a, b) for b in B] for a in A])

Para el entrenamiento, se inicializa el clasificador SVC con la matriz del kernel cu谩ntico.

# Inicializaci贸n
qsvm = svm.SVC(kernel=kernel_matrix)

print("Entrenando...")
qsvm = qsvm.fit(X_train, y_train)

print("Entrenado!")
Entrenando...
Entrenado!

Se calcula la precisi贸n en la clasificaci贸n con el conjunto de datos de test.

#test
print("Precisi贸n con test...")

predictions = qsvm.predict(X_test)
accuracy_score(predictions, y_test)
Precisi贸n con test...
1.0

Se compara el resultado con un SVM cl谩sico con kernel lineal

modelclasico = svm.SVC(kernel="linear")
modelclasico.fit(X_train, y_train)

print("Precisi贸n con test...")

predictions = modelclasico.predict(X_test)
accuracy_score(predictions, y_test)
Precisi贸n con test...
1.0

Nota (Anexo notaci贸n)

Para que la comprensi贸n de los notebooks sea mejor se ha unificado la notaci贸n utilizada en los mismos. Para diferenciar un vector de un valor 煤nico se har谩 uso de la negrita. De manera que \(\mathbf{x}\) corresponde a un vector y \(z\) ser谩 una variable de una 煤nica componente.

Si se quiere hacer referencia a dos vectores distintos pero que pertenecen al mismo dataset se utilizar谩 un sub铆ndice, es decir, \(\mathbf{x_i}\) har谩 referencia al i-茅simo vector del dataset. Si se quiere referenciar una caracter铆stica concreta del vector se a帽adir谩 un nuevo sub铆ndice, de manera que \(\mathbf{x_{i_j}}\) har谩 referencia a la j-茅sima variable del i-茅simo vector.


Autores:

Carmen Calvo (SCAYLE), Antoni Alou (PIC), Carlos Hernani (UV), Nahia Iriarte (NASERTIC) y Carlos Luque (IAC)

../../_images/LOGO-SCAILE.png ../../_images/Logo_pic.png ../../_images/Logo_UV.jpg ../../_images/Logo_Nasertic.png ../../_images/Logo_IAC.jpg
https://quantumspain-project.es/wp-content/uploads/2022/11/Logo_QS_EspanaDigital.png
Licencia Creative Commons

License: Licencia Creative Commons Atribuci贸n-CompartirIgual 4.0 Internacional.

This work has been financially supported by the Ministry for Digital Transformation and of Civil Service of the Spanish Government through the QUANTUM ENIA project call - Quantum Spain project, and by the European Union through the Recovery, Transformation and Resilience Plan - NextGenerationEU within the framework of the Digital Spain 2026 Agenda.