Korean
언어
English
Bengali
French
Hindi
Italian
Japanese
Korean
Malayalam
Russian
Spanish
Tamil
Turkish
Vietnamese
Shortcuts

참고

이 페이지는 `docs/tutorials/07_pegasos_qsvc.ipynb`에서 생성되었다.

Pegasos Quantum Support Vector Classifier

양자 커널 메소드로부터 얻을 수 있는 또 다른 SVM 기반 알고리즘이 있다. 여기에서는 위에 표시된 QSVC의 대체 버전인 다른 분류 알고리즘의 구현을 소개한다. 이 분류 알고리즘은 Shalev-Shwartz 등의 논문 Pegasos: Primal Estimated sub-GrAdient SOlver for SVM (https://home.ttic.edu/~nati/Publications/PegasosMPB.pdf 참조)에서 Pegasos 알고리즘을 구현한다.

This algorithm is an alternative to the dual optimization from the scikit-learn package, benefits from the kernel trick, and yields a training complexity that is independent of the size of the training set. Thus, the PegasosQSVC is expected to train faster than QSVC for sufficiently large training sets.

이 알고리즘은 일부 하이퍼 파라미터로 ``QSVC``를 직접 대체하는데 사용될 수 있다.

몇개의 데이터를 생성한다:

[2]:
from sklearn.datasets import make_blobs

# example dataset
features, labels = make_blobs(n_samples=20, n_features=2, centers=2, random_state=3, shuffle=True)

회전 인코딩과 호환성을 보장하기 위해 데이터를 전처리하고 이를 학습 및 테스트 데이터 세트로 분할한다.

[4]:
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

features = MinMaxScaler(feature_range=(0, np.pi)).fit_transform(features)

train_features, test_features, train_labels, test_labels = train_test_split(
    features, labels, train_size=15, shuffle=False
)

데이터 세트에는 두 가지 특징이 있으므로 데이터 세트의 특징 수에 따라 큐비트를 설정한다.

그리고 나서 \(tau\) 단계를 반복한다.

그리고 마지막은 하이퍼 파라미터 :math:`C`이다. 이것은 양의 정규화 매개변수다. 정규화의 강도는 :math:`C`에 반비례한다. 더 작은 :math:`C`는 일반적으로 과적합을 방지하는데 도움이 되는 작은 가중치를 유도한다. 그러나 이 알고리즘의 특성으로 인해 일부 계산 단계는 큰 :math:`C`이 된다. 그러므로 :math:`C`가 클수록 알고리즘의 성능이 크게 향상된다. 만약 데이터가 feature space에서 선형으로 분리할 수 있으면 :math:`C`를 큰 값으로 선택해야 한다. 그렇지 않다면, 과적합을 방지하기 위해 :math:`C`를 더 작게 선택해야 한다.

[5]:
# number of qubits is equal to the number of features
num_qubits = 2

# number of steps performed during the training procedure
tau = 100

# regularization parameter
C = 1000

알고리즘은 다음을 사용하여 실행된다:

  • 상태벡터 시뮬레이터

  • ZFeatureMap 에서 생성된 양자 커널

[9]:
from qiskit import BasicAer
from qiskit.circuit.library import ZFeatureMap
from qiskit.utils import QuantumInstance, algorithm_globals

from qiskit_machine_learning.kernels import QuantumKernel

algorithm_globals.random_seed = 12345

pegasos_backend = QuantumInstance(
    BasicAer.get_backend("statevector_simulator"),
    seed_simulator=algorithm_globals.random_seed,
    seed_transpiler=algorithm_globals.random_seed,
)

feature_map = ZFeatureMap(feature_dimension=num_qubits, reps=1)

qkernel = QuantumKernel(feature_map=feature_map, quantum_instance=pegasos_backend)

PegasosQSVC 구현은 scikit-learn 인터페이스와 호환되며 매우 표준적인 모델 훈련 방식을 가지고 있다. 생성자에서 알고리즘의 매개변수를 전달하는데, 이 경우 정규화 하이퍼-파라미터 \(C\) 와 여러 단계가 있다.

그런 다음 모델을 훈련하고 적합한 분류기를 반환하는 fit 메서드에 훈련 데이터의 특징과 레이블을 전달한다.

그런 다음 테스트 데이터의 특징과 레이블을 사용하여 모델에 점수를 매긴다.

[10]:
from qiskit_machine_learning.algorithms import PegasosQSVC

pegasos_qsvc = PegasosQSVC(quantum_kernel=qkernel, C=C, num_steps=tau)

# training
pegasos_qsvc.fit(train_features, train_labels)

# testing
pegasos_score = pegasos_qsvc.score(test_features, test_labels)
print(f"PegasosQSVC classification test score: {pegasos_score}")
PegasosQSVC classification test score: 1.0

시각화를 위해 MinMaxScaler에 적용한 최소값과 최대값을 포괄하는 사전 정의된 단계의 격자점을 만든다. 또한 훈련 및 테스트 샘플의 더 나은 표현을 위해 격자에 약간의 마진(margin)을 추가한다.

[11]:
grid_step = 0.2
margin = 0.2
grid_x, grid_y = np.meshgrid(
    np.arange(-margin, np.pi + margin, grid_step), np.arange(-margin, np.pi + margin, grid_step)
)

격자를 모델과 호환되는 모양으로 변환하며 모양은 (n_samples, n_features) 이어야 한다. 그런 다음 각 격자점에 대해 레이블을 예측한다. 예측된 레이블은 격자점의 색상을 지정하는데 사용된다.

[12]:
meshgrid_features = np.column_stack((grid_x.ravel(), grid_y.ravel()))
meshgrid_colors = pegasos_qsvc.predict(meshgrid_features)

마지막으로 모델에서 얻은 레이블/색상에 따라 격자를 그린다. 훈련 및 테스트 샘플들도 그림에 표시한다.

[17]:
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
meshgrid_colors = meshgrid_colors.reshape(grid_x.shape)
plt.pcolormesh(grid_x, grid_y, meshgrid_colors, cmap="RdBu", shading="auto")

plt.scatter(
    train_features[:, 0][train_labels == 0],
    train_features[:, 1][train_labels == 0],
    marker="s",
    facecolors="w",
    edgecolors="r",
    label="A train",
)
plt.scatter(
    train_features[:, 0][train_labels == 1],
    train_features[:, 1][train_labels == 1],
    marker="o",
    facecolors="w",
    edgecolors="b",
    label="B train",
)

plt.scatter(
    test_features[:, 0][test_labels == 0],
    test_features[:, 1][test_labels == 0],
    marker="s",
    facecolors="r",
    edgecolors="r",
    label="A test",
)
plt.scatter(
    test_features[:, 0][test_labels == 1],
    test_features[:, 1][test_labels == 1],
    marker="o",
    facecolors="b",
    edgecolors="b",
    label="B test",
)

plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0.0)
plt.title("Pegasos Classification")
plt.show()
../_images/tutorials_07_pegasos_qsvc_16_0.png
[15]:
import qiskit.tools.jupyter

%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.19.0
qiskit-aer0.8.2
qiskit-ignis0.6.0
qiskit-aqua0.9.2
qiskit0.27.0
qiskit-machine-learning0.3.0
System information
Python3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]
OSWindows
CPUs4
Memory (Gb)31.837730407714844
Fri Dec 03 15:05:23 2021 GMT Standard Time

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.