Pag-encode ng data
Panimula at notasyon
Para magamit ang isang quantum algorithm, kailangang mailagay ang klasikal na data sa isang quantum circuit. Karaniwang tinatawag itong encoding ng data, pero tinatawag din itong loading ng data. Alalahanin mula sa mga nakaraang aralin ang konsepto ng feature mapping — isang pagmamapa ng mga feature ng data mula sa isang espasyo patungo sa isa pa. Ang simpleng paglipat ng klasikal na data sa isang quantum computer ay isang uri ng pagmamapa, at maaaring tawagin na feature mapping. Sa praktika, ang mga built-in na feature mapping sa Qiskit (tulad ng ZFeatureMap at ZZFeatureMap) ay karaniwang may kasamang mga rotation layer at entangling layer na nagpapalawak ng estado sa maraming dimensyon sa Hilbert space. Ang proseso ng encoding na ito ay isang kritikal na bahagi ng mga quantum machine learning algorithm at direktang nakakaapekto sa kanilang kakayahang pangkomputa.
Ang ilang mga teknik ng encoding na nakalista sa ibaba ay maaaring mahusay na gayahin nang klasikal; partikular na malinaw ito sa mga paraan ng encoding na nagbibigay ng mga product state (ibig sabihin, hindi nila inaasosya ang mga qubit). At tandaan na ang quantum utility ay pinaka-malamang na matatagpuan kung saan ang quantum-like na kumplikado ng dataset ay naaayon sa paraan ng encoding. Kaya't malamang na magsusulat ka ng sariling mga encoding circuit. Dito, nagpapakita tayo ng malawak na hanay ng mga posibleng estratehiya ng encoding para makapaghambing at makapagkumpara ng iba't ibang pamamaraan, at para makita kung ano ang posible. May ilang napaka-pangkalahatang pahayag na maaaring gawin tungkol sa pagiging kapaki-pakinabang ng mga teknik sa encoding. Halimbawa, ang efficient_su2 (tingnan sa ibaba) na may kumpletong entangling scheme ay mas malamang na makakuha ng mga quantum feature ng data kaysa sa mga pamamaraang nagbibigay ng product state (tulad ng z_feature_map). Ngunit hindi ito nangangahulugang sapat ang efficient_su2, o sapat na akma sa iyong dataset, para magbunga ng quantum speed-up. Nangangailangan iyon ng maingat na pagsasaalang-alang sa istruktura ng data na kino-modelo o ikinlasipika. May balancing act din pagdating sa lalim ng circuit, dahil maraming feature map na ganap na nag-iimplicate ng mga qubit sa isang circuit ay nagbubunga ng napakalalim na mga circuit — masyadong malalim para makakuha ng magagamit na resulta sa mga kasalukuyang quantum computer.
Notasyon
Ang isang dataset ay isang set ng na mga data vector: , kung saan ang bawat vector ay may na dimensyon, iyon ay, . Maaari itong palawigin para sa mga kumplikadong feature ng data. Sa araling ito, paminsan-minsan ay gagamitin natin ang mga notasyong ito para sa buong set at ang mga partikular na elemento nito tulad ng . Ngunit kadalasan ay mag-iisip tayo tungkol sa pag-load ng isang vector mula sa ating dataset sa isang pagkakataon, at madalas na simpleng tatawagin ang isang vector ng na feature bilang .
Bukod dito, karaniwang ginagamit ang simbolo para tumukoy sa feature mapping ng data vector . Sa quantum computing lalo na, karaniwang ginagamit ang para tumukoy sa mga pagmamapa — isang notasyon na nagpapalakas ng unitary na katangian ng mga operasyong ito. Maaaring tamang gamitin ang parehong simbolo para sa pareho; parehong feature mapping ang dalawa. Sa buong kursong ito, ginagamit natin:
- kapag tinatalakay ang mga feature mapping sa machine learning sa pangkalahatan, at
- kapag tinatalakay ang mga circuit implementation ng feature mapping.
Normalization at pagkawala ng impormasyon
Sa klasikal na machine learning, ang mga feature ng training data ay madalas na "nino-normalize" o binabago ang sukat, na kadalasang nagpapabuti ng pagganap ng modelo. Isang karaniwang paraan nito ay ang paggamit ng min-max normalization o standardization. Sa min-max normalization, ang mga feature column ng data matrix (sabihin, feature ) ay nino-normalize:
kung saan ang min at max ay tumutukoy sa pinakamaliit at pinakamalaking halaga ng feature sa na data vector sa dataset . Lahat ng halaga ng feature ay napapaloob sa unit interval: para sa lahat ng , .
Ang normalization ay isang pangunahing konsepto rin sa quantum mechanics at quantum computing, ngunit bahagyang naiiba ito sa min-max normalization. Ang normalization sa quantum mechanics ay nangangailangan na ang haba (sa konteksto ng quantum computing, ang 2-norm) ng isang state vector ay katumbas ng isa: , na tinitiyak na ang mga probability ng pagsukat ay nagkakabuong 1. Nino-normalize ang estado sa pamamagitan ng paghahati sa 2-norm; iyon ay, sa pamamagitan ng pag-rescale ng
Sa quantum computing at quantum mechanics, hindi ito isang normalization na ipinapataw ng mga tao sa data, kundi isang pangunahing katangian ng mga quantum state. Depende sa iyong encoding scheme, maaaring makaapekto ang limitasyong ito sa kung paano nire-rescale ang iyong data. Halimbawa, sa amplitude encoding (tingnan sa ibaba), nino-normalize ang data vector ayon sa kinakailangan ng quantum mechanics, at ito ay nakakaapekto sa sukat ng data na ine-encode. Sa phase encoding, inirerekomenda na i-rescale ang mga halaga ng feature bilang para walang pagkawala ng impormasyon dahil sa modulo- na epekto ng pag-encode sa isang qubit phase angle[1,2].
Mga paraan ng encoding
Sa susunod na ilang seksyon, magsasanggunian tayo sa isang maliit na halimbawang klasikal na dataset na binubuo ng na data vector, bawat isa ay may na feature:
Sa notasyong inilarawan sa itaas, maaari nating sabihin na ang na feature ng na data vector sa ating set ay halimbawa.
Basis encoding
Ang basis encoding ay nagko-encode ng klasikal na -bit na string sa isang computational basis state ng isang -qubit na sistema. Halimbawa, Maaari itong irepresenta bilang isang -bit na string bilang , at ng isang -qubit na sistema bilang quantum state na . Sa pangkalahatan, para sa isang -bit na string: , ang katumbas na -qubit na estado ay na may para sa . Tandaan na para lamang ito sa isang feature.
Ang basis encoding sa quantum computing ay kumakatawan sa bawat klasikal na bit bilang isang hiwalay na qubit, na direktang nagmamapa ng binary na representasyon ng data sa mga quantum state sa computational basis. Kapag kailangan ng encoding ng maraming feature, bawat feature ay unang kino-convert sa binary form nito at pagkatapos ay itinalaga sa isang natatanging grupo ng mga qubit — isang grupo bawat feature — kung saan ang bawat qubit ay sumasalamin sa isang bit sa binary na representasyon ng feature na iyon.
Bilang halimbawa, i-encode natin ang vector (5, 7, 0).
Ipagpalagay na lahat ng feature ay naka-imbak sa apat na bit (higit pa sa kailangan natin, ngunit sapat para kumatawan sa anumang integer na isang digit sa base 10):
5 → binary 0101
7 → binary 0111
0 → binary 0000
Ang mga bit string na ito ay itinalaga sa tatlong set ng apat na qubit, kaya ang kabuuang 12-qubit basis state ay:
Dito, ang unang apat na qubit ay kumakatawan sa unang feature, ang susunod na apat na qubit ay sa ikalawang feature, at ang huling apat na qubit ay sa ikatlong feature. Ang code sa ibaba ay nagco-convert ng data vector (5,7,0) sa isang quantum state, at ginawang pangkalahatan para magawa rin ito para sa iba pang single-digit na feature.
# 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")

Suriin ang iyong pag-unawa
Basahin ang tanong sa ibaba, isipin ang iyong sagot, pagkatapos ay i-click ang tatsulok para makita ang solusyon.
Sumulat ng code para i-encode ang unang vector sa ating halimbawang dataset :
gamit ang basis encoding.
Sagot:
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
Ang amplitude encoding ay nagko-encode ng data sa mga amplitude ng isang quantum state. Kinakatawan nito ang isang normalized na klasikal na -dimensional na data vector, , bilang mga amplitude ng isang -qubit na quantum state, :
kung saan ang ay ang parehong dimensyon ng mga data vector tulad ng dati, ang ay ang na elemento ng at ang ay ang na computational basis state. Dito, ang ay isang normalization constant na matutukoy mula sa data na ine-encode. Ito ang normalization condition na ipinapataw ng quantum mechanics:
Sa pangkalahatan, ito ay ibang kondisyon kaysa sa min/max normalization na ginagamit para sa bawat feature sa lahat ng data vector. Kung paano ito haharapin ay depende sa iyong problema. Ngunit walang paraan para maiwasan ang quantum mechanical normalization condition sa itaas.
Sa amplitude encoding, bawat feature sa isang data vector ay naka-imbak bilang amplitude ng ibang quantum state. Dahil ang isang sistema ng na qubit ay nagbibigay ng na amplitude, ang amplitude encoding ng na feature ay nangangailangan ng na qubit.
Bilang halimbawa, i-encode natin ang unang vector sa ating halimbawang dataset , ang gamit ang amplitude encoding. Sa pag-normalize ng resultang vector, nakukuha natin:
at ang resultang 2-qubit na quantum state ay magiging:
Sa halimbawa sa itaas, ang bilang ng mga feature sa vector ay hindi isang kapangyarihan ng 2. Kapag ang ay hindi isang kapangyarihan ng 2, pumipili lang tayo ng halaga para sa bilang ng mga qubit na may at dino-dagdagan ang amplitude vector ng mga walang-impormasyon na konstante (dito, isang zero).
Tulad ng sa basis encoding, kapag nakalkulan na natin kung anong estado ang mag-eencode ng ating dataset, sa Qiskit ay maaari nating gamitin ang function na initialize para ihanda ito:
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")
Isang kalamangan ng amplitude encoding ay ang nabanggit na pangangailangan ng na qubit lamang para mag-encode. Gayunpaman, ang mga kasunod na algorithm ay kailangang gumana sa mga amplitude ng isang quantum state, at ang mga pamamaraan para ihanda at sukatin ang mga quantum state ay karaniwang hindi mahusay.
Suriin ang iyong pag-unawa
Basahin ang mga tanong sa ibaba, isipin ang iyong mga sagot, pagkatapos ay i-click ang mga tatsulok para makita ang mga solusyon.
Isulat ang normalized na estado para sa pag-encode ng sumusunod na vector (na binubuo ng dalawang vector mula sa ating halimbawang dataset):
gamit ang amplitude encoding.
Sagot:
Para mag-encode ng 6 na numero, kailangan nating magkaroon ng hindi bababa sa 6 na available na estado na sa mga amplitude nito ay maaari tayong mag-encode. Mangangailangan ito ng 3 qubit. Gamit ang hindi kilalang normalization factor na , maaari nating isulat ito bilang:
Tandaan na
Kaya sa wakas,
Para sa parehong data vector sumulat ng code para gumawa ng circuit na naglo-load ng mga feature ng data na ito gamit ang amplitude encoding.
Sagot:
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]
Maaaring kailangan mong harapin ang napakalalaking mga data vector. Isaalang-alang ang vector
Sumulat ng code para i-automate ang normalization, at gumawa ng quantum circuit para sa amplitude encoding.
Sagot:
Maraming posibleng sagot. Narito ang code na nagpi-print ng ilang hakbang sa daan:
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]

Nakikita ba ang mga kalamangan ng amplitude encoding kumpara sa basis encoding? Kung ganoon, ipaliwanag.
Sagot:
Maaaring may ilang sagot. Isang sagot ay ang, dahil sa nakaayos na pagkakasunud-sunod ng mga basis state, pinapanatili ng amplitude encoding na ito ang pagkakasunud-sunod ng mga numero na ine-encode. Kadalasan ay mas siksik din ang encoding nito.
Isang kalamangan ng amplitude encoding ay ang na qubit lamang ang kailangan para sa isang -dimensional (-feature) na data vector . Gayunpaman, ang amplitude encoding ay karaniwang isang hindi mahusay na proseso na nangangailangan ng arbitrary state preparation, na exponential sa bilang ng CNOT gate. Sa madaling salita, ang state preparation ay may polynomial runtime complexity na sa bilang ng mga dimensyon, kung saan ang , at ang ay ang bilang ng mga qubit. Ang amplitude encoding ay "nagbibigay ng exponential na pagtitipid sa espasyo sa halaga ng exponential na pagtaas sa oras"[3]; gayunpaman, ang mga pagtaas ng runtime patungo sa ay makakamit sa ilang partikular na kaso[4]. Para sa end-to-end quantum speedup, kailangang isaalang-alang ang runtime complexity ng pag-load ng data.
Angle encoding
Ang angle encoding ay may interes sa maraming QML model na gumagamit ng Pauli feature map tulad ng quantum support vector machine (QSVM) at variational quantum circuit (VQC), bukod sa iba pa. Ang angle encoding ay malapit na nauugnay sa phase encoding at dense angle encoding na ipinepresenta sa ibaba. Dito ay gagamitin natin ang "angle encoding" para tumukoy sa isang rotasyon sa , iyon ay, isang rotasyon palayo sa axis na nagagawa halimbawa ng isang gate o isang gate[1,3]. Sa katunayan, maaaring mag-encode ng data sa anumang rotasyon o kombinasyon ng mga rotasyon. Ngunit ang ay karaniwan sa literatura, kaya binibigyang-diin natin ito dito.
Kapag inilapat sa isang qubit, ang angle encoding ay nagdadala ng Y-axis rotation na proporsyonal sa halaga ng data. Isaalang-alang ang encoding ng isang () na feature mula sa na data vector sa isang dataset, :
Bilang alternatibo, maaaring gamitin ang mga gate para sa angle encoding, kahit na ang naka-encode na estado ay magkakaroon ng kumplikadong relative phase kumpara sa .
Ang angle encoding ay naiiba sa dalawang nakaraang pamamaraan na tinalakay sa ilang paraan. Sa angle encoding:
- Ang bawat halaga ng feature ay naimimapa sa isang katumbas na qubit, , na nag-iiwan sa mga qubit sa isang product state.
- Isang numerical na halaga ang ine-encode sa isang pagkakataon, sa halip na isang buong set ng mga feature mula sa isang data point.
- Kailangan ng qubit para sa na data feature, kung saan ang . Madalas na pantay ang dalawa dito. Makikita natin kung paano posible ang sa mga susunod na seksyon.
- Ang resultang circuit ay may constant depth (karaniwang 1 ang depth bago ang transpilation).
Ang constant depth quantum circuit ay partikular na angkop para sa kasalukuyang quantum hardware. Isang karagdagang katangian ng pag-encode ng aming data gamit ang (at lalo na, ang aming pagpili na gumamit ng Y-axis angle encoding) ay gumagawa ito ng mga real-valued quantum state na maaaring maging kapaki-pakinabang para sa ilang partikular na aplikasyon. Para sa Y-axis rotation, ang data ay naimimapa gamit ang isang Y-axis rotation gate na sa pamamagitan ng isang real-valued angle (Qiskit RYGate). Tulad ng sa phase encoding (tingnan sa ibaba), inirerekomenda na i-rescale ang data para ang , na pumipigil sa pagkawala ng impormasyon at iba pang hindi gustong mga epekto.
Ang sumusunod na Qiskit code ay nag-rorate ng isang qubit mula sa paunang estado para mag-encode ng halaga ng data na .
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
Magtutukoy tayo ng function para ma-visualize ang aksyon sa state vector. Hindi mahalaga ang mga detalye ng kahulugan ng function, ngunit mahalaga ang kakayahang ma-visualize ang mga state vector at ang kanilang mga pagbabago.
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)
Isang feature lamang ng isang data vector iyon. Kapag nagko-encode ng na feature sa mga rotation angle ng na qubit, sabihin para sa na data vector ang naka-encode na product state ay magmumukhang ganito:
Tandaan na katumbas ito ng
Suriin ang iyong pag-unawa
Basahin ang mga tanong sa ibaba, isipin ang iyong mga sagot, pagkatapos ay i-click ang mga tatsulok para makita ang mga solusyon.
I-encode ang data vector gamit ang angle encoding, gaya ng inilarawan sa itaas.
Sagot:
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")
Gamit ang angle encoding gaya ng inilarawan sa itaas, ilang qubit ang kailangan para mag-encode ng 5 feature?
Sagot: 5
Phase encoding
Ang phase encoding ay napaka-katulad ng angle encoding na inilarawan sa itaas. Ang phase angle ng isang qubit ay isang real-valued na anggulo tungkol sa -axis mula sa +-axis. Ang data ay naimimapa gamit ang isang phase rotation, , kung saan ang (tingnan ang Qiskit PhaseGate para sa karagdagang impormasyon). Inirerekomenda na i-rescale ang data para ang . Pinipigilan nito ang pagkawala ng impormasyon at iba pang potensyal na hindi gustong mga epekto[1,2].
Ang isang qubit ay kadalasang ini-initialize sa estado , na isang eigenstate ng phase rotation operator, ibig sabihin ang estado ng qubit ay kailangang i-rotate muna bago maipatupad ang phase encoding. Kaya makatutuwirang i-initialize ang estado gamit ang isang Hadamard gate: . Ang phase encoding sa isang qubit ay nangangahulugang magbigay ng relative phase na proporsyonal sa halaga ng data:
Ang proseso ng phase encoding ay naimimapa ang bawat halaga ng feature sa phase ng isang katumbas na qubit, . Sa kabuuan, ang phase encoding ay may circuit depth na 2, kasama ang Hadamard layer, na ginagawa itong isang mahusay na encoding scheme. Ang phase-encoded multi-qubit state ( qubit para sa na feature) ay isang product state:
Ang sumusunod na Qiskit code ay unang inihahanda ang paunang estado ng isang qubit sa pamamagitan ng pag-rotate nito gamit ang isang Hadamard gate, pagkatapos ay ino-rotate ito muli gamit ang isang phase gate para mag-encode ng feature ng data na .
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)
Maaari nating ma-visualize ang rotasyon sa gamit ang function na plot_Nstates na ating tinukoy.
plot_Nstates(states, axis=None, plot_trace_points=True)
Ang Bloch sphere plot ay nagpapakita ng Z-axis rotation kung saan ang . Ang light green na arrow ay nagpapakita ng huling estado.
Ang phase encoding ay ginagamit sa maraming quantum feature map, partikular na ang at feature map, at pangkalahatang Pauli feature map, bukod sa iba pa.
Suriin ang iyong pag-unawa
Basahin ang mga tanong sa ibaba, isipin ang iyong mga sagot, pagkatapos ay i-click ang mga tatsulok para makita ang mga solusyon.
Ilang qubit ang kailangan para gumamit ng phase encoding gaya ng inilarawan sa itaas para mag-imbak ng 8 feature?
Sagot: 8
Sumulat ng code para sa vector gamit ang phase encoding.
Sagot:
Maaaring may maraming sagot. Narito ang isang halimbawa:
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
Ang dense angle encoding (DAE) ay isang kombinasyon ng angle encoding at phase encoding. Pinapayagan ng DAE ang dalawang halaga ng feature na ma-encode sa isang qubit: isa ay may Y-axis rotation angle, at ang isa pa ay may -axis rotation angle: . Ini-encode nito ang dalawang feature tulad ng sumusunod:
Ang pag-encode ng dalawang feature ng data sa isang qubit ay nagresulta sa na pagbabawas sa bilang ng mga qubit na kailangan para sa encoding. Sa pagpapalawak nito sa mas maraming feature, ang data vector na ay maaaring ma-encode bilang:
Ang DAE ay maaaring palawigin para sa arbitrary na mga function ng dalawang feature sa halip na ang mga sinusoidal na function na ginagamit dito. Ito ay tinatawag na pangkalahatang qubit encoding[7].
Bilang halimbawa ng DAE, ang code sa ibaba ay nagko-code at nagvi-visualize ng encoding ng mga feature at .
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)
Suriin ang iyong pag-unawa
Basahin ang mga tanong sa ibaba, isipin ang iyong mga sagot, pagkatapos ay i-click ang mga tatsulok para makita ang mga solusyon.
Batay sa pagtrato sa itaas, ilang qubit ang kailangan para mag-encode ng 6 na feature gamit ang dense encoding?
Sagot: 3
Sumulat ng code para i-load ang vector gamit ang dense angle encoding.
Sagot:
Tandaan na dino-dagdagan natin ang listahan ng isang "0" para maiwasan ang problema ng pagkakaroon ng isang hindi nagamit na parameter sa ating encoding scheme.
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")
Pag-encode gamit ang mga built-in na feature map
Pag-encode sa mga arbitrary na punto
Ang angle encoding, phase encoding, at dense encoding ay naghahanda ng mga product state na may isang feature na naka-encode sa bawat qubit (o dalawang feature bawat qubit). Ito ay naiiba sa basis encoding at amplitude encoding, dahil ang mga pamamaraang iyon ay gumagamit ng mga entangled state. Walang 1:1 na ugnayan sa pagitan ng isang data feature at isang qubit. Sa amplitude encoding, halimbawa, maaaring may isang feature bilang amplitude ng state at isa pang feature bilang amplitude ng . Sa pangkalahatan, ang mga pamamaraang nag-e-encode sa product states ay nagbubunga ng mas mababaw na circuits at kayang mag-imbak ng 1 o 2 na feature sa bawat qubit. Ang mga pamamaraang gumagamit ng entanglement at nag-uugnay ng isang feature sa isang state sa halip na sa isang qubit ay nagbubunga ng mas malalim na circuits, at kayang mag-imbak ng mas maraming feature bawat qubit sa karaniwan.
Ngunit hindi kailangang maging ganap na nasa product states o ganap na nasa entangled states ang encoding tulad ng sa amplitude encoding. Sa katunayan, maraming encoding scheme na built-in sa Qiskit ang nagpapahintulot ng encoding bago at pagkatapos ng isang entanglement layer, kumpara sa pag-encode lamang sa simula. Ito ay tinatawag na "data reuploading". Para sa kaugnay na pananaliksik, tingnan ang mga sanggunian [5] at [6].
Sa seksyong ito, gagamitin at ivi-visualize natin ang ilang built-in na encoding scheme. Lahat ng pamamaraan sa seksyong ito ay nag-e-encode ng na feature bilang mga rotasyon sa na parameterized gate sa qubit, kung saan . Tandaan na ang pag-maximize ng data loading para sa isang tiyak na bilang ng qubit ay hindi lang ang dapat isaalang-alang. Sa maraming kaso, ang lalim ng circuit ay maaaring mas mahalaga pa kaysa sa bilang ng qubit.
Efficient SU2
Isang karaniwang at kapaki-pakinabang na halimbawa ng pag-encode na may entanglement ay ang efficient_su2 circuit ng Qiskit. Kahanga-hanga, ang circuit na ito ay kayang, halimbawa, mag-encode ng 8 na feature sa 2 qubit lamang. Tignan natin ito, at pagkatapos ay subukang unawain kung paano ito posible.
from qiskit.circuit.library import efficient_su2
circuit = efficient_su2(num_qubits=2, reps=1, insert_barriers=True)
circuit.decompose().draw(output="mpl")
Habang isinusulat natin ang ating state, gagamitin natin ang Qiskit convention na ang mga least-significant qubit ay nakaayos sa pinakakanang bahagi, tulad ng sa o Ang mga state na ito ay maaaring maging napakakumplikado agad, at ang bihirang halimbawang ito ay makakatulong na ipaliwanag kung bakit bihira nang isinusulat ang mga ganitong state nang tahasan.
Nagsisimula ang ating sistema sa state Hanggang sa unang barrier (isang puntong tinutukoy natin bilang ), ang ating mga state ay:
Ito ay dense encoding lamang, na nakita na natin noon. Ngayon pagkatapos ng CNOT gate, sa ikalawang barrier (), ang ating state ay
Ngayon ay ilalagay natin ang huling set ng mga single-qubit rotation at pagsamahin ang mga magkaparehong state upang makuha:
Malamang na masyadong kumplikado itong suriin. Sa halip, huminto muna at isipin kung ilang parameter ang na-load natin sa state: walo. Ngunit mayroon lamang tayong apat na computational basis state. Sa unang tingin, maaaring mukhang nag-load tayo ng mas maraming parameter kaysa sa makatuwiran, dahil ang final state ay maaaring isulat bilang . Tandaan, gayunpaman, na ang bawat prefactor ay complex! Isinulat tulad nito:
Makikita ng isa na mayroon nga tayong walong parameter sa state kung saan maaari nating i-encode ang ating walong feature.
Sa pamamagitan ng pagdaragdag ng bilang ng qubit at pagdaragdag ng bilang ng pag-uulit ng mga entangling at rotation layer, maaaring mag-encode ng mas maraming data. Ang pagsulat ng mga wave function ay mabilis na magiging hindi maisakatuparan. Ngunit makikita pa rin natin ang encoding sa aksyon.
Dito ay ine-encode natin ang data vector na may 12 feature, sa isang 3-qubit na efficient_su2 circuit, gamit ang bawat isa sa mga parameterized gate upang i-encode ang ibang feature.
Sa data vector na ito, ang mga feature ay ipinapakita sa isang partikular na pagkakasunod-sunod. Sa pangkalahatan, hindi mahalaga kung ine-encode ang mga ito sa pagkakasunod-sunod na ito o sa kabaligtaran. Ang mahalaga ay ang pagsubaybay nito at pagiging konsistente. Tandaan sa circuit diagram na ang efficient_su2 ay nagtatanggap ng isang tiyak na pagkakasunod-sunod ng encoding, partikular na pinupuno ang unang layer ng mga parameterized gate mula sa qubit 0 hanggang qubit 2, at pagkatapos ay pumunta sa susunod na layer. Ito ay hindi konsistente ni hindi rin hindi-konsistente sa little-endian notation, dahil dito ang mga data feature ay hindi maaaring maayos ayon sa qubit a priori, bago pa tukuyin ang isang encoding circuit.
x = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2]
circuit = efficient_su2(num_qubits=3, reps=1, insert_barriers=True)
encode = circuit.assign_parameters(x)
encode.decompose().draw(output="mpl")
Sa halip na dagdagan ang bilang ng qubit, maaari kang pumili na dagdagan ang bilang ng pag-uulit ng mga entangling at rotation layer. Ngunit may mga limitasyon sa kung gaano karaming pag-uulit ang kapaki-pakinabang. Tulad ng nabanggit kanina, may kapalit: ang mga circuit na may mas maraming qubit o mas maraming pag-uulit ng mga entangling at rotation layer ay maaaring mag-imbak ng mas maraming parameter, ngunit ginagawa ito nang may mas malaking lalim ng circuit. Babalik tayo sa mga lalim ng ilang built-in na feature map, sa ibaba. Ang susunod na ilang encoding method na built-in sa Qiskit ay may "feature map" bilang bahagi ng kanilang mga pangalan. Ulitin natin na ang pag-encode ng data sa isang quantum circuit ay isang feature mapping, sa kahulugang kinukuha nito ang data papunta sa bagong espasyo: ang Hilbert space ng mga qubit na kasangkot. Ang relasyon sa pagitan ng dimensionality ng orihinal na feature space at ng Hilbert space ay depende sa circuit na ginagamit mo para sa encoding.
feature map
Ang feature map (ZFM) ay maaaring bigyang-kahulugan bilang natural na extension ng phase encoding. Ang ZFM ay binubuo ng mga nahaliling layer ng single-qubit gate: mga Hadamard gate layer at mga phase gate layer. Hayaan ang data vector na magkaroon ng na feature. Ang quantum circuit na nagsasagawa ng feature mapping ay kinakatawan ng isang unitary operator na kumikilos sa initial state:
kung saan ang ay ang -qubit ground state. Ginagamit ang notation na ito para sa konsistensya sa sanggunian [4] Havlicek et al. Ang mga data feature na ay naka-map nang isa-isa sa mga katumbas na qubit. Halimbawa, kung mayroon kang 8 na feature sa isang data vector, gagamit ka ng 8 qubit. Ang ZFM circuit ay binubuo ng na pag-uulit ng isang subcircuit na binubuo ng mga Hadamard gate layer at phase gate layer. Ang isang Hadamard layer ay binubuo ng isang Hadamard gate na kumikilos sa bawat qubit sa isang -qubit register, , sa parehong yugto ng algorithm. Naaangkop din ang paglalarawang ito sa isang phase gate layer kung saan ang qubit ay kinikilos ng . Ang bawat gate ay may isang feature bilang argumento, ngunit ang phase gate layer ( ay isang function ng data vector. Ang buong ZFM circuit unitary na may isang pag-uulit ay:
Kung gayon ang na pag-uulit ng unitary na ito ay magiging
Ang mga data feature, , ay naka-map sa mga phase gate sa parehong paraan sa lahat ng na pag-uulit. Ang ZFM feature map state ay isang product state at mahusay para sa classical simulation[4].
Upang magsimula sa isang maliit na halimbawa, isang two-qubit ZFM circuit ang kinocode gamit ang Qiskit at iginuhit upang ipakita ang simpleng circuit structure. Sa halimbawa, isang pag-uulit, , ang isinasagawa kasama ang data vector . Tandaan na ito ay isinulat sa standard na pagkakasunod-sunod ng isang vector sa Python, ibig sabihin ang elemento ay Malaya tayong i-encode ang feature na ito sa ating qubit, o sa ating Muli, hindi palaging maaaring magkaroon ng isang 1:1 na pagmamapa mula sa pagkakasunod-sunod ng feature patungo sa pagkakasunod-sunod ng qubit, dahil ang iba't ibang feature map ay nag-e-encode ng iba't ibang bilang ng feature sa bawat qubit. Muli ang mahalaga ay alam natin kung saan naka-encode ang bawat feature. Kapag nagbibigay ng listahan ng parameter sa feature map, ine-encode nito ang feature 0 mula sa listahan sa least-significant qubit na may parameterized gate, tulad ng qubit 0. Kaya susunod tayo sa convention na iyon kapag ginagawa ito nang manu-mano. Ine-encode natin ang sa qubit, at sa qubit.
Ang ZFM circuit unitary operator ay kumikilos sa initial state sa sumusunod na paraan: