Encoding data
Pendahuluan dan notasi
Untuk menggunakan algoritma kuantum, data klasik harus dibawa ke dalam Circuit kuantum. Ini biasanya disebut encoding data, tapi juga bisa disebut loading data. Ingat dari pelajaran sebelumnya tentang konsep feature mapping, yaitu pemetaan fitur data dari satu ruang ke ruang lain. Sekadar memindahkan data klasik ke komputer kuantum sudah merupakan semacam pemetaan, dan bisa disebut feature mapping. Dalam praktiknya, feature mapping bawaan di Qiskit (seperti z_Feature Map dan ZZ Feature Map) biasanya menyertakan lapisan rotasi dan lapisan entangling yang memperluas state ke banyak dimensi di Hilbert space. Proses encoding ini adalah bagian kritis dari algoritma quantum machine learning dan langsung memengaruhi kemampuan komputasinya.
Beberapa teknik encoding di bawah ini bisa disimulasikan secara klasik dengan efisien; ini khususnya mudah dilihat pada metode encoding yang menghasilkan product states (artinya, tidak mengentangle Qubit). Dan ingat bahwa quantum utility paling mungkin ada di mana kompleksitas kuantum dari dataset cocok dengan metode encoding. Jadi sangat mungkin kamu akan membuat Circuit encoding sendiri. Di sini, kami menampilkan berbagai strategi encoding yang mungkin supaya kamu bisa membandingkan satu sama lain dan melihat apa yang bisa dilakukan. Ada beberapa pernyataan umum yang bisa dibuat tentang kegunaan teknik encoding. Misalnya, efficient_su2 (lihat di bawah) dengan skema entangling penuh jauh lebih mungkin menangkap fitur kuantum dari data dibanding metode yang menghasilkan product states (seperti z_feature_map). Tapi ini tidak berarti efficient_su2 sudah cukup, atau cukup cocok untuk datasetmu, untuk menghasilkan quantum speed-up. Itu membutuhkan pertimbangan cermat tentang struktur data yang dimodelkan atau diklasifikasikan. Ada juga trade-off dengan kedalaman Circuit, karena banyak feature map yang sepenuhnya mengentangle Qubit dalam Circuit menghasilkan Circuit yang sangat dalam, terlalu dalam untuk mendapatkan hasil yang berguna di komputer kuantum saat ini.
Notasi
Dataset adalah himpunan vektor data: , di mana setiap vektor berdimensi , yaitu . Ini bisa diperluas ke fitur data kompleks. Dalam pelajaran ini, kami sesekali menggunakan notasi untuk himpunan penuh dan elemen spesifiknya seperti . Tapi kami sebagian besar akan mengacu pada loading satu vektor dari dataset kita dalam satu waktu, dan sering hanya menyebut satu vektor dengan fitur sebagai .
Selain itu, biasa menggunakan simbol untuk merujuk pada feature mapping dari vektor data . Dalam komputasi kuantum khususnya, umum untuk merujuk pada pemetaan menggunakan sebuah notasi yang memperkuat sifat uniter dari operasi ini. Keduanya bisa digunakan dengan benar; keduanya adalah feature mapping. Sepanjang kursus ini, kami cenderung menggunakan:
- saat membahas feature mapping dalam machine learning secara umum, dan
- saat membahas implementasi Circuit dari feature mapping.
Normalisasi dan kehilangan informasi
Dalam classical machine learning, fitur data training sering "dinormalisasi" atau diubah skalanya yang sering meningkatkan performa model. Salah satu cara umum melakukan ini adalah dengan menggunakan normalisasi min-max atau standardisasi. Dalam normalisasi min-max, kolom fitur dari matriks data (misalnya, fitur ) dinormalisasi:
di mana min dan max mengacu pada nilai minimum dan maksimum fitur atas vektor data dalam dataset . Semua nilai fitur kemudian berada dalam interval unit: untuk semua , .
Normalisasi juga merupakan konsep fundamental dalam mekanika kuantum dan komputasi kuantum, tapi sedikit berbeda dari normalisasi min-max. Normalisasi dalam mekanika kuantum mensyaratkan bahwa panjang (dalam konteks komputasi kuantum, 2-norm) dari vektor state sama dengan satu: , memastikan bahwa probabilitas pengukuran berjumlah 1. State dinormalisasi dengan membaginya dengan 2-norm; yaitu, dengan mengubah skala
Dalam komputasi kuantum dan mekanika kuantum, ini bukan normalisasi yang dipaksakan orang pada data, tapi properti fundamental dari state kuantum. Bergantung pada skema encoding-mu, batasan ini bisa memengaruhi cara data diubah skalanya. Misalnya, dalam amplitude encoding (lihat di bawah), vektor data dinormalisasi seperti yang disyaratkan oleh mekanika kuantum, dan ini memengaruhi skala data yang di-encode. Dalam phase encoding, nilai fitur disarankan untuk diubah skalanya sebagai agar tidak ada kehilangan informasi akibat efek modulo- dari encoding ke sudut fase Qubit[1,2].
Metode encoding
Dalam beberapa bagian berikutnya, kami akan merujuk pada dataset klasik contoh kecil yang terdiri dari vektor data, masing-masing dengan fitur:
Dalam notasi yang diperkenalkan di atas, kita bisa mengatakan fitur ke- dari vektor data ke- dalam himpunan kita adalah misalnya.
Basis encoding
Basis encoding meng-encode string -bit klasik ke dalam computational basis state dari sistem -Qubit. Ambil contoh Ini bisa direpresentasikan sebagai string -bit sebagai , dan oleh sistem -Qubit sebagai state kuantum . Secara lebih umum, untuk string -bit: , state -Qubit yang sesuai adalah dengan untuk . Perhatikan bahwa ini hanya untuk satu fitur saja.
Basis encoding dalam komputasi kuantum merepresentasikan setiap bit klasik sebagai Qubit terpisah, memetakan representasi biner data langsung ke state kuantum dalam basis komputasi. Ketika beberapa fitur perlu di-encode, setiap fitur pertama dikonversi ke bentuk binernya dan kemudian ditetapkan ke kelompok Qubit yang berbeda — satu kelompok per fitur — di mana setiap Qubit mencerminkan satu bit dalam representasi biner dari fitur tersebut.
Sebagai contoh, mari kita encode vektor (5, 7, 0).
Misalkan semua fitur disimpan dalam empat bit (lebih dari yang kita butuhkan, tapi cukup untuk merepresentasikan bilangan bulat satu digit dalam basis 10):
5 → binary 0101
7 → binary 0111
0 → binary 0000
String bit ini ditetapkan ke tiga set empat Qubit, sehingga basis state 12-Qubit keseluruhan adalah:
Di sini, empat Qubit pertama merepresentasikan fitur pertama, empat Qubit berikutnya fitur kedua, dan empat Qubit terakhir fitur ketiga. Kode di bawah mengonversi vektor data (5,7,0) ke state kuantum, dan digeneralisasi untuk melakukan hal yang sama untuk fitur satu digit lainnya.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit
from qiskit import QuantumCircuit
# Data point to encode
x = 5 # binary: 0101
y = 7 # binary: 0111
z = 0 # binary: 0000
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, "04b")] # [0,1,0,1]
y_bits = [int(b) for b in format(y, "04b")] # [0,1,1,1]
z_bits = [int(b) for b in format(z, "04b")] # [0,0,0,0]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,1,0,1,1,1,0,0,0,0]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw("mpl")

Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Tulis kode untuk meng-encode vektor pertama dalam dataset contoh kita :
menggunakan basis encoding.
Jawaban:
import math
from qiskit import QuantumCircuit
# Data point to encode
x = 4 # binary: 0100
y = 8 # binary: 1000
z = 5 # binary: 0101
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, '04b')] # [0,1,0,0]
y_bits = [int(b) for b in format(y, '04b')] # [1,0,0,0]
z_bits = [int(b) for b in format(z, '04b')] # [0,1,0,1]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,0,1,0,0,0,0,1,0,1]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw('mpl')
Amplitude encoding
Amplitude encoding meng-encode data ke dalam amplitudo dari state kuantum. Ini merepresentasikan vektor data klasik -dimensi yang ternormalisasi, , sebagai amplitudo dari state kuantum -Qubit, :
di mana adalah dimensi vektor data yang sama seperti sebelumnya, adalah elemen ke- dari dan adalah computational basis state ke-. Di sini, adalah konstanta normalisasi yang ditentukan dari data yang di-encode. Ini adalah kondisi normalisasi yang dipaksakan oleh mekanika kuantum:
Secara umum, ini adalah kondisi yang berbeda dari normalisasi min/max yang digunakan untuk setiap fitur di semua vektor data. Cara menavigasinya akan bergantung pada masalahmu. Tapi tidak ada cara untuk menghindari kondisi normalisasi mekanika kuantum di atas.
Dalam amplitude encoding, setiap fitur dalam vektor data disimpan sebagai amplitudo dari state kuantum yang berbeda. Karena sistem Qubit menyediakan amplitudo, amplitude encoding dari fitur membutuhkan Qubit.
Sebagai contoh, mari kita encode vektor pertama dalam dataset contoh , menggunakan amplitude encoding. Menormalisasi vektor yang dihasilkan, kita mendapatkan:
dan state kuantum 2-Qubit yang dihasilkan adalah:
Dalam contoh di atas, jumlah fitur dalam vektor , bukan pangkat dari 2. Ketika bukan pangkat dari 2, kita cukup memilih nilai untuk jumlah Qubit sehingga dan menambahkan padding pada vektor amplitudo dengan konstanta yang tidak informatif (di sini, nol).
Seperti dalam basis encoding, setelah kita menghitung state apa yang akan meng-encode dataset kita, di Qiskit kita bisa menggunakan fungsi initialize untuk menyiapkannya:
import math
desired_state = [
1 / math.sqrt(105) * 4,
1 / math.sqrt(105) * 8,
1 / math.sqrt(105) * 5,
1 / math.sqrt(105) * 0,
]
qc = QuantumCircuit(2)
qc.initialize(desired_state, [0, 1])
qc.decompose(reps=5).draw(output="mpl")
Keuntungan dari amplitude encoding adalah persyaratan hanya Qubit untuk encoding. Namun, algoritma berikutnya harus beroperasi pada amplitudo state kuantum, dan metode untuk menyiapkan dan mengukur state kuantum cenderung tidak efisien.
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Tuliskan state yang ternormalisasi untuk meng-encode vektor berikut (terdiri dari dua vektor dari dataset contoh kita):
menggunakan amplitude encoding.
Jawaban:
Untuk meng-encode 6 angka, kita perlu memiliki setidaknya 6 state yang tersedia di mana amplitudonya bisa di-encode. Ini membutuhkan 3 Qubit. Menggunakan faktor normalisasi yang tidak diketahui , kita bisa menulisnya sebagai:
Perhatikan bahwa
Jadi akhirnya,
Untuk vektor data yang sama tulis kode untuk membuat Circuit yang memuat fitur data ini menggunakan amplitude encoding.
Jawaban:
desired_state = [
9 / math.sqrt(270),
8 / math.sqrt(270),
6 / math.sqrt(270),
2 / math.sqrt(270),
9 / math.sqrt(270),
2 / math.sqrt(270),
0,
0,
]
print(desired_state)
qc = QuantumCircuit(3)
qc.initialize(desired_state, [0, 1, 2])
qc.decompose(reps=8).draw(output="mpl")
[0.5477225575051662, 0.48686449556014766, 0.36514837167011077, 0.12171612389003691, 0.5477225575051662, 0.12171612389003691, 0, 0]
Kamu mungkin perlu menangani vektor data yang sangat besar. Pertimbangkan vektor
Tulis kode untuk mengotomatiskan normalisasi, dan hasilkan Circuit kuantum untuk amplitude encoding.
Jawaban:
Ada banyak kemungkinan jawaban. Berikut adalah kode yang mencetak beberapa langkah di sepanjang jalan:
import numpy as np
from math import sqrt
init_list = [4, 8, 5, 9, 8, 6, 2, 9, 2, 5, 7, 0, 3, 7, 5]
qubits = round(np.log(len(init_list)) / np.log(2) + 0.4999999999)
need_length = 2**qubits
pad = need_length - len(init_list)
for i in range(0, pad):
init_list.append(0)
init_array = np.array(init_list) # Unnormalized data vector
length = sqrt(
sum(init_array[i] ** 2 for i in range(0, len(init_array)))
) # Vector length
norm_array = init_array / length # Normalized array
print("Normalized array:")
print(norm_array)
print()
qubit_numbers = []
for i in range(0, qubits):
qubit_numbers.append(i)
print(qubit_numbers)
qc = QuantumCircuit(qubits)
qc.initialize(norm_array, qubit_numbers)
qc.decompose(reps=7).draw(output="mpl")
Normalized array: [0.17342199 0.34684399 0.21677749 0.39019949 0.34684399 0.26013299 0.086711 0.39019949 0.086711 0.21677749 0.30348849 0. 0.1300665 0.30348849 0.21677749 0. ]
[0, 1, 2, 3]

Apakah kamu melihat keuntungan amplitude encoding dibanding basis encoding? Kalau iya, jelaskan.
Jawaban:
Mungkin ada beberapa jawaban. Salah satu jawabannya adalah bahwa, mengingat urutan basis state yang tetap, amplitude encoding ini mempertahankan urutan angka yang di-encode. Ini juga sering di-encode lebih padat.
Keuntungan dari amplitude encoding adalah bahwa hanya Qubit yang diperlukan untuk vektor data -dimensi (-fitur) . Namun, amplitude encoding pada umumnya adalah prosedur yang tidak efisien yang memerlukan persiapan state sembarang, yang bersifat eksponensial dalam jumlah Gate CNOT. Dengan kata lain, persiapan state memiliki kompleksitas runtime polinomial dalam jumlah dimensi, di mana , dan adalah jumlah Qubit. Amplitude encoding "memberikan penghematan eksponensial dalam ruang dengan biaya peningkatan eksponensial dalam waktu"[3]; namun, peningkatan runtime menjadi dapat dicapai dalam kasus tertentu[4]. Untuk quantum speedup end-to-end, kompleksitas runtime loading data perlu dipertimbangkan.
Angle encoding
Angle encoding menarik perhatian dalam banyak model QML yang menggunakan Pauli feature map seperti quantum support vector machine (QSVM) dan variational quantum circuit (VQC), di antara yang lain. Angle encoding erat kaitannya dengan phase encoding dan dense angle encoding yang disajikan di bawah. Di sini kami akan menggunakan "angle encoding" untuk merujuk pada rotasi dalam , yaitu rotasi menjauhi sumbu yang dilakukan misalnya oleh Gate atau Gate [1,3]. Sebenarnya, data bisa di-encode dalam rotasi manapun atau kombinasi rotasi. Tapi umum dalam literatur, jadi kami menekankannya di sini.
Ketika diterapkan pada satu Qubit, angle encoding memberikan rotasi sumbu Y yang proporsional dengan nilai data. Pertimbangkan encoding satu fitur ke- dari vektor data ke- dalam dataset, :
Sebagai alternatif, angle encoding bisa dilakukan menggunakan Gate , meskipun state yang di-encode akan memiliki fase relatif kompleks dibandingkan dengan .
Angle encoding berbeda dari dua metode sebelumnya yang dibahas dalam beberapa hal. Dalam angle encoding:
- Setiap nilai fitur dipetakan ke Qubit yang sesuai, , meninggalkan Qubit dalam product state.
- Satu nilai numerik di-encode dalam satu waktu, bukan seluruh set fitur dari satu titik data.
- Qubit diperlukan untuk fitur data, di mana . Sering kali kesetaraan berlaku di sini. Kita akan melihat bagaimana bisa terjadi di beberapa bagian berikutnya.
- Circuit kuantum yang dihasilkan memiliki kedalaman konstan (biasanya kedalaman 1 sebelum transpilasi).
Circuit kuantum kedalaman konstan membuatnya sangat cocok untuk hardware kuantum saat ini. Satu fitur tambahan dari encoding data menggunakan (dan khususnya, pilihan kita untuk menggunakan Y-axis angle encoding) adalah bahwa ia menciptakan state kuantum bernilai real yang bisa berguna untuk aplikasi tertentu. Untuk rotasi sumbu Y, data dipetakan dengan Gate rotasi sumbu Y dengan sudut bernilai real (Qiskit RYGate). Seperti dengan phase encoding (lihat di bawah), kami menyarankan agar kamu mengubah skala data sehingga , mencegah kehilangan informasi dan efek yang tidak diinginkan lainnya.
Kode Qiskit berikut merotasi satu Qubit dari state awal untuk meng-encode nilai data .
from qiskit.quantum_info import Statevector
from math import pi
qc = QuantumCircuit(1)
state1 = Statevector.from_instruction(qc)
qc.ry(pi / 2, 0) # Phase gate rotates by an angle pi/2
state2 = Statevector.from_instruction(qc)
states = state1, state2
Kita akan mendefinisikan fungsi untuk memvisualisasikan aksi pada vektor state. Detail definisi fungsi tidak penting, tapi kemampuan untuk memvisualisasikan vektor state dan perubahannya itu penting.
import numpy as np
from qiskit.visualization.bloch import Bloch
from qiskit.visualization.state_visualization import _bloch_multivector_data
def plot_Nstates(states, axis, plot_trace_points=True):
"""This function plots N states to 1 Bloch sphere"""
bloch_vecs = [_bloch_multivector_data(s)[0] for s in states]
if axis is None:
bloch_plot = Bloch()
else:
bloch_plot = Bloch(axes=axis)
bloch_plot.add_vectors(bloch_vecs)
if len(states) > 1:
def rgba_map(x, num):
g = (0.95 - 0.05) / (num - 1)
i = 0.95 - g * num
y = g * x + i
return (0.0, y, 0.0, 0.7)
num = len(states)
bloch_plot.vector_color = [rgba_map(x, num) for x in range(1, num + 1)]
bloch_plot.vector_width = 3
bloch_plot.vector_style = "simple"
if plot_trace_points:
def trace_points(bloch_vec1, bloch_vec2):
# bloch_vec = (x,y,z)
n_points = 15
thetas = np.arccos([bloch_vec1[2], bloch_vec2[2]])
phis = np.arctan2(
[bloch_vec1[1], bloch_vec2[1]], [bloch_vec1[0], bloch_vec2[0]]
)
if phis[1] < 0:
phis[1] = phis[1] + 2 * pi
angles0 = np.linspace(phis[0], phis[1], n_points)
angles1 = np.linspace(thetas[0], thetas[1], n_points)
xp = np.cos(angles0) * np.sin(angles1)
yp = np.sin(angles0) * np.sin(angles1)
zp = np.cos(angles1)
pnts = [xp, yp, zp]
bloch_plot.add_points(pnts)
bloch_plot.point_color = "k"
bloch_plot.point_size = [4] * len(bloch_plot.points)
bloch_plot.point_marker = ["o"]
for i in range(len(bloch_vecs) - 1):
trace_points(bloch_vecs[i], bloch_vecs[i + 1])
bloch_plot.sphere_alpha = 0.05
bloch_plot.frame_alpha = 0.15
bloch_plot.figsize = [4, 4]
bloch_plot.render()
plot_Nstates(states, axis=None, plot_trace_points=True)
Itu baru satu fitur dari satu vektor data. Ketika meng-encode fitur ke dalam sudut rotasi dari Qubit, misalnya untuk vektor data ke- product state yang di-encode akan terlihat seperti ini:
Kita perhatikan bahwa ini ekuivalen dengan
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Encode vektor data menggunakan angle encoding, seperti yang dijelaskan di atas.
Jawaban:
qc = QuantumCircuit(3)
qc.ry(0, 0)
qc.ry(2 * math.pi / 4, 1)
qc.ry(2 * math.pi / 2, 2)
qc.draw(output="mpl")
Menggunakan angle encoding seperti yang dijelaskan di atas, berapa banyak Qubit yang diperlukan untuk meng-encode 5 fitur?
Jawaban: 5
Phase encoding
Phase encoding sangat mirip dengan angle encoding yang dijelaskan di atas. Sudut fase dari sebuah Qubit adalah sudut bernilai real terhadap sumbu dari sumbu +. Data dipetakan dengan rotasi fase, , di mana (lihat Qiskit PhaseGate untuk informasi lebih lanjut). Disarankan untuk mengubah skala data sehingga . Ini mencegah kehilangan informasi dan efek yang berpotensi tidak diinginkan lainnya[1,2].
Sebuah Qubit sering diinisialisasi dalam state , yang merupakan eigenstate dari operator rotasi fase, artinya state Qubit pertama-tama perlu dirotasi agar phase encoding dapat diimplementasikan. Oleh karena itu masuk akal untuk menginisialisasi state dengan Gate Hadamard: . Phase encoding pada satu Qubit berarti memberikan fase relatif yang proporsional dengan nilai data:
Prosedur phase encoding memetakan setiap nilai fitur ke fase dari Qubit yang sesuai, . Secara keseluruhan, phase encoding memiliki kedalaman Circuit 2, termasuk lapisan Hadamard, yang membuatnya menjadi skema encoding yang efisien. State multi-Qubit yang di-encode dengan phase ( Qubit untuk fitur) adalah product state:
Kode Qiskit berikut pertama menyiapkan state awal satu Qubit dengan merotasinya menggunakan Gate Hadamard, kemudian merotasinya lagi menggunakan Gate fase untuk meng-encode fitur data .
qc = QuantumCircuit(1)
qc.h(0) # Hadamard gate rotates state down to Bloch equator
state1 = Statevector.from_instruction(qc)
qc.p(pi / 2, 0) # Phase gate rotates by an angle pi/2
state2 = Statevector.from_instruction(qc)
states = state1, state2
qc.draw("mpl", scale=1)
Kita bisa memvisualisasikan rotasi dalam menggunakan fungsi plot_Nstates yang sudah kita definisikan.
plot_Nstates(states, axis=None, plot_trace_points=True)
Plot Bloch sphere menampilkan rotasi sumbu Z di mana . Panah hijau muda menunjukkan state akhir.
Phase encoding digunakan dalam banyak quantum feature map, khususnya feature map dan , serta Pauli feature map umum, di antara yang lain.
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Berapa banyak Qubit yang diperlukan untuk menggunakan phase encoding seperti yang dijelaskan di atas untuk menyimpan 8 fitur?
Jawaban: 8
Tulis kode untuk vektor menggunakan phase encoding.
Jawaban:
Mungkin ada banyak jawaban. Berikut satu contoh:
phase_data = [4, 8, 5, 9, 8, 6, 2, 9, 2, 5, 7, 0]
qc = QuantumCircuit(len(phase_data))
for i in range(0, len(phase_data)):
qc.h(i)
qc.rz(phase_data[i] * 2 * math.pi / float(max(phase_data)), i)
qc.draw(output="mpl")
Dense angle encoding
Dense angle encoding (DAE) adalah kombinasi dari angle encoding dan phase encoding. DAE memungkinkan dua nilai fitur di-encode dalam satu Qubit: satu sudut dengan sudut rotasi sumbu Y, dan yang lainnya dengan sudut rotasi sumbu : . DAE meng-encode dua fitur sebagai berikut:
Meng-encode dua fitur data ke satu Qubit menghasilkan pengurangan dalam jumlah Qubit yang diperlukan untuk encoding. Memperluas ini ke lebih banyak fitur, vektor data bisa di-encode sebagai:
DAE bisa digeneralisasi ke fungsi sembarang dari dua fitur alih-alih fungsi sinusoidal yang digunakan di sini. Ini disebut general qubit encoding[7].
Sebagai contoh DAE, kode di bawah meng-encode dan memvisualisasikan encoding fitur dan .
qc = QuantumCircuit(1)
state1 = Statevector.from_instruction(qc)
qc.ry(3 * pi / 8, 0)
state2 = Statevector.from_instruction(qc)
qc.rz(7 * pi / 4, 0)
state3 = Statevector.from_instruction(qc)
states = state1, state2, state3
plot_Nstates(states, axis=None, plot_trace_points=True)
Cek pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk melihat solusinya.
Berdasarkan pembahasan di atas, berapa banyak Qubit yang diperlukan untuk meng-encode 6 fitur menggunakan dense encoding?
Jawaban: 3
Tulis kode untuk memuat vektor menggunakan dense angle encoding.
Jawaban:
Perhatikan bahwa kita telah menambahkan padding dengan "0" pada daftar untuk menghindari masalah adanya satu parameter yang tidak terpakai dalam skema encoding kita.
dense_data = [4, 8, 5, 9, 8, 6, 2, 9, 2, 5, 7, 0, 3, 7, 5, 0]
qc = QuantumCircuit(int(len(dense_data) / 2))
entry = 0
for i in range(0, int(len(dense_data) / 2)):
qc.ry(dense_data[entry] * 2 * math.pi / float(max(dense_data)), i)
entry = entry + 1
qc.rz(dense_data[entry] * 2 * math.pi / float(max(dense_data)), i)
entry = entry + 1
qc.draw(output="mpl")
Encoding dengan feature map bawaan
Encoding di titik sembarang
Angle encoding, phase encoding, dan dense encoding menyiapkan product state dengan satu fitur yang di-encode di setiap qubit (atau dua fitur per qubit). Ini berbeda dari basis encoding dan amplitude encoding, di mana metode tersebut memanfaatkan entangled state. Tidak ada korespondensi 1:1 antara fitur data dan qubit. Dalam amplitude encoding, misalnya, kamu mungkin memiliki satu fitur sebagai amplitudo dari state dan fitur lain sebagai amplitudo untuk . Secara umum, metode yang melakukan encoding dalam product state menghasilkan Circuit yang lebih dangkal dan dapat menyimpan 1 atau 2 fitur di setiap qubit. Metode yang menggunakan entanglement dan mengasosiasikan fitur dengan state alih-alih qubit menghasilkan Circuit yang lebih dalam, dan rata-rata dapat menyimpan lebih banyak fitur per qubit.
Namun encoding tidak harus seluruhnya dalam product state atau seluruhnya dalam entangled state seperti pada amplitude encoding. Memang, banyak skema encoding yang sudah ada di Qiskit memungkinkan encoding baik sebelum maupun setelah layer entanglement, bukan hanya di awal. Ini dikenal sebagai "data reuploading". Untuk referensi terkait, lihat referensi [5] dan [6].
Di bagian ini, kita akan menggunakan dan memvisualisasikan beberapa skema encoding bawaan. Semua metode di bagian ini melakukan encoding fitur sebagai rotasi pada parameterized gate pada qubit, di mana . Perlu diingat bahwa memaksimalkan pemuatan data untuk jumlah qubit tertentu bukan satu-satunya pertimbangan. Dalam banyak kasus, kedalaman Circuit bisa menjadi pertimbangan yang bahkan lebih penting daripada jumlah qubit.
Efficient SU2
Contoh umum dan berguna dari encoding dengan entanglement adalah Circuit efficient_su2 dari Qiskit. Yang mengesankan, Circuit ini bisa, misalnya, melakukan encoding 8 fitur hanya pada 2 qubit. Mari kita lihat ini, lalu coba pahami bagaimana hal itu memungkinkan.
from qiskit.circuit.library import efficient_su2
circuit = efficient_su2(num_qubits=2, reps=1, insert_barriers=True)
circuit.decompose().draw(output="mpl")
Saat kita menuliskan state, kita akan menggunakan konvensi Qiskit bahwa qubit dengan signifikansi terendah diurutkan di posisi paling kanan, seperti pada atau State-state ini bisa menjadi sangat rumit dengan sangat cepat, dan contoh yang jarang ini mungkin membantu menjelaskan mengapa state semacam itu jarang dituliskan secara eksplisit.
Sistem kita dimulai dalam state Sampai barrier pertama (titik yang kita beri label ), state kita adalah:
Itu hanya dense encoding, yang sudah kita lihat sebelumnya. Sekarang setelah Gate CNOT, pada barrier kedua (), state kita adalah
Sekarang kita terapkan set rotasi qubit tunggal terakhir dan kumpulkan state-state yang sejenis untuk mendapatkan: