4. 量子态编码与数据嵌入
量子聚类算法的第一步,是把经典数据映射到量子态空间。这一步决定了后续量子线路能"看到"什么样的数据结构,也直接约束了可用的量子比特数、线路深度和测量方式。本章围绕四种主流编码方式——基态编码、振幅编码、角度编码和量子特征映射——讨论它们的数学形式、资源开销、工程实现要点,以及在聚类数据预处理中的取舍。
四种编码方式的定位
基态编码(Basis Encoding)把每个经典比特直接对应到一个量子比特的计算基态,例如整数 5 编码为 |101⟩。它本质上是把经典比特串"搬"到量子寄存器,不产生叠加,因此单次测量即可读出全部信息。优点是实现简单、无额外门开销;缺点是量子并行性完全没有被利用,只适合作为量子算术或量子随机存取存储器的地址输入。
振幅编码(Amplitude Encoding)把归一化后的经典向量 x 编码为量子态的振幅:|ψ⟩ = Σᵢ xᵢ|i⟩,要求 Σ|xᵢ|² = 1。n 个量子比特可以承载 2ⁿ 个振幅,因此存储效率极高——20 个量子比特理论上可编码约 100 万个特征分量。代价是制备线路通常很深,通用态制备需要 O(2ⁿ) 量级的门,且需要预先做 L2 归一化。在聚类任务中,振幅编码适合把高维样本向量整体送入量子态,配合 swap test 或距离估计线路计算样本间相似度。
角度编码(Angle Encoding)把每个特征映射为一个旋转角,作用在对应量子比特上:|ψ⟩ = ⊗ᵢ R_y(θᵢ)|0⟩,其中 θᵢ = xᵢ(或缩放后的 xᵢ)。它只使用单比特旋转门,线路深度为常数级,硬件友好,是当前含噪中等规模量子(NISQ)设备上最常用的编码。缺点是每个特征占用一个量子比特,特征维度等于所需比特数,且编码后各比特之间没有纠缠,表达能力受限。
量子特征映射(Quantum Feature Map)是角度编码的推广:先用角度编码把数据写入量子态,再通过纠缠门(如 CNOT、CZ)和重复的旋转层构造非线性映射,把数据嵌入到更高维的希尔伯特空间。典型形式为 U(x) = U_Φ(x) H^⊗n U_Φ(x) H^⊗n,其中 U_Φ(x) = exp(i Σ xⱼ Zⱼ) 或含 ZZ 相互作用项。特征映射决定了量子核 K(x, x') = |⟨φ(x)|φ(x')⟩|² 的形状,是量子核聚类性能的核心。
工程实现:从数据到量子态的完整链路
实际工程中,编码不是孤立的一步,而是嵌入在"标准化—降维—编码—线路执行"的流水线中。以下给出一个可复现的实现示例,使用 Qiskit 完成角度编码与振幅编码的对比。
import numpy as np
from qiskit import QuantumCircuit
from qiskit.circuit.library import ZZFeatureMap, RealAmplitudes
# 示例数据:3 个样本,4 维特征(已做 z-score 标准化)
X = np.array([
[ 0.82, -0.31, 1.05, -0.67],
[-0.54, 0.91, -0.22, 0.38],
[ 0.11, -0.75, 0.63, 0.94]
])
# --- 角度编码:每个特征一个 R_y 旋转 ---
def angle_encode(x):
qc = QuantumCircuit(len(x))
for i, val in enumerate(x):
qc.ry(val, i) # θ = x_i,直接使用标准化值
return qc
# --- 振幅编码:先 L2 归一化,再用 initialize ---
def amplitude_encode(x):
norm = np.linalg.norm(x)
if norm == 0:
raise ValueError("零向量无法振幅编码")
x_norm = x / norm
qc = QuantumCircuit(int(np.ceil(np.log2(len(x)))))
qc.initialize(x_norm, qc.qubits)
return qc
# --- 量子特征映射:ZZ 特征映射,重复 2 层 ---
def feature_map(x, reps=2):
fm = ZZFeatureMap(feature_dimension=len(x), reps=reps)
return fm.assign_parameters(x)
for idx, sample in enumerate(X):
qc_a = angle_encode(sample)
qc_b = amplitude_encode(sample)
qc_f = feature_map(sample)
print(f"样本 {idx}: 角度编码深度={qc_a.depth()}, "
f"振幅编码深度={qc_b.depth()}, 特征映射深度={qc_f.depth()}")
运行上述代码(示例参数,非实测结果)可观察到:角度编码深度为 1,振幅编码深度随维度增长而显著增加,ZZ 特征映射在 reps=2 时深度约为 10~15。在 4 维特征下,角度编码只需 4 个量子比特,振幅编码只需 2 个量子比特,但后者需要精确的态制备。若把维度扩展到 16,振幅编码仅需 4 个量子比特,而角度编码需要 16 个——这正是振幅编码在比特预算紧张时的价值所在。
编码选择的关键判断依据
选择编码方式时,需要同时考虑四个约束:比特预算、线路深度、表达能力和测量方式。若硬件比特数充足但相干时间短,优先角度编码;若特征维度极高且允许较深线路,振幅编码更合适;若聚类任务需要非线性决策边界,量子特征映射是必要选择,但需通过交叉验证控制 reps 层数,避免过拟合。
编码对聚类结果的影响
编码方式直接改变样本在希尔伯特空间中的距离度量。角度编码下,两个样本的量子态保真度为 Π cos²((xᵢ - x'ᵢ)/2),距离随特征差非线性变化;振幅编码下,保真度等于归一化向量的内积平方,与经典余弦相似度一致;量子特征映射则通过纠缠层引入高阶关联,使距离度量包含特征交叉项。在工程实践中,建议先用小规模数据(如 50~100 个样本)对比不同编码下的聚类轮廓系数,再决定最终方案。若角度编码与振幅编码的轮廓系数接近,优先选择角度编码以降低线路深度和噪声影响。
完成编码后,样本已表示为量子态,下一步即可送入量子聚类线路(如量子 k-means 的 swap test 距离估计、量子谱聚类或变分量子聚类器)。编码阶段留下的归一化参数、降维投影矩阵和比特映射关系需要完整记录,以便在测量结果解码时还原到原始特征空间。